
如果 用 tensorflow 来搭建神经网络,我们还需要下一些功夫,而使用keras 我们就省心了,提供高级的 API 供我们使用来搭建神经网络。
keras 在不就之前也走进了谷歌的大门,keras 也被整合到 tensorflow 方便我们使用。
定义模型样子
import tensorflow as tf
mnist = tf.keras.datasets.mnist # 28 x 28 images of hand-written digits 0-9
#### 可视化数据
通过 keras.datasets 导入手写数字集,用于我们学习如何搭建神经网络来识别图中数字
import matplotlib.pyplot as plt
plt.imshow(x_train[0])
print(x_train[0])
使用 matplotlib 库可以将数据可视化,让我们更加直观地了解图片数据到底是什么。

图片就这样显示出来,识别图片中的数字颜色的(也就是带有 RGB 通道)的图片并没有什么帮助,可以根据需要去色后进行分析。
去色处理
plt.imshow(x_train[0],cmap=plt.cm.binary)

对数据进行缩放
x_train = tf.keras.utils.normalize(x_train,axis = 1)
x_test = tf.keras.utils.normalize(x_test, axis = 1)
我们可以对数据通过处理将数据映射到 1 - 0 区间,这样更便于处理。
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. ]
[0. 0. 0. 0. 0.37491383 0.56222061
0.66525569 0.63253163 0.48748768 0.45852825 0.43408872 0.359873
0.17428513 0.01425695 0.

开始搭建我们神经网络,
model = tf.keras.models.Sequential()
这里我们使用 Sequential 创建顺序执行执行神经网络。
# add layer first layer is input layer
model.add(tf.keras.layers.Flatten())
首先将多维数据压缩为一维数据,作为输入数据。Dense 表示一个全连接的层,这也就是我们要添加一个输出 128 的全连接层。然后activation 可以指定激活函数。
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128,activation=tf.nn.relu))
添加两个神经层,因为每一层输入都是 128 而且激活函数使用简单的 relu,relu 相比其他激活函数计算简单。
model.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax))
接下来评价我们模型,可以指定 loss 函数类型,训练模型就是找到最合适方程,可以在 optimizer 指定找到最合适函数的方式。
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(x_train,y_train,epochs=3)
开始训练,第一个参数为训练集,y_train 为期望值,x_train 是二维数组,一维是训练集样本数量,第二个维度是图片大小,28 * 28 = 784。对于 y_train 的第一个维度就是样本的数量,第二个就是 10 维,因为我们图片是分为 10 类。

其实这里还有参数batch_size 指定数量,这样 keras 是根据 batch_size 将数据进行划分,然后在 batch_size 计算出 loss 函数得到然后根据 loss 函数结构调整一次参数依次类推,每一个 batch 都会根据loss 函数来更新参数


然后每完成一次所有 batch 运算就算为 epoch
Epoch 1/3
60000/60000 [==============================] - 4s 64us/sample - loss: 0.2680 - acc: 0.9214
Epoch 2/3
60000/60000 [==============================] - 4s 62us/sample - loss: 0.1091 - acc: 0.9660
Epoch 3/3
60000/60000 [==============================] - 4s 62us/sample - loss: 0.0736 - acc: 0.9768
val_loss, val_acc = model.evaluate(x_test,y_test)
print(val_loss,val_acc)
输出一个 loss
(0.11153460214892402, 0.9629)
然后就可以检查一下我们训练成果了,我们可以将训练好模型保存起来,以便以后可以无需重复训练通过加载训练好的模型,来进行图形识别。
model.save('epic_num_reader.model')
new_model = tf.keras.models.load_model('epic_num_reader.model')
predictions = new_model.predict([x_test])
print(predictions)
从结果来看我们训练出的模型可以满足我们需要,模型已经成功根据图片
7
通过我们测试模型现在已经可以识别出数字 7
网友评论