跳至主要內容

〔TensorFlow〕初学者教程

大林鸱大约 5 分钟深度学习计算机视觉自然语言处理

前面几个章节我们已经了解了 TensorFlow 的基本情况,包括数据类型、张量和数据集,按照 TensorFlow 网站的教程,我觉得我们可以试一试初学者的 TensorFlow 2.0 教程open in new window

这篇教程会大体上带领我们了解 TensorFlow 的训练流程,至于训练完成之后的模型怎么用,我们已经从总体架构图中有了一定了解,具体的后续再学习。

操作流程

  • 加载一个预构建的数据集。
  • 构建对图像进行分类的神经网络机器学习模型。
  • 训练此神经网络。
  • 评估模型的准确率。

官网上的案例是使用 Google Colaboratory,咱用不了,所以用 vscode 就好了。我把下面几段代码汇总成一个 python 脚本文件,运行之后,结果让我一脸懵,它不像学习其他语言一样,输出“hello world”,接下来我们一点一点看。我会把自己的理解放在注释上。

提示

建议在 vscode 上安装 Jupyter 扩展插件。

设置 TensorFlow

import tensorflow as tf

加载 MNIST 数据集

#上一章节已经学过了
mnist = tf.keras.datasets.mnist

#从网络上下载训练和测试数据集。
#load_data方法有一个参数path,默认值mnist.npz,这个参数可以满足你使用本地数据集的需求
(x_train, y_train), (x_test, y_test) = mnist.load_data()
#除255操作应该是对像素值进行归一化,同时将样本数据从整数转换为浮点数
x_train, x_test = x_train / 255.0, x_test / 255.0

说明

x_trainuint8 NumPy 具有形状的灰度图像(也就是黑白图像)数据阵列(60000,28,28),包含训练数据。像素值范围从 0 到 255。

y_trainuint8NumPy 数字标签数组(0-9 范围内的整数)具有用于训练数据的形状“(60000,)”。

x_test uint8NumPy 带形状的灰度图像数据数组(10000,28,28),包含测试数据。像素值范围从 0 到 255。

y_test uint8NumPy 数字标签数组(0-9 范围内的整数)测试数据的形状为“(10000,)”。

构建机器学习模型

#通过堆叠层来构建 tf.keras.Sequential 模型。
#Sequential方法是一个层的堆叠模型,描述了神经网络的网络结构,在Sequential的输入参数中描述从输入层到输出层的网络结构
#Sequential方法的参数是tf.keras.layers,可参见《https://tensorflow.google.cn/api_docs/python/tf/keras/layers》
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)), #拉直层,可以变换张量的尺寸,把输入特征拉直为一维数组,是不含计算参数的层
    tf.keras.layers.Dense(128, activation='relu'), #全连接层,128是神经元个数,activation是激活函数
    tf.keras.layers.Dropout(0.2),#最简单的神经网络正则化方法,用于减少过度拟合
    tf.keras.layers.Dense(10)
])

#对于每个样本,模型都会返回一个包含 logits 或 log-odds 分数的向量,每个类一个。
predictions = model(x_train[:1]).numpy()
predictions
#array([[-0.36261755,  0.65955025, -0.48806044,  0.21538146, -0.59230345,
#      -0.3613634 , -1.0281645 , -0.25402403, -0.62377644,  0.19273753]],
#      dtype=float32)
#结果是长度为10的向量,表示训练样本中共10个分类

#tf.nn.softmax 函数将这些 logits 转换为每个类的概率
tf.nn.softmax(predictions).numpy()
#array([[0.10779232, 0.09024227, 0.08136187, 0.09109359, 0.09646888,
#        0.0967437 , 0.074437  , 0.17218398, 0.09146855, 0.09820786]],
#      dtype=float32)

#使用 losses.SparseCategoricalCrossentropy 为训练定义损失函数,它会接受 logits 向量和 True 索引,并为每个样本返回一个标量损失。
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

#此损失等于 true 类的负对数概率:如果模型确定类正确,则损失为零。
#这个未经训练的模型给出的概率接近随机(每个类为 1/10),因此初始损失应该接近 -tf.math.log(1/10) ~= 2.3。
loss_fn(y_train[:1], predictions).numpy()

#在开始训练之前,使用 Keras Model.compile 配置和编译模型。将 optimizer 类设置为 adam,将 loss 设置为您之前定义的 loss_fn 函数,并通过将 metrics 参数设置为 accuracy 来指定要为模型评估的指标。
model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])
#优化器(optimizer)、损失函数(loss function) 、评价指标(metrics)。

训练并评估模型

#使用 Model.fit 方法调整您的模型参数并最小化损失
#为了获得性能良好的神经网络,网络定型过程中需要进行许多关于所用设置(超参数)的决策。超参数之一是定型周期(epoch)的数量.
#epochs被定义为向前和向后传播中所有批次的单次训练迭代。这意味着1个epoch是整个输入数据的单次向前和向后传递。简单说,epochs指的就是训练过程中数据将被“轮”多少次。 亦即应当完整遍历数据集多少次(一次为一个epoch)。
#如果epoch数量太少,网络有可能发生欠拟合(即对于定型数据的学习不够充分);如果epoch数量太多,则有可能发生过拟合(即网络对定型数据中的“噪声”而非信号拟合)。
model.fit(x_train, y_train, epochs=5)

#Model.evaluate 方法通常在 "Validation-set" 或 "Test-set" 上检查模型性能。
#verbose 参数可给定 3 个数值,分别为 0、1、2。其中 0 表示不展示,1 表示展示进度条,2 表示直接展示结果。
model.evaluate(x_test,  y_test, verbose=2)

#至此,模型的训练和评估已经完成了
#如果您想让模型返回概率,可以封装经过训练的模型,并将 softmax 附加到该模型:
probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])
probability_model(x_test[:5])

总结

虽然有一些步骤不明所以,但是还是将整个过程调试了一遍。脚本的最后并没有保存模型,会在下一章节中学习如何保存和恢复模型。

上次编辑于: