之前的笔记中,我们用tensorflow 1 中的API tf.nn 以及 tf.layers进行了RNN演示。在即将发布的tensorflow 2.0正式版中,其深度整合了一个高级的API keras,在这个API下面,我们可以更为便捷的构造我们的模型。 代码如下:
和之前一样,我们先导入数据并reshape到28*28的方阵
#loading data
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow.keras as keras
mnist = input_data.read_data_sets("MNIST_data/", one_hot = True)
images = mnist.train.images
labels = mnist.train.labels
images_test = mnist.test.images
labels_test = mnist.test.labels
images = images.reshape([-1,28,28])
images_test = images_test.reshape([-1,28,28])
然后我们开始设置参数,和之前的例子一样,我们使用如下参数:
batch_size = 256
epochs = 10
num_units = 100
接着我们便可以很快速地搭建我们的RNN cell
model = keras.Sequential()
model.add(keras.layers.SimpleRNN(num_units , return_sequences = False,
batch_input_shape = (batch_size , 28,28)))
model.add(keras.layers.Dense(10, activation = 'softmax'))
这里我们搭建了一个SimpleRNN cell,注意这里的参数:
batch_input_shape=(batch_size, time_steps, input_dim)
由于我们使用了28*28的方阵, 因此后两个参数为28。另外,第一个参数最好设置成None, 尽管我们之前设置了batch size 为258。 原因在于, 这里的batch size 是需要弹性的, 例如, 我们有100个数据, 且batch size 为 30, 那么这组数据将被分割成三个大小为30的batch和一个大小为10 的batch。
搭建完RNN之后,我们可以进行训练了:
model.compile(optimizer = 'adam',
loss = 'categorical_crossentropy',
metrics = ['accuracy'])
model.summary()
model.fit(images, labels, batch_size = batch_size, epochs = epochs)
通过summary, 我们可以很方便地查看整个模型中参数的使用情况。
Model: "sequential_16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_14 (LSTM) (None, 64) 23808
_________________________________________________________________
dense_15 (Dense) (None, 10) 650
=================================================================
Total params: 24,458
Trainable params: 24,458
Non-trainable params: 0
keras 可以在运行的时候实时地反馈出运行状态,我们也可以在每个epoch之后用测试数据进行检测,会得到相应的反馈。
结果如下:
Train on 55000 samples, validate on 10000 samples
Epoch 1/10
55000/55000 [==============================] - 12s 215us/sample - loss: 0.0457 - acc: 0.9861 - val_loss: 0.0669 - val_acc: 0.9792
Epoch 2/10
55000/55000 [==============================] - 12s 214us/sample - loss: 0.0409 - acc: 0.9879 - val_loss: 0.0675 - val_acc: 0.9807
Epoch 3/10
55000/55000 [==============================] - 12s 222us/sample - loss: 0.0393 - acc: 0.9873 - val_loss: 0.0635 - val_acc: 0.9818
Epoch 4/10
55000/55000 [==============================] - 12s 226us/sample - loss: 0.0345 - acc: 0.9891 - val_loss: 0.0570 - val_acc: 0.9839
Epoch 5/10
55000/55000 [==============================] - 12s 217us/sample - loss: 0.0315 - acc: 0.9903 - val_loss: 0.0703 - val_acc: 0.9807
Epoch 6/10
55000/55000 [==============================] - 12s 219us/sample - loss: 0.0280 - acc: 0.9914 - val_loss: 0.0546 - val_acc: 0.9848
Epoch 7/10
55000/55000 [==============================] - 12s 227us/sample - loss: 0.0262 - acc: 0.9922 - val_loss: 0.0586 - val_acc: 0.9835
Epoch 8/10
55000/55000 [==============================] - 12s 223us/sample - loss: 0.0244 - acc: 0.9923 - val_loss: 0.0510 - val_acc: 0.9865
Epoch 9/10
55000/55000 [==============================] - 12s 218us/sample - loss: 0.0239 - acc: 0.9925 - val_loss: 0.0632 - val_acc: 0.9834
Epoch 10/10
55000/55000 [==============================] - 12s 220us/sample - loss: 0.0205 - acc: 0.9934 - val_loss: 0.0576 - val_acc: 0.9837
这篇文章中,我们简单演示了Keras模块中RNN的构建。我们只用到了最简单的RNN模型,我们以后会讲到更多的RNN cell,例如GRU和lstm等等。