有兩個(gè)隱層的神經(jīng)網(wǎng)絡(luò),使用minist手寫(xiě)訓(xùn)練集丰滑。代碼如下:
from keras.models import Sequential
from keras.layers.core import Dense, Dropout,Activation
from keras.layers.convolutional import Convolution2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers import Flatten
from keras.optimizers import SGD
from keras.datasets import mnist
from keras import backend as K
import keras
import numpy as np
import struct
def train():
model = Sequential()
model.add(Dense(input_dim=28*28, output_dim=500))
model.add(Activation("sigmoid"))
model.add(Dense(output_dim=500))
model.add(Activation("sigmoid"))
model.add(Dense(output_dim=10))
model.add(Activation("sigmoid"))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
(X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自帶的mnist工具讀取數(shù)據(jù)(第一次需要聯(lián)網(wǎng))
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[
2]) # 由于mist的輸入數(shù)據(jù)維度是(num, 28, 28)瓜饥,這里需要把后面的維度直接拼起來(lái)變成784維
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])
Y_train = (np.arange(10) == y_train[:, None]).astype(int) # 參考上一篇文章诊笤,這里需要把index轉(zhuǎn)換成一個(gè)one hot的矩陣
Y_test = (np.arange(10) == y_test[:, None]).astype(int)
# 開(kāi)始訓(xùn)練嫡锌,這里參數(shù)比較多。batch_size就是batch_size檬寂,nb_epoch就是最多迭代的次數(shù)终抽, shuffle就是是否把數(shù)據(jù)隨機(jī)打亂之后再進(jìn)行訓(xùn)練
# verbose是屏顯模式,官方這么說(shuō)的:verbose: 0 for no logging to stdout, 1 for progress bar logging, 2 for one log line per epoch.
# 就是說(shuō)0是不屏顯,1是顯示一個(gè)進(jìn)度條昼伴,2是每個(gè)epoch都顯示一行數(shù)據(jù)
# show_accuracy就是顯示每次迭代后的正確率
# validation_split就是拿出百分之多少用來(lái)做交叉驗(yàn)證
model.fit(X_train, Y_train, batch_size=200, nb_epoch=2, shuffle=True, verbose=1,validation_split=0.3)
print('test set')
model.evaluate(X_test, Y_test, batch_size=200)
def trainCNN():
modelCNN = Sequential()
modelCNN.add(Convolution2D(24, 3, 3, input_shape=(28,28,1)))#這里使用24個(gè)filter匾旭,每個(gè)大小為3x3。輸入圖片大小28x28
modelCNN.add(MaxPooling2D((2,2)))#pooling為2x2圃郊,即每4個(gè)網(wǎng)格取一個(gè)最大值 pooling之前是24(filter)x26x26价涝,pooling后是24(filter)x13x13
modelCNN.add(Convolution2D(48, 3, 3))#再用24x3x3filter卷積一次,大小為48(filter)x11x11
modelCNN.add(MaxPooling2D((2, 2))) # pooling為2x2持舆,完成后成為48(filter)x5x5
modelCNN.add(Flatten())
modelCNN.add(Dense(output_dim=100))
modelCNN.add(Activation('relu'))
modelCNN.add(Dense(output_dim=10))
modelCNN.add(Activation('softmax'))
modelCNN.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# input image dimensions
img_rows, img_cols = 28, 28
batch_size = 200
num_classes = 10
# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
modelCNN.fit(x_train, y_train,
batch_size=batch_size,
epochs=2,
verbose=1,
validation_data=(x_test, y_test))
score = modelCNN.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
if __name__ == "__main__":
trainCNN();
全連接和cnn都跑了兩輪色瘩,結(jié)果如下:
全連接網(wǎng)絡(luò): loss: 0.2520 - acc: 0.9265 - val_loss: 0.2469 - val_acc: 0.9292
cnn: loss: 0.0769 - acc: 0.9770 - val_loss: 0.0605 - val_acc: 0.9785
可以看到cnn的精度,明顯高于全連接網(wǎng)絡(luò)逸寓。不過(guò)cnn相對(duì)全連接還是深了一些居兆,訓(xùn)練速度慢了不少。