機器學習-手寫數字識別
- 2019 年 10 月 8 日
- 筆記
據說,在命令行窗口列印出『hello,world』是入門程式語言的第一個程式,那麼手寫數字識別就是機器學習的hello,world了,學習的東西不經常複習的容易忘記,因此在這裡記錄一下。
最初學習機器學習的時候,我自己先做的其實是線性回歸和邏輯回歸,但是我用自己創建的函數和數據一直不能很好的讓結果去擬合數據,所以不是成功的程式碼,還是需要在多研究一下。
關於機器學習的影片,我個人推薦吳恩達和李宏毅的影片,結合起來看可能會很亂,但是理解到的話,還是會很清晰的。
要進行手寫數字識別,首先需要數據,然後在定義一個神經網路來對數據進行訓練,然後把訓練好的權重和模型保存起來,在另外的程式調用,並拿來測試你想要測試的圖片,看看訓練的結果是不是比較正確。
關於數據獲取,這裡選擇的keras自帶的數據集,可以在keras的官網可以找到你需要的數據集,https://keras.io/datasets/

這裡就有第一個坑,因為keras好像是國外的,用程式下載的時候需要翻牆才能下載,這裡就可以去簡單的下載一個藍燈就可以下載了,大小15m左右,下載完後會自動保存好,下次使用也不用重新下載,會直接調用。

數據集包含10個數字的60,000個28×28灰度影像,以及10,000個影像的測試集。
下載好數據集後,接著需要將數據處理一下,將其變成程式需要的格式,具體程式碼如下:
from keras.utils import to_categorical train_images = x_train.reshape((60000,28*28)) #將x_train轉化為(60000,784)的格式 test_images = x_test.reshape((10000,28*28)) train_images = train_images.astype('float32')/255 #將影像的數值變成0-1之間的小數 test_images = test_images.astype('float32')/255 train_labels = to_categorical(y_train) test_labels = to_categorical(y_test)
這個是沒有astype的x_train的值:

這個是經過astype()之後的數值

接著,to_categorical就是將類別向量轉換為二進位(只有0和1)的矩陣類型表示。

用keras搭建神經網路的程式碼很簡單,也就十幾行程式碼就可以實現一個簡單的神經網路用來訓練數據了。
from keras import models from keras import layers network = models.Sequential() network.add(layers.Dense(633, activation='relu', input_shape=(28*28,))) network.add(layers.Dense(633, activation='relu')) network.add(layers.Dense(10,activation='softmax')) from keras import optimizers network.compile(optimizer = 'adam', loss='categorical_crossentropy', metrics=['accuracy']) network.fit(train_images,train_labels, epochs=5,batch_size=128) test_loss, test_acc = network.evaluate(test_images, test_labels) print('test_acc:', test_acc) network.save('shouxie.h5')
第一步是構建模型:
如程式碼所示,首先導入需要的庫函數,定義一個神經網路的model,
Sequential是一系列網路層按順序構成的棧
然後再給model添加輸入層,指定好輸入層類型,dense是指全連接,輸出個數是633,激活函數是relu,輸入個數是28*28個。然後再添加一個隱藏層,這裡就不用定義輸入個數,只需要輸出的和激活函數,緊接著就是輸出層了,因為我們的數字是0-9,有10個數字,這裡的大小也是10,而這裡的激活函數就要改成softmax,模型就這樣構建完成了。
接著就是第二步編譯一下模型:
用compile函數來編譯,並定義好,損失函數,優化器(比如梯度下降)的方法,以及metrics函數。
第三步就是用fit函數來訓練模型:
x_train,y_train :訓練數據集
batch_size :指定一個size表示每次更新一次參數需要從訓練集中隨機抽取多少個樣本,一般越大速度越快
epochs :每次使用完所有的訓練數據集表示一次epoch
test_loss, test_acc = network.evaluate(test_images, test_labels) print('test_acc:', test_acc)
這裡就是將訓練結果的成功率和loss結果提取出來,並輸出結果。
到這裡一個神經網路也就搭建完成了,如果需要能提取模型,以便我們使用訓練的結果的話,還需要將模型保存起來,這裡將模型保存成h5的格式。


再用訓練得到的模型對數據預測,可以看出預測的結果是對的,模型的準確率也有97之高。
就這樣一個機器學習的helloworld就做好了。