import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'  # 设置日志级别为ERROR,以减少警告信息
# 禁用 Gemini 的底层库(gRPC 和 Abseil)在初始化日志警告
os.environ["GRPC_VERBOSITY"] = "ERROR"
os.environ["GLOG_minloglevel"] = "3"  # 0: INFO, 1: WARNING, 2: ERROR, 3: FATAL
os.environ["GLOG_minloglevel"] = "true"
import logging
import tensorflow as tf
tf.get_logger().setLevel(logging.ERROR)
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
!export TF_FORCE_GPU_ALLOW_GROWTH=true

初学者的 TensorFlow 2.0 教程#

在 TensorFlow.org 观看 在 Google Colab 中运行 在 GitHub 查看源代码 下载笔记本

设置 TensorFlow#

首先将 TensorFlow 导入到您的程序:

import tensorflow as tf

如果您在自己的开发环境而不是 Colab 中操作,请参阅设置 TensorFlow 以进行开发的安装指南

注:如果您使用自己的开发环境,请确保您已升级到最新的 pip 以安装 TensorFlow 2 软件包。有关详情,请参阅安装指南

加载数据集#

加载并准备 MNIST 数据集。图像的像素值范围从 0 到 255。通过将值除以 255.0 来将这些值缩放到 0 到 1 的范围。这还会将样本数据从整数转换为浮点数:

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

构建机器学习模型#

构建 tf.keras.Sequential 模型:

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10)
])

Sequential 对于堆叠层很有用,其中每层都有输入张量和输出张量。层是具有已知数学结构的函数,可以重复使用并具有可训练的变量。大多数 TensorFlow 模型都由层组成。此模型使用 FlattenDenseDropout 层。

对于每个样本,模型都会返回包含 logitslog-odds 分数的向量,每个类一个。

predictions = model(x_train[:1]).numpy()
predictions
array([[-0.29356095, -0.18187018, -0.09060116,  0.02143997,  0.24739322,
         0.02414675, -0.34286305,  0.02412909,  0.39885187,  0.39236996]],
      dtype=float32)

tensorflow.nn.softmax() 函数将这些 logits 转换为每个类的概率

tf.nn.softmax(predictions).numpy()
array([[0.07084628, 0.07921798, 0.08678835, 0.09707788, 0.12168877,
        0.09734099, 0.06743812, 0.09733927, 0.14158855, 0.14067376]],
      dtype=float32)

注:可以将 tensorflow.nn.softmax() 烘焙到网络最后一层的激活函数中。虽然这可以使模型输出更易解释,但不建议使用这种方式,因为在使用 softmax 输出时不可能为所有模型提供精确且数值稳定的损失计算。

使用 SparseCategoricalCrossentropy 定义训练的损失函数:

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

损失函数采用真实值向量和逻辑向量,并返回每个样本的标量损失。此损失等于真实类的负对数概率:如果模型确定类正确,则损失为零。

这个未经训练的模型给出的概率接近随机(每个类为 1/10),因此初始损失应该接近 -tf.math.log(1/10) ~= 2.3

loss_fn(y_train[:1], predictions).numpy()
2.329535

在开始训练之前,使用 Keras compile() 配置和编译模型。将 optimizer 类设置为 adam,将 loss 设置为您之前定义的 loss_fn 函数,并通过将 metrics 参数设置为 accuracy 来指定要为模型评估的指标。

model.compile(optimizer='adam',
              loss=loss_fn,
              metrics=['accuracy'])

训练并评估模型#

使用 Model.fit 方法调整您的模型参数并最小化损失:

model.fit(x_train, y_train, epochs=5)
Epoch 1/5
  78/1875 ━━━━━━━━━━━━━━━━━━━━ 3s 2ms/step - accuracy: 0.5239 - loss: 1.5746
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 7s 2ms/step - accuracy: 0.8585 - loss: 0.4892
Epoch 2/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9557 - loss: 0.1527
Epoch 3/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9675 - loss: 0.1089
Epoch 4/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9736 - loss: 0.0847
Epoch 5/5
1875/1875 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.9762 - loss: 0.0727
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1729733723.232793 3171586 service.cc:146] XLA service 0x7f3d74006ef0 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:
I0000 00:00:1729733723.232815 3171586 service.cc:154]   StreamExecutor device (0): NVIDIA GeForce RTX 3090, Compute Capability 8.6
I0000 00:00:1729733723.232833 3171586 service.cc:154]   StreamExecutor device (1): NVIDIA GeForce RTX 2080 Ti, Compute Capability 7.5
I0000 00:00:1729733725.890061 3171586 device_compiler.h:188] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.
<keras.src.callbacks.history.History at 0x7f40f4d03710>

Model.evaluate 方法会检查模型的性能(通常是在验证集测试集上)。

model.evaluate(x_test,  y_test, verbose=2)
313/313 - 2s - 8ms/step - accuracy: 0.9769 - loss: 0.0729
[0.07293855398893356, 0.9768999814987183]

现在,这个照片分类器的准确度已经达到 98%。想要了解更多,请阅读 TensorFlow 教程

如果您想让模型返回概率,可以封装经过训练的模型,并将 softmax 附加到该模型:

probability_model = tf.keras.Sequential([
  model,
  tf.keras.layers.Softmax()
])
probability_model(x_test[:5])
<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[5.70330599e-07, 1.30929301e-09, 3.31053479e-06, 6.53220995e-05,
        5.35139099e-13, 1.03895630e-07, 7.61280822e-14, 9.99930143e-01,
        1.48227429e-07, 3.17864817e-07],
       [2.60567834e-08, 1.02092403e-04, 9.99895215e-01, 2.47421417e-06,
        2.45008007e-14, 1.18589675e-07, 7.92316790e-09, 1.31756047e-11,
        1.22220749e-08, 6.07167094e-13],
       [7.65437704e-08, 9.98419642e-01, 1.11594715e-03, 8.62039724e-06,
        1.14041950e-05, 3.91538015e-06, 4.68364533e-07, 3.88111861e-04,
        4.93279695e-05, 2.40418944e-06],
       [9.99776661e-01, 5.56393265e-10, 1.60305080e-05, 3.42057410e-06,
        1.33386193e-05, 5.57819885e-06, 1.63603676e-04, 1.89078055e-05,
        5.46506328e-07, 1.99484361e-06],
       [3.93524680e-08, 6.11409900e-09, 1.89196712e-07, 8.14441758e-09,
        9.99578297e-01, 1.13444706e-07, 4.50963626e-06, 2.70816599e-06,
        2.53426805e-07, 4.13792412e-04]], dtype=float32)>

结论#

恭喜!您已经利用 Keras API 借助预构建数据集训练了一个机器学习模型。

有关使用 Keras 的更多示例,请查阅教程。要详细了解如何使用 Keras 构建模型,请阅读指南。如果您想详细了解如何加载和准备数据,请参阅有关图像数据加载CSV 数据加载的教程。