0. 写在前面
本教程内容与Tensorflow 2 官方教程没什么区别,区别大概就是作者做了个翻译然后加了点自己的理解粑,也就是将官方教程——
1. 最简单的教程
这个简短的教程将教会你:
- 创建一个用于图像分类的神经网络
- 训练这个神经网络
- 评估模型的准确度
首先导入TensorFlow:
import tensorflow as tf
载入MNIST数据集,并查看数据集的基本信息:
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(type(x_train)) # <class 'numpy.ndarray'>
print(x_train.shape) # (60000, 28, 28)
print(y_train.shape) # (60000,)
print(x_test.shape) # (10000, 28, 28)
print(y_test.shape) # (10000,)
print(x_train.min(), x_train.max()) # 0 255
print(y_train.min(), y_train.max()) # 0 9
print(x_test.min(), x_test.max()) # 0 255
print(y_test.min(), y_test.max()) # 0 9
将样本数据从整数转换成0~1的小数:
x_train, x_test = x_train / 255.0, x_test / 255.0
将各个层堆叠起来创建Sequential模型:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation="relu"),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10),
])
通过模型预测一个样本:
sample = x_train[:1]
sample.shape
''' (1, 28, 28) '''
predictions = model(sample)
predictions
'''
<tf.Tensor: shape=(1, 10), dtype=float32, numpy=
array([[ 0.0655466 , 0.5331823 , -0.3338868 , 0.28012255, -0.313728 ,
-0.5673277 , -0.19933444, 0.16807592, -0.21235606, -0.33416414]],
dtype=float32)>
'''
使用softmax函数将其转换为概率值(0~1):
tf.nn.softmax(predictions)
'''
<tf.Tensor: shape=(1, 10), dtype=float32, numpy=
array([[0.11080548, 0.17686947, 0.07431723, 0.13732526, 0.07583057,
0.05884471, 0.08502074, 0.12276912, 0.08392081, 0.07429662]],
dtype=float32)>
'''
为了验证其是不是概率,进行求和,看看是否等于1:
prob = tf.nn.softmax(predictions)
tf.reduce_sum(prob)
''' <tf.Tensor: shape=(), dtype=float32, numpy=1.0> '''
注:理论上来说可以把softmax作为最后一层的激活函数,尽管这样可以使输出结果更直观(是概率的形式),但是一般不会这么做,因为使用softmax输出的话不可能对所有模型都取得准确的和数字上稳定的损失计算。
使用 losses.SparseCategoricalCrossentropy 损失函数计算交叉熵损失:
(由于这是一个未训练的模型,它给出每个结果的概率为1/10,因此交叉熵应该接近于 -log(1/10)≈2.3 )
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
loss_fn(y_train[:1], tf.nn.softmax(predictions))
''' <tf.Tensor: shape=(), dtype=float32, numpy=2.344348> '''
选择训练时使用的优化器和损失函数:
model.compile(
optimizer="adam",
loss=loss_fn,
metrics=["accuracy"],
)
开始训练,训练5个epoch:
model.fit(x_train, y_train, epochs=5)
'''
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 5s 90us/sample - loss: 0.3011 - accuracy: 0.9117
Epoch 2/5
60000/60000 [==============================] - 5s 83us/sample - loss: 0.1430 - accuracy: 0.9574
Epoch 3/5
60000/60000 [==============================] - 7s 119us/sample - loss: 0.1089 - accuracy: 0.9671
Epoch 4/5
60000/60000 [==============================] - 7s 125us/sample - loss: 0.0891 - accuracy: 0.9728
Epoch 5/5
60000/60000 [==============================] - 8s 130us/sample - loss: 0.0739 - accuracy: 0.9768
'''
使用模型的evaluate方法测试模型的表现,一般用在测试集上。
model.evaluate(x_test, y_test, verbose=2)
'''
输出信息:10000/10000 - 1s - loss: 0.0764 - accuracy: 0.9760
返回值:[0.07638283925862052, 0.976]
'''