天天看點

slim 搭建rnn_用Keras搭建神經網絡 簡單模版(四)—— RNN Classifier 循環神經網絡(手寫數字圖檔識别)......

# -*- coding: utf-8 -*-

import numpy as np

np.random.seed(1337)

from keras.datasets import mnist

from keras.utils import np_utils

from keras.models import Sequential

from keras.layers import SimpleRNN,Activation,Dense

from keras.optimizers import Adam

TIME_STEPS = 28 #圖檔的高

INPUT_SIZE = 28 #圖檔的行

BATCH_SIZE = 50 #每批訓練多少圖檔

BATCH_INDEX = 0

OUTPUT_SIZE = 10

CELL_SIZE = 50

LR = 0.001

#下載下傳mnist資料集

# X shape (60000,28*28) ,y shape (10000)

(X_train,y_train),(X_test,y_test) = mnist.load_data()

# 資料預處理

X_train = X_train.reshape(-1,28,28)/255

X_test = X_test.reshape(-1,28,28)/255

y_train = np_utils.to_categorical(y_train,num_classes=10)

y_test = np_utils.to_categorical(y_test,num_classes=10)

# 模組化型

model = Sequential()

# RNN

model.add(SimpleRNN(

batch_input_shape=(None,TIME_STEPS,INPUT_SIZE),# 每次訓練的量(None表示全部),圖檔大小

output_dim=CELL_SIZE,

))

# 輸出層

model.add(Dense(OUTPUT_SIZE))

model.add(Activation('softmax'))

# 優化器

adam = Adam(LR)

model.compile(optimizer=adam,

loss='categorical_crossentropy',

metrics=['accuracy'])

# 訓練

for step in range(4001):

X_batch=X_train[BATCH_INDEX:BATCH_SIZE+BATCH_INDEX,:,:]

Y_batch=y_train[BATCH_INDEX:BATCH_SIZE+BATCH_INDEX,:]

cost = model.train_on_batch(X_batch,Y_batch)

BATCH_INDEX += BATCH_SIZE

BATCH_INDEX = 0 if BATCH_INDEX>=X_train.shape[0] else BATCH_INDEX

if step % 500 == 0:

cost,accuracy = model.evaluate(X_test,y_test,batch_size=y_test.shape[0],verbose=False)

print('test cost: ',cost,'test accuracy: ',accuracy)