## Keras实战

```import numpy as np
# 总人数是1000, 一半是男生
n = 1000
# 所有的身体指标数据都是标准化数据, 平均值0, 标准差1
tizhong = np.random.normal(size = n)
shengao = np.random.normal(size=n)
nianling = np.random.normal(size=n)
# 性别数据, 前500名学生是男生, 用数字1表示
gender = np.zeros(n)
gender[:500] = 1
# 男生的体重比较重,所以让男生的体重+1
tizhong[:500] += 1
# 男生的身高比较高, 所以让男生的升高 + 1
shengao[:500] += 1
# 男生的年龄偏小, 所以让男生年龄降低 1
nianling[:500] -= 1```

#### 创建模型

```model = Sequential()
# 只有一个神经元, 三个输入数值
# 激活函数使用softmax
# 添加输出层
# 激活函数使用softmax

#### 编译模型

```model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])```

#### 训练模型

```# 转换成one-hot格式
from keras import utils
gender_one_hot = utils.to_categorical(gender, num_classes=2)
# 身体指标都放入一个矩阵data
data = np.array([tizhong, shengao, nianling]).T
# 训练模型
model.fit(data, gender_one_hot, epochs=10, batch_size=8)```

```输出(stream):
Epoch 1/10
1000/1000 [==============================] - 0s 235us/step - loss: 0.6743 - acc: 0.7180
Epoch 2/10
1000/1000 [==============================] - 0s 86us/step - loss: 0.6162 - acc: 0.7310
Epoch 3/10
1000/1000 [==============================] - 0s 88us/step - loss: 0.5592 - acc: 0.7570
Epoch 4/10
1000/1000 [==============================] - 0s 87us/step - loss: 0.5162 - acc: 0.7680
Epoch 5/10
1000/1000 [==============================] - 0s 89us/step - loss: 0.4867 - acc: 0.7770
Epoch 6/10
1000/1000 [==============================] - 0s 88us/step - loss: 0.4663 - acc: 0.7830
Epoch 7/10
1000/1000 [==============================] - 0s 87us/step - loss: 0.4539 - acc: 0.7890
Epoch 8/10
1000/1000 [==============================] - 0s 86us/step - loss: 0.4469 - acc: 0.7920
Epoch 9/10
1000/1000 [==============================] - 0s 88us/step - loss: 0.4431 - acc: 0.7940
Epoch 10/10
1000/1000 [==============================] - 0s 88us/step - loss: 0.4407 - acc: 0.7900

#### 进行预测

```test_data = np.array([[0, 0, 0]])
probability = model.predict(test_data)
if probability[0, 0]>0.5:
print('女生')
else:
print('男生')```

```输出(stream):

#### 关键词解释

input_dim: 输入的维度数
kernel_initializer: 数值初始化方法, 通常是正太分布
batch_size: 一次训练中, 样本数据被分割成多个小份, 每一小份包含的样本数叫做batch_size
epochs: 如果说将所有数据训练一次叫做一轮的话。epochs决定了总共进行几轮训练。
optimizer: 优化器, 可以理解为求梯度的方法
loss: 损失函数, 可以理解为用于衡量估计值和观察值之间的差距, 差距越小, loss越小
metrics: 类似loss, 只是metrics不参与梯度计算, 只是一个衡量算法准确性的指标, 分类模型就用accuracy