Keras上實現Softmax迴歸模型
一、分類神經網路構建過程
本例程是在MNIST資料集,構建一個簡單分類神經網路,實現對0-9這10個數字的分類。
1.資料預處理
Keras 自身包含 MNIST 這個資料集,再分成訓練集和測試集。x 是一張張圖片,y 是每張圖片對應的標籤,即它是哪個數字。輸入的 x 變成 60,000*784 的資料,然後除以 255 進行標準化,標準化之後就變成了(0, 1)之間。對於 y,要用到 Keras 改造的 numpy 的一個函式 np_utils.to_categorical,把 y 變成了 one-hot 的形式,即之前 y 是一個數值, 在 0-9 之間,現在是一個大小為10 的向量,其屬於哪個數字,就在那個位置為 1,其他位置都是 0。
這裡有一點需要注意的地方就是np_utils.to_categorical()中的引數nb_classes在Keras 2中變更為num_classes,這事一出新特性變更,使用不同版本的時候務必注意修改。
2.構建神經網路模型
本例中使用了一種更為簡潔的構建神經網路模型的方法,即在初始化Sequential時直接將模型的各個層依次放入一個list中。第一段就是加入 Dense 神經層。32 是輸出的維度,784 是輸入的維度。第一層傳出的資料有 32 個 feature,傳給激勵單元,激勵函式用到的是 relu 函式。經過激勵函式之後,就變成了非線性的資料。然後再把這個資料傳給下一個神經層,這個 Dense 我們定義它有 10 個輸出的 feature。同樣的,此處不需要再定義輸入的維度,因為它接收的是上一層的輸出。接下來再輸入給下面的 softmax 函式,用來分類。接下來自定義RMSprop優化器。然後用 model.compile 激勵神經網路。優化器,可以是預設的,也可以是我們在上一步定義的。損失函式,分類和迴歸問題的不一樣,用的是交叉熵。 metrics,裡面可以放入需要計算的 cost,accuracy,score 等。
3.訓練模型
本例中用到的訓練函式是fit()函式,在這裡也產生了Keras 2的一個新特性,就是fit()函式的訓練次數nb_epoch屬性變更為epochs,使用時多加註意。batch_size表示每批訓練的大小。fit()有很強大的動態顯示功能,會動態顯示每次訓練的過程、剩餘時間、loss值、accuracy值等,非常直觀。
4.測試模型
二、完整程式
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 from keras.optimizers import RMSprop # X shape (60,000 28x28), y shape (10,000, ) (X_train, y_train), (X_test, y_test) = mnist.load_data() #獲取資料 # 資料預處理 X_train = X_train.reshape(X_train.shape[0], -1) / 255. # 標準化 X_test = X_test.reshape(X_test.shape[0], -1) / 255. #轉換為one_hot形式 #keras_v1 y_train = np_utils.to_categorical(y_train, nb_classes=10) #keras_v1 y_test = np_utils.to_categorical(y_test, nb_classes=10) y_train = np_utils.to_categorical(y_train, num_classes=10) y_test = np_utils.to_categorical(y_test, num_classes=10) # 構建模型階段 # 一次性搭建神經網路模型的方法,注意是將模型元素放在一個list中 model = Sequential([ Dense(32, input_dim=784), Activation('relu'), Dense(10), Activation('softmax'), ]) # 啟用模型 # 自定義RMS優化器 rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) model.compile(optimizer=rmsprop, loss='categorical_crossentropy', metrics=['accuracy']) #訓練階段 print('Training ------------') model.fit(X_train, y_train, epochs=10, batch_size=32) #keras_v1 epochs 2 nb_epoch #測試階段 print('\nTesting ------------') loss, accuracy = model.evaluate(X_test, y_test) print('test loss: ', loss) print('test accuracy: ', accuracy)