Keras上實現Softmax迴歸模型

marsjhao發表於2020-04-06

一、分類神經網路構建過程

本例程是在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_classesKeras 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.測試模型

測試模型與之前的方法類似,請參看之前的博文Keras上實現簡單線性迴歸模型

二、完整程式

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)


相關文章