我们在3.3节(线性回归的简洁实现)中已经了解了使用Tensorflow2.0实现模型的便利。下面,让我们再次使用Tensorflow2.0来实现一个softmax回归模型。首先导入所需的包或模块。
import tensorflow as tf
from tensorflow import keras
我们仍然使用Fashion-MNIST数据集和上一节中设置的批量大小。
fashion_mnist = keras.datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
对数据进行处理,归一化,便于训练
x_train = x_train / 255.0
x_test = x_test / 255.0
在3.4节(softmax回归)中提到,softmax回归的输出层是一个全连接层。因此,我们添加一个输出个数为10的全连接层。 第一层是Flatten,将28 * 28的像素值,压缩成一行 (784, ) 第二层还是Dense,因为是多分类问题,激活函数使用softmax
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(10, activation=tf.nn.softmax)
])
如果做了上一节的练习,那么你可能意识到了分开定义softmax运算和交叉熵损失函数可能会造成数值不稳定。因此,Tensorflow2.0的keras API提供了一个loss参数。它的数值稳定性更好。
loss = 'sparse_categorical_crossentropy'
我们使用学习率为0.1的小批量随机梯度下降作为优化算法。
optimizer = tf.keras.optimizers.SGD(0.1)
接下来,我们使用上一节中定义的训练函数来训练模型。
model.compile(optimizer=tf.keras.optimizers.SGD(0.1),
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train,y_train,epochs=5,batch_size=256)
输出:
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 1s 20us/sample - loss: 0.7941 - accuracy: 0.7408
Epoch 2/5
60000/60000 [==============================] - 1s 11us/sample - loss: 0.5729 - accuracy: 0.8112
Epoch 3/5
60000/60000 [==============================] - 1s 11us/sample - loss: 0.5281 - accuracy: 0.8241
Epoch 4/5
60000/60000 [==============================] - 1s 11us/sample - loss: 0.5038 - accuracy: 0.8296
Epoch 5/5
60000/60000 [==============================] - 1s 11us/sample - loss: 0.4866 - accuracy: 0.8351
接下来,比较模型在测试数据集上的表现情况
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Acc:',test_acc)
输出:
- 1s 55us/sample - loss: 0.4347 - accuracy: 0.8186
Test Acc: 0.8186
- Tensorflow2.0提供的函数往往具有更好的数值稳定性。
- 可以使用Tensorflow2.0更简洁地实现softmax回归。
注:本节除了代码之外与原书基本相同,原书传送门