# -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再現性 from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential#按層 from keras.layers import Dense, Activation,Convolution2D, MaxPooling2D, Flatten import matplotlib.pyplot as plt from keras.optimizers import RMSprop from keras.optimizers import Adam
從mnist下載手寫數字圖片數據集,圖片為28*28,將每個像素的顏色(0到255)改為(0倒1),將標簽y變為10個長度,若為1,則在1處為1,剩下的都標為0。
#dowmload the mnisst the path '~/.keras/datasets/' if it is the first time to be called #x shape (60000 28*28),y shape(10000,) (x_train,y_train),(x_test,y_test) = mnist.load_data()#0-9的圖片數據集 #data pre-processing x_train = x_train.reshape(-1,1,28,28)#-1代表個數不限,1為高度,黑白照片高度為1 x_test = x_test.reshape(-1,1,28,28) y_train = np_utils.to_categorical(y_train, num_classes=10) #把標簽變為10個長度,若為1,則在1處為1,剩下的都標為0 y_test = np_utils.to_categorical(y_test,num_classes=10)
接下來搭建CNN
卷積->池化->卷積->池化
使圖片從(1,28,28)->(32,28,28)->(32,14,14)-> (64,14,14) -> (64,7,7)
#Another way to build CNN model = Sequential() #Conv layer 1 output shape (32,28,28) model.add(Convolution2D( nb_filter =32,#濾波器裝了32個,每個濾波器都會掃過這個圖片,會得到另外一整張圖片,所以之后得到的告訴是32層 nb_row=5, nb_col=5, border_mode='same', #padding method input_shape=(1, #channels 通道數 28,28), #height & width 長和寬 )) model.add(Activation('relu')) #Pooling layer 1 (max pooling) output shape (32,14,14) model.add(MaxPooling2D( pool_size=(2,2), #2*2 strides=(2,2), #長和寬都跳兩個再pool一次 border_mode='same', #paddingmethod )) #Conv layers 2 output shape (64,14,14) model.add(Convolution2D(64,5,5,border_mode='same')) model.add(Activation('relu')) #Pooling layers 2 (max pooling) output shape (64,7,7) model.add(MaxPooling2D(pool_size=(2,2), border_mode='same'))
構建全連接神經網絡
#Fully connected layer 1 input shape (64*7*7) = (3136) #Flatten 把三維抹成一維,全連接 model.add(Flatten()) model.add(Dense(1024)) model.add(Activation('relu')) #Fully connected layer 2 to shape (10) for 10 classes model.add(Dense(10)) #輸出10個單位 model.add(Activation('softmax')) #softmax用來分類 #Another way to define optimizer adam = Adam(lr=1e-4) # We add metrics to get more results you want to see model.compile( #編譯 optimizer = adam, loss = 'categorical_crossentropy', metrics=['accuracy'], #在更新時同時計算一下accuracy )
訓練和測試
print("Training~~~~~~~~") #Another way to train the model model.fit(x_train,y_train, epochs=1, batch_size=32) #訓練2大批,每批32個 print("\nTesting~~~~~~~~~~") #Evalute the model with the metrics we define earlier loss,accuracy = model.evaluate(x_test,y_test) print('\ntest loss:',loss) print('\ntest accuracy:', accuracy)
全代碼:

# -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再現性 from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential#按層 from keras.layers import Dense, Activation,Convolution2D, MaxPooling2D, Flatten import matplotlib.pyplot as plt from keras.optimizers import RMSprop from keras.optimizers import Adam #dowmload the mnisst the path '~/.keras/datasets/' if it is the first time to be called #x shape (60000 28*28),y shape(10000,) (x_train,y_train),(x_test,y_test) = mnist.load_data()#0-9的圖片數據集 #data pre-processing x_train = x_train.reshape(-1,1,28,28)#-1代表個數不限,1為高度,黑白照片高度為1 x_test = x_test.reshape(-1,1,28,28) y_train = np_utils.to_categorical(y_train, num_classes=10) #把標簽變為10個長度,若為1,則在1處為1,剩下的都標為0 y_test = np_utils.to_categorical(y_test,num_classes=10) #Another way to build CNN model = Sequential() #Conv layer 1 output shape (32,28,28) model.add(Convolution2D( nb_filter =32,#濾波器裝了32個,每個濾波器都會掃過這個圖片,會得到另外一整張圖片,所以之后得到的告訴是32層 nb_row=5, nb_col=5, border_mode='same', #padding method input_shape=(1, #channels 通道數 28,28), #height & width 長和寬 )) model.add(Activation('relu')) #Pooling layer 1 (max pooling) output shape (32,14,14) model.add(MaxPooling2D( pool_size=(2,2), #2*2 strides=(2,2), #長和寬都跳兩個再pool一次 border_mode='same', #paddingmethod )) #Conv layers 2 output shape (64,14,14) model.add(Convolution2D(64,5,5,border_mode='same')) model.add(Activation('relu')) #Pooling layers 2 (max pooling) output shape (64,7,7) model.add(MaxPooling2D(pool_size=(2,2), border_mode='same')) #Fully connected layer 1 input shape (64*7*7) = (3136) #Flatten 把三維抹成一維,全連接 model.add(Flatten()) model.add(Dense(1024)) model.add(Activation('relu')) #Fully connected layer 2 to shape (10) for 10 classes model.add(Dense(10)) #輸出10個單位 model.add(Activation('softmax')) #softmax用來分類 #Another way to define optimizer adam = Adam(lr=1e-4) # We add metrics to get more results you want to see model.compile( #編譯 optimizer = adam, loss = 'categorical_crossentropy', metrics=['accuracy'], #在更新時同時計算一下accuracy ) print("Training~~~~~~~~") #Another way to train the model model.fit(x_train,y_train, epochs=1, batch_size=32) #訓練2大批,每批32個 print("\nTesting~~~~~~~~~~") #Evalute the model with the metrics we define earlier loss,accuracy = model.evaluate(x_test,y_test) print('\ntest loss:',loss) print('\ntest accuracy:', accuracy)
輸出: