一、使用RNN模型识别手写图片
RNN是一个处理序列比较好的模型,这里用来处理手写图片,仅仅是为了试试手
二、代码分析
1、导入相关模块
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
import tensorflow as tf
2、定义数据格式
#数据长度——一行有28个像素
input_size = 28
#序列长度——一共有28行
time_steps = 28
#隐藏层cell个数
cell_size = 50
这里把图片看成了是28行的序列,每个序列长度为28,隐藏层有50个神经元
3、载入数据
#载入数据
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()
print(x_train.shape)
print(y_train.shape)
#x_train的数据shape为(60000,28,28)
#y_train的数据shape为(60000,)
x_train = x_train/255.0
x_test = x_test/255.0
#将y_train和t_test转换成one hot格式
y_train = keras.utils.to_categorical(y_train,num_classes=10)
y_test = keras.utils.to_categorical(y_test,num_classes=10)
注意这里没有把它变成784长度的,因为我们把这个数据看成28行的序列
4、创建模型
#创建模型
model = keras.Sequential()
model.add(keras.layers.SimpleRNN(units=cell_size,input_shape=(time_steps,input_size)))
model.add(keras.layers.Dense(10,activation='softmax'))
#定义优化器和损失函数
adm = keras.optimizers.Adam(lr=1e-4)
model.compile(optimizer=adm,loss='categorical_crossentropy',metrics=['accuracy'])
此处使用SimpleRNN层
5、训练模型、评估模型
#训练模型
model.fit(x_train,y_train,batch_size=64,epochs=10)
#评估模型
loss,accuracy = model.evaluate(x_test,y_test)
print('test loss: ',loss)
print('test accuracy: ',accuracy)