大家好,今天我们学习【马上学tensorflow 2.0】之 “Hello, World”初识神经网络。
我们 马上学三点 ,
- 完整神经网络代码
- 详细训练步骤
- 训练效果
大家可以点击下面的“ 了解更多 ”,或搜索“ 马上学123 ”,在线观看PPT讲义。
开始“Hello, World”
这一节, 我们使用一个例子认识神经网络, 如果其中某些步骤看起来像魔法一样, 你可以不用管, 下一节会详细解释这个例子中的每个步骤。
我们这里要解决的问题是, 将手写数字的灰度图像(28 像素×28 像素), 划分到 10 个类别中(0~9)。
我们将使用 MNIST 数据集, 它是机器学习领域的一个经典数据集, 其历史几乎和这个领域一样长, 解决MNIST问题看作深度学习的“Hello World”,
MNIST数据集包含 60000 张训练图像和 10000 张测试图像, 如图是它的一些样本:
项目的完整代码
这是本节项目的完整代码, 我们接下来会介绍详细步骤。
import tensorflow as tfmnist = tf.keras.datasets.mnist(train_images , train_labels), (test_images, test_labels) = mnist.load_data()train_images, test_images = train_images / 255.0, test_images / 255.0model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10, activation='softmax')])model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])model.fit(train_images, train_labels, epochs=5)model.evaluate(test_images, test_labels)
加载MNIST数据集
import tensorflow as tfmnist = tf.keras.datasets.mnist(train_images , train_labels), (test_images, test_labels) = mnist.load_data()train_images, test_images = train_images / 255.0, test_images / 255.0
train_images 和 train_labels 组成了训练集, 模型将从这些数据中进行学习。 然后在测试集(即 test_images 和 test_labels)上 对模型进行测试。
我们梳理一下工作流程: 首先,将训练数据(train_images 和 train_labels) 输入神经网络; 其次,网络学习将图像和标签关联在一起; 最后,网络对 test_images 生成预测, 而我们将验证这些预测与 test_labels 中的标签是否匹配。
在开始训练之前, 我们将对数据进行预处理, 将其变换为网络要求的形状, 并缩放到所有值都在 [0, 1] 区间。
train_images, test_images = train_images / 255.0, test_images / 255.0
构建网络
下面我们来构建网络,
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
神经网络的核心组件是层(layer), 它是一种数据处理模块,你可以将它看成数据过滤器。 进去一些数据,出来的数据变得更加有用。
深度学习模型就像是数据处理的筛子, 包含一系列越来越精细的数据过滤器(即层)。
本例中的网络包含2个 Dense 层, 它们是密集连接(也叫全连接)的神经层。
最后一层是一个10路softmax 层, 它将返回一个由 10个概率值组成的数组。 每个概率值表示当前数字图像 属于10个数字类别中某一个的概率。
编译模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
要想训练网络, 我们还需要选择编译(compile)步骤的三个参数。
- 损失函数(loss function): 网络如何衡量在训练数据上的性能, 即网络如何朝着正确的方向前进。
- 优化器(optimizer): 基于训练数据和损失函数来更新网络的机制。
- 在训练和测试过程中需要监控的指标(metric): 本例只关心精度,即正确分类的图像所占的比例。
后续会详细解释损失函数和优化器的确切用途。
开始训练网络
准备开始训练网络, 我们在训练数据上拟合(fit)模型。
model.fit(train_images, train_labels, epochs=5)
训练过程中显示了两个数字:
- 一个是网络在训练数据上的损失(loss),
- 另一个是网络在训练数据上的精度(acc)。
我们很快就在训练数据上达到了很高的精度。
测试集验证性能
现在我们来检查一下模型在测试集上的性能:
model.evaluate(test_images, test_labels)
测试集精度比训练集精度低不少, 训练精度和测试精度之间的这种差距是过拟合造成的。 过拟合是指机器学习模型 在新数据上的性能往往比在训练数据上要差,我们后续会重点讲。
第一个例子到这里就结束了, 你刚刚看到了如何构建和训练一个神经网络, 用不到 20 行的Python 代码对手写数字进行分类。
后续我们会详细介绍这个例子中的每一个步骤, 并讲解其背后的原理。
总结:
我们通过一个完整的MNIST项目, 讲解了训练模型的完整步骤, 导入数据,预处理数据, 创建模型,训练模型,测试模型。
这里讲了三点,关键词有哪几个?
提问,tensorflow和keras是什么关系?
欢迎回复评论!
马上学,很简单!