本文阅读预计用时:15分钟
主要阐述如何基于Mnist数据集在Tensorflow2中搭建神经网络
这个专栏主要对64位mac上的Tensorflow2.2的使用进行探索。在本专栏的第一篇文章中,笔者列举了几个对于Tensorflow使用者而言比较清晰的学习网站,有兴趣的学习者可以去自行探索。不同角度学习Tensorflow的途径还有很多,笔者在此就不一一详述。
- 引语
如果我们想要用Tensorflow2去构造神经网络分析Mnist数据集中的数据,那么我们需要做到以下几个步骤:准备数据集、建立和评估模型。笔者会分两个部分对阐述如何用Tensorflow2去构造神经网络,即数据集和模型。这一篇文章中主要阐述如何用已经处理好的数据去搭建神经网络。而如何准备数据集以及如何去处理数据已经在上一篇文章中做过详细解读。
Fullmoon-Long:探索Tensorflow2中神经网络算法——基于Mnist数据集(一)1 赞同 · 0 评论文章正在上传…重新上传取消
- 深入
在keras中建立一个模型,整个过程可分为一下步骤:
- 创建Sequential模型
- 构造所需要的神经层
- 编译模型训练结构
- 优化模型
- 模型预测
1.1.1 模型构建
在 keras 中,我们可以通过组合层keras.layers来构建模型,直接堆叠各个层。
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10)
])
如果我们使用下述代码对我们的model进行解读
model.summary()
我们可以看到这个模型具有三层layers,第一层是将数据压平,第二、三层是全连接层,以及所有的训练参数数目。
1.1.2 模型编译
编译模型过程即是加入参数或进行模型内部设置,例如用keras设置优化器、损失函数,以及模型评估参数等。
tf.keras.Model.compile 采用三个重要参数:
- optimizer:此对象会指定训练过程。从 tf.train 模块向其传递优化器实例,例如 AdamOptimizer、RMSPropOptimizer 或 GradientDescentOptimizer。
- loss:要在优化期间最小化的函数。常见选择包括 mse、categorical_crossentropy 和 binary_crossentropy。损失函数由名称或通过从 tf.keras.losses 模块传递可调用对象来指定。
- metrics:用于监控训练。它们是 tf.keras.metrics 模块中的字符串名称或可调用对象。
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
在这个神经网络中,我们用adam(adaptive moment estimation)对优化器进行更新,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率,并且根据交叉熵损失函数去进行优化。
1.2 训练模型
训练模型时需要用model.fit指定训练数据(包括数据特征和数据标签),并且用epoch指定训练轮数。最后,我们可以通过accuracy得出训练后模型的准确度。
model.fit(train_images, train_labels, epochs=10)
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
模型训练后的效果如上,模型对于train set识别的平均准确率已经达到了97.69%。虽然在一定程度有过拟合的效果,但是单从模型训练的角度出发,这个准确率已经蛮不错了。
1.3.1 单个数据的模型预测
在用train set训练好模型之后,我们需要用test set去测试模型的识别效果
probability_model = tf.keras.Sequential([model,
tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)
predictions[0]
print('The prediction is',np.argmax(predictions[0]))
print('The correct label is',test_labels[0])
用训练好的模型尝试识别train set中第一个数据,准确无误。
将下述代码中的x替换为其他编号的数据,我们可以得到更多的数据预测结果。
predictions[x]
print('The prediction is',np.argmax(predictions[x]))
print('The correct label is',test_labels[x])
1.3.2 多组数据的模型预测
def plot_image(i, predictions_array, true_label, img):
predictions_array, true_label, img = predictions_array, true_label[i], img[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])
plt.imshow(img, cmap=plt.cm.binary)
predicted_label = np.argmax(predictions_array)
if predicted_label == true_label:
color = 'blue'
else:
color = 'red'
plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
100*np.max(predictions_array),
class_names[true_label]),
color=color)
def plot_value_array(i, predictions_array, true_label):
predictions_array, true_label = predictions_array, true_label[i]
plt.grid(False)
plt.xticks(range(10))
plt.yticks([])
thisplot = plt.bar(range(10), predictions_array, color="#777777")
plt.ylim([0, 1])
predicted_label = np.argmax(predictions_array)
thisplot[predicted_label].set_color('red')
thisplot[true_label].set_color('blue')
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
plt.subplot(num_rows, 2*num_cols, 2*i+1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(num_rows, 2*num_cols, 2*i+2)
plot_value_array(i, predictions[i], test_labels)
plt.tight_layout()
plt.show()
为了解读模型对于一组数据的预测,我们可以将这个结果进行可视化,查看训练后模型对于数字的识别效果和准确率。(可以看出模型的识别功能蛮不错的,尤其是对于那个数字5)
- 结语
基于上一篇文章处理数据的基础,这篇文章讲解了基于Mnist数据集在Tensorflow2中搭建神经网络的步骤后续。透过两篇文章,我们了解了如何在mac系统下准备数据集和用Tensorflow2对数据进行处理,进而完成在Tensorflow2中搭建神经网络。
完整代码已放入我的github repository file:
PS:鄙人不才,欢迎各位大佬指正!如果觉得本篇本章对您有所帮助,欢迎关注、评论、赞!
参考网址:
Basic classification: Classify images of clothing | TensorFlow Core