1. 程式人生 > 實用技巧 >keras學習(二)分類

keras學習(二)分類

  這一次是通過keras對官方的手寫資料集mnist進行訓練,是訓練出來的模型能準確分別手寫數字mnist手寫資料集,裡面都是28*28的圖片(這個圖片是來自https://www.cnblogs.com/xianhan/p/9145966.html):

  然後如果只是簡單的這樣訓練模型就沒什麼意義了,因此每個數字都有很多不同的版本:

  這些樣式的,這樣才有億點點難度。

#匯入一些包
import numpy as np
np.random.seed(123) #隨機種子的目的就是讓程式每次執行的時候生成隨機數那個函式生成的數一樣,但是這裡 
                    #程式碼好像沒有生成隨機數,我也是跟著寫的,可能某些指令有隨機操作吧
from keras.layers import Dense, Activation
from keras.models import Sequential
from keras.datasets import mnist
from keras.utils import np_utils
from keras.optimizers import RMSprop

 #下載資料到'C:\Users\Administrator\.keras\datasets'這個路勁,有的話就不用下載了
#然後資料形狀就是這樣,x是60000個(28x28)的手寫數字圖片,應該是圖片,不過輸出出來就是陣列了,
#y就是60000個標籤,標籤是[0,1,2,3, ... ,9]也就是一張圖片寫的是什麼數字
(x_train, y_train), (x_test, y_test) = mnist.load_data() #呼叫/下載後就賦值給左邊那些式子了

#處理x資料,處理成(60000*784)最後歸一化,除以255。前面介紹的時候可以看到圖片樣子,然後在資料裡呢就#會將各個顏色轉成RGB形式,
#所以輸出x_train就會看到裡面都是數字,範圍是0-255,然後對這些數字進行處理,處理成0-1
x_train = x_train.reshape(x_train.shape[0], -1)/255 
x_test = x_test.reshape(x_test.shape[0], -1)/255
#處理y,沒處理前y是類似上面說的0,1,2,3,4這個樣子,處理後變成[1,0,0,0,0,0,0,0,0,0]一個這樣的陣列,如果是0,就第一個數變為1,
# 如果是1就變成[0,1,0,0,0,0,0,0,0,0]這個樣子
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)

#建立模型,這個是另一種方式建立模型,另一種形式就是先model=Sequential(),然後model.add()加入每一個層就行了
model = Sequential([
    Dense(32, input_dim = 784),  #輸出32,輸入28*28 = 784
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

remprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) #一個優化方法,用這個來找到最合適的引數,應該類似梯度下降

model.compile(optimizer=remprop, loss='categorical_crossentropy', metrics=['accuracy'],)#編譯模型

print("-------------------train---------------")
model.fit(x_train, y_train, epochs=2, batch_size=32) #訓練,epochs是訓練次數,batch_size就是每次取32個數進行訓練

print("--------------------test----------------")
loss, accuracy = model.evaluate(x_test, y_test) #按batch_size計算誤差

print(loss)
print(accuracy)

  其實我自己目前還有些疑問,就比如我怎麼用訓練出來的模型去分辨一個數字呢?