人工智能领域中的第一行入门代码:人工智能的Hello World
@TOC
前言
刚进公司,需要学开发需要的新框架及现成框架,完成自己的需求。那么在此期间,遇到新东西,就可以以此为基础,学习新语言新框架新工具…,可能会学到一些新技术、新知识,总结一下,以供后面参考学习,查看。肯定大家都有一定差异啦,大家作为参考哦,与诸君共勉。
一、问题:将手写数字的灰度图像(28像素×28像素)划分到10个类别中(从0到9)。
1. 加载Keras中的MNIST数据集
- 我们将使用MNIST数据集,它是机器学习领域的一个经典数据集,其历史几乎和这个领域一样长,而且已被人们深入研究。这个数据集包含60 000张训练图像和10 000张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即MNIST中的NIST)在20世纪80年代收集而成。你可以将“解决”MNIST问题看作深度学习的“Hello World”,用来验证你的算法正在按预期运行。
1
2
3
4
5//加载Keras中的MNIST数据集
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
//train_images和train_labels组成了训练集,模型将从这些数据中进行学习。然后,我们在测试集(包括test_images和test_labels)上对模型进行测试。
//图像被编码为NumPy数组,而标签是一个数字数组,取值范围是0~9。图像和标签一一对应。 - 张量train_images的轴的个数,即ndim属性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17>>> train_images.ndim
3
//它的形状。
>>> train_images.shape
(60000, 28, 28)
//它的数据类型,即dtype属性。
>>> train_images.dtype
uint8
- 可见,train_images是一个由8位整数组成的3阶张量。更确切地说,它是由60 000个矩阵组成的数组,每个矩阵由28×28个整数组成。每个这样的矩阵都是一张灰度图像,元素取值在0和255之间。我们用Matplotlib库(著名的Python数据可视化库,预装在Colab中)来显示这个3阶张量中的第4个数字。
//总结:
输入数据。
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype("float32") / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype("float32") / 255
//现在你明白,输入图像保存在float32类型的NumPy张量中,其形状分别为(60000, 784)(训练数据)和(10000, 784)(测试数据)。
2.训练数据:
1 | |
工作流程如下:
- 首先,将训练数据(train_images和train_labels)输入神经网络;
- 然后,神经网络学习将图像和标签关联在一起;
- 最后,神经网络对test_images进行预测,我们来验证这些预测与test_labels中的标签是否匹配。
3.模型与模型编译。神经网络架构-Tensorflow。【模型由许多层链接在一起组成,并将输入数据映射为预测值。随后,损失函数将这些预测值与目标值进行比较,得到一个损失值,用于衡量模型预测值与预期结果之间的匹配程度。优化器将利用这个损失值来更新模型权重。】
1 | |
- 神经网络的核心组件是层(layer)。你可以将层看成数据过滤器:进去一些数据,出来的数据变得更加有用。具体来说,层从输入数据中提取表示——我们期望这种表示有助于解决手头的问题。大多数深度学习工作涉及将简单的层链接起来,从而实现渐进式的数据蒸馏(data distillation)。
- 深度学习模型就像是处理数据的筛子,包含一系列越来越精细的数据过滤器(也就是层)。
- 在训练模型之前,我们还需要指定编译(compilation)步骤的3个参数。
- 优化器(optimizer):模型基于训练数据来自我更新的机制,其目的是提高模型性能。
- 损失函数(loss function):模型如何衡量在训练数据上的性能,从而引导自己朝着正确的方向前进。
- 在训练和测试过程中需要监控的指标(metric):本例只关心精度(accuracy),即正确分类的图像所占比例。
1
2
3
4
5//编译步骤
model.compile(optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
//在开始训练之前,我们先对数据进行预处理,将其变换为模型要求的形状,并缩放到所有值都在[0, 1]区间。前面提到过,训练图像保存在一个uint8类型的数组中,其形状为(60000, 28, 28),取值区间为[0, 255]。我们将把它变换为一个float32数组,其形状为(60000, 28 * 28),取值范围是[0, 1]。
- 准备图像数据
1
2
3
4train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype("float32") / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype("float32") / 255 - 准备开始训练模型。在Keras中,这一步是通过调用模型的fit方法来完成的——我们在训练数据上拟合(fit)模型
1
2
3
4
5>>> model.fit(train_images, train_labels, epochs=5, batch_size=128)
Epoch 1/5
60000/60000 [===========================] - 5s - loss: 0.2524 - acc: 0.9273
Epoch 2/5
51328/60000 [=====================>.....] - ETA: 1s - loss: 0.1035 - acc: 0.9692- 训练过程中显示了两个数字:
- 一个是模型在训练数据上的损失值(loss),
- 另一个是模型在训练数据上的精度(acc)。我们很快就在训练数据上达到了0.989(98.9%)的精度。
- 训练过程中显示了两个数字:
4.利用模型进行预测
- 现在我们得到了一个训练好的模型,可以利用它来预测新数字图像的类别概率。这些新数字图像不属于训练数据,比如可以是测试集中的数据。
1
2
3
4
5
6
7
8//利用模型进行预测
>>> test_digits = test_images[0:10]
>>> predictions = model.predict(test_digits)
>>> predictions[0]
array([1.0726176e-10, 1.6918376e-10, 6.1314843e-08, 8.4106023e-06,
2.9967067e-11, 3.0331331e-09, 8.3651971e-14, 9.9999106e-01,
2.6657624e-08, 3.8127661e-07], dtype=float32)
这个数组中每个索引为i的数字对应数字图像test_digits[0]属于类别i的概率。 - 第一个测试数字在索引为7时的概率最大(0.99999106,几乎等于1),所以根据我们的模型,这个数字一定是7。
1
2
3
4
5
6
7
8>>> predictions[0].argmax()
7
>>> predictions[0][7]
0.99999106
//我们可以检查测试标签是否与之一致:
>>> test_labels[0]
7
//平均而言,我们的模型对这种前所未见的数字图像进行分类的效果如何?我们来计算在整个测试集上的平均精度.
5.在新数据上评估模型
1 | |
6.用TensorFlow从头开始逐步重新实现
1 | |
巨人的肩膀
- 周志明老师的凤凰架构
- AIGC:智能创作时代
- Python深度学习
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.


