機器學習與計算機視覺(keras和mnist)

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯繫信箱:feixiaoxing @163.com】

 

    在所有機器學習的教程裏面,mnist幾乎是最簡單的數據庫。這是一個首先的字母識別庫。而相比較而言,keras又是比較好的深度學習封裝庫,所以大家不妨可以嘗試一下keras和mnist。文中涉及的python代碼來自網友博文,一併表示感謝。

 

1、獲取mnist庫

    如果利用keras去獲取mnist數據,那麼它會從亞馬遜雲上面下載,十分不方便。建議大家手工下載,然後用numpy直接加載就可以了。

 

2、數據向量化

    不管是什麼數據,輸入給深度學習的時候都要進行向量化處理。比如mnist每一幅圖像都是28*28的小圖,它都會要求你轉成一個784的一唯向量。這個工作一般由reshape來完成後。

 

3、分類扁平化

    因爲原來的數據一般直接就是歸爲某一類,所以我們就要把它轉換成一個數組,比如5變成[0,0,0,0,0,1,0,0,0,0]。to_categorical函數可以幫助我們實現這一功能。

 

4、訓練次數

    一般訓練次數是自己設定的,對於中間的模型結果可以保存下來。

 

5、模型的保存

    訓練的時候有時候會得到很多的模型,建議大家可以將這些中間結果保存下來,後期分析的時候非常有用。當然,在模型保存時,對於名字的選擇非常講究,最好表明是什麼參數、訓練多少次獲得的模型。

 

6、模型的加載

    模型訓練非常麻煩,但是加載很簡單,它包含了網絡、模型等很多數據。

 

7、模型預測

    如果需要預測結果,直接使用predict函數就可以。當然獲取的數據也是向量形式,裏面的數值表示預測對象代表當前類的最大概率。這個時候需要用函數argmax轉換一下就可以了。

 

8、訓練過程中的中間結果

shell> python3 recognize.py

Using TensorFlow backend.
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
(60000, 784)
(10000, 784)
2019-12-14 22:48:42.912275: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
dense_1 (Dense)              (None, 512)               401920
_________________________________________________________________
dense_2 (Dense)              (None, 256)               131328
_________________________________________________________________
dense_3 (Dense)              (None, 10)                2570
=================================================================
Total params: 535,818
Trainable params: 535,818
Non-trainable params: 0
_________________________________________________________________
Train on 60000 samples, validate on 10000 samples
Epoch 1/5
60000/60000 [==============================] - 8s 138us/step - loss: nan - accuracy: 0.0986 - val_loss: nan - val_accuracy: 0.0980
Epoch 2/5
60000/60000 [==============================] - 11s 183us/step - loss: nan - accuracy: 0.0987 - val_loss: nan - val_accuracy: 0.0980
Epoch 3/5
60000/60000 [==============================] - 10s 173us/step - loss: nan - accuracy: 0.0987 - val_loss: nan - val_accuracy: 0.0980
Epoch 4/5
60000/60000 [==============================] - 12s 205us/step - loss: nan - accuracy: 0.0987 - val_loss: nan - val_accuracy: 0.0980
Epoch 5/5
60000/60000 [==============================] - 10s 164us/step - loss: nan - accuracy: 0.0987 - val_loss: nan - val_accuracy: 0.0980
10000/10000 [==============================] - 1s 76us/step

9、訓練後的結果預測

shell> python3 predict.py

Using TensorFlow backend.
2019-12-14 22:52:50.258952: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
10000
784
10000
10
980

 

附錄1:

    完整的mnist訓練代碼,用python3.5實現

#!/usr/bin/python
# -*- coding: utf-8 -*- 
#
# 首次使用深度學習來進行處理 20191214
#

import os
import sys
import re
import keras
import sklearn
import tensorflow
import numpy as np
import cv2

# keras裏面的數據和模型需要單獨添加

from keras.datasets import mnist
from keras.models  import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.models import load_model

#
# 原本數據從利用keras.datasets獲取的
# 但是keras是從亞馬遜下載,這裏直接從第三方下載好,然後用numpy加載即可
#

x_train = np.load("./mnist/x_train.npy")
y_train = np.load("./mnist/y_train.npy")
x_test = np.load("./mnist/x_test.npy")
y_test = np.load("./mnist/y_test.npy")

print(x_train.shape,y_train.shape)
print(x_test.shape,y_test.shape)

# 打印顯示圖片

import matplotlib.pyplot as plt
im = plt.imshow(x_train[0],cmap='gray')
#plt.show()
#cv2.waitKey(0)

# 將圖片攤平,變成向量

x_train = x_train.reshape(60000,784) 
x_test = x_test.reshape(10000,784) # 對測試集進行同樣的處理
print(x_train.shape)
print(x_test.shape)

# 將數據扁平化,比如5設置爲[0,0,0,0,0,1,0,0,0,0],這裏的5應該是字符5的意思

y_train = keras.utils.to_categorical(y_train,10)
y_test = keras.utils.to_categorical(y_test,10)

model = Sequential() # 構建一個空的序貫模型

# 添加神經網絡層

model.add(Dense(512,activation='relu',input_shape=(784,)))
model.add(Dense(256,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.summary()

# 設置損失函數和優化方法

model.compile(optimizer=SGD(),loss='categorical_crossentropy',metrics=['accuracy'])

# 開始訓練,訓練5次

model.fit(x_train,y_train,batch_size=64,epochs=5,validation_data=(x_test,y_test)) 

# 檢驗識別效果
score = model.evaluate(x_test,y_test)

# 保存模型,

model.save('partly_trained.h5')
del model

# 加載模型繼續訓練

model = load_model('partly_trained.h5')

#繼續訓練

#model.fit(x_train[3000:], y_train[3000:], nb_epoch=10, batch_size=200, verbose=2)
model.fit(x_train,y_train,batch_size=64,epochs=5) 

scores = model.evaluate(x_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))

 

附錄2:

    mnist預測代碼,重點在argmax的轉換,

#!/usr/bin/python
# -*- coding: utf-8 -*- 
#
# 利用keras預測分類數據
#

import os
import sys
import re
import keras
import sklearn
import tensorflow
import numpy as np
import cv2

# keras裏面的數據和模型需要單獨添加

from keras.datasets import mnist
from keras.models  import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.models import load_model

# 加載模型繼續訓練

model = load_model('partly_trained.h5')
#
# 原本數據從利用keras.datasets獲取的
# 但是keras是從亞馬遜下載,這裏直接從第三方下載好,然後用numpy加載即可
#

x_test = np.load("./mnist/x_test.npy")
y_test = np.load("./mnist/y_test.npy")

# 對測試集進行同樣的處理
x_test = x_test.reshape(10000,784) 

print(x_test.shape[0])
print(x_test.shape[1])

# 加載一個預測結果
# 注意,這裏預測的結果只是屬於某一個品類的概率,一定要用np.argmax轉換一下
y_pred=model.predict(x_test,batch_size = 1)

print(y_pred.shape[0])
print(y_pred.shape[1])

# 判斷數值
y_pred = np.argmax(y_pred, axis=1)

cnt = 0
for i in range(len(y_test)):
	if y_test[i]==y_pred[i]:
		cnt += 1
print(cnt)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章