机器学习笔记2 MNIST RNN 的Keras实现

之前的笔记中,我们用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等等。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值