一、RNN的简介
RNN的基本结构是BP神经网络的结构,也具备输入层、隐藏层和输出层。只不过在RNN中,隐藏层的输出不仅可以传到输出层,也可以传到下一时刻是隐藏层,其结构如下
二、模型准备
2.1首先,导入手写数字数据集,此数据集为60000张手写数字,为白底黑字,结果如下:
from tensorflow.keras.datasets import mnist
2.2其次从keras的layers中导入相应的简单的RNN模型和全连接层,以及keras模式中导入顺序结构,标签转化等包:
from keras.utils import np_utils#标签转化
from keras.models import Sequential#顺序结构
from keras.layers import Dense#全连接层
from keras.layers.recurrent import SimpleRNN#循环神经网络
from tensorflow.keras.optimizers import Adam#优化器
2.3设置输入数据大小,以及隐藏层的神经元cell个数:
#数据长度有一行28个像素
input_size=28
#一共28行
time_steps=28
#隐藏层cell个数
cell_size=50
2.4载入手写数字数据,并且归一化,归一化的目的是减少运算量,加快模型的训练:
#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data()
#(60000,28,28)
#归一化
x_train=x_train/255
x_test=x_test/255
2.5对标签进行转化,因为手写数字识别模型最终得到0-9,因此最终结构为10个类,所以转化如下:
#转化标签为one hot
y_train=np_utils.to_categorical(y_train,num_classes=10)
y_test=np_utils.to_categorical(y_test,num_classes=10)
2.6模型的创建,首先创建顺序模型:
model=Sequential()
2.7在创建的顺序模型中加入简单RNN模型,并且设置输入输入输出的平面大小和隐藏神经元个数:
model.add(SimpleRNN(
units=cell_size,#输出到隐藏层,隐藏层有50个神经元
input_shape=(time_steps,input_size)#输入
))
2.8定义优化器
#定义优化器
adam=Adam(learning_rate=1e-4)
#定义优化器,loss方选,计算准确率
model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])
2.9训练设置,每次64张图,总共10个周期
#训练模式
model.fit(x_train,y_train,batch_size=64,epochs=10)
2.10模型评估并且保存模型
#模型评估
loss,accuracy=model.evaluate(x_test,y_test)
print('test loss',loss)
print('test accuracy',accuracy)
#保存文件
model.save('model.h5')