轉自:https://morvanzhou.github.io/tutorials/machine-learning/keras/2-2-classifier/#測試模型
下載數據:
# download the mnist to the path '~/.keras/datasets/' if it is the first time to be called
# X shape (60,000 28x28), y shape (10,000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data()
data預處理:
X_train = X_train.reshape(X_train.shape[0], -1) / 255. # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255. # normalize
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
導入包:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./", one_hot=True)
X_train=mnist.train.images
Y_train=mnist.train.labels
X_test=mnist.test.images
Y_test=mnist.test.labels
因為(X_train, y_train), (X_test, y_test) = mnist.load_data()需從網上下載數據,由於網絡限制,下載失敗。
可以先在官網yann.lecun.com/exdb/mnist/上下載四個數據(train-images-idx3-ubyte.gz、train-labels-idx1-ubyte.gz、t10k-images-idx3-ubyte.gz、t10k-labels-idx1-ubyte.gz)
在當前目錄,不要解壓!
#input_data.py該模塊在tensorflow.examples.tutorials.mnist下,直接加載來讀取上面四個壓縮包。
#四個壓縮包形式為特殊形式。非圖片和標簽,要解析。
from tensorflow.examples.tutorials.mnist import input_data
#加載數據路徑為"./",為當前路徑,自動加載數據,用one-hot方式處理好數據。
#read_data_sets是input_data.py里面的一個函數,主要是將數據解壓之后,放到對應的位置。 第一個參數為路徑,寫"./"表示當前路徑,其會判斷該路徑下有沒有數據,沒有的話會自動下載數據。
mnist = input_data.read_data_sets("./", one_hot=True)
相關的包:
model.Sequential():用來一層一層的去建立神經層。
layers.Dense,表示這個神經層是全連接層。
layers.Activation,激勵函數
optimizers.RMSprop,優化器采用RMSprop,加速神經網絡訓練方法。
Keras工作流程:
- 定義訓練數據:輸入張量和目標張量
- 定義層組成的網絡(或模型),將輸入映射到目標
- 配置學習過程:選擇損失函數、優化器和需要監控的指標
- 調用模型的fit方法在訓練數據上進行迭代
代碼:
import numpy as np np.random.seed(1337) # for reproducibility from keras.datasets import mnist
from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import RMSprop #讀取數據,其中,X_train為55000*784,Y_train為55000*10,X_test為10000*784,Y_test大小為10000*10. from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("./", one_hot=True) X_train=mnist.train.images Y_train=mnist.train.labels X_test=mnist.test.images Y_test=mnist.test.labels
#建立神經網絡模型,一共兩層,第一層輸入784個變量,輸出為32,激活函數為relu,第二層輸入是上層的輸出32,輸出為10,激活函數為softmax。 model = Sequential([ Dense(32, input_dim=784), Activation('relu'), Dense(10), Activation('softmax'), ]) #采用RMSprop來求解模型,設學習率lr為0.001,以及別的參數。 rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) #激活模型,優化器為rmsprop,損失函數為交叉熵,metric,里面可以放入需要計算的,比如cost、accuracy、score等 model.compile(optimizer=rmsprop, loss='categorical_crossentropy', metrics=['accuracy']) #訓練網絡,用fit函數,導入數據,訓練次數為20,每批處理32個 model.fit(X_train, Y_train, nb_epoch=20, batch_size=32) #測試模型 print('\nTesting ------------') # Evaluate the model with the metrics we defined earlier loss, accuracy = model.evaluate(X_test, Y_test) print('test loss: ', loss) print('test accuracy: ', accuracy)
結果: