keras圖片數字識別入門AI機器學習

通過使用mnist(AI界的helloworld)手寫數字模型訓練集,瞭解下AI工作的基本流程。

本例子,要基於mnist數據集(該數據集包含了【0-9】的模型訓練數據集和測試數據集)來完成一個手寫數字識別的小demo。

mnist數據集,圖片大小是28*28的黑白。包含了6w 訓練數據和1w驗證數據。

麻雀雖小五臟俱全。通過這個CV類型的demo需求,我們會學到神經網絡模型。

從數據加載,到數據預處理,再到訓練模型,保存模型。然後再通過模型來預測我們輸入的圖片數字。

通過整個過程下來,對於像我這樣初識AI深度學習者來說,可以有一個非常好的體感。

我們通過keras+tensorflow2.0來上手。

數據加載

keras 框架,提供了現成的方法來獲取mnist數據集

(x_train_image, y_train_label), (x_test_image, y_test_label) = mnist.load_data()

這個方法會返回兩組數據集
train_image,train_label ,訓練數據集、分類標籤
x_test_image, y_test_label,驗證數據集、分類標籤

要想讓機器識別一個圖片,需要對圖片進行像素化,將像素數據轉換成 張量 矩陣數據。

mnist.load_data() 返回的就是已經轉換好的張量矩陣數據。

(在python中,通過NumPy多維數組表示。)

數據預處理

我們這個demo屬於AI for CV 方向。

CV信息首先要像素化處理,拿到張量信息。

# 轉換成一維向量 28*28=784
x_train = x_train_image.reshape(60000, 784)
x_test = x_test_image.reshape(10000, 784)

# 標準化0-1
x_Test_normalize = x_test.astype('float32') / 255
x_Train_normalize = x_train.astype('float32') / 255

通過reshape方法將三維轉換成二維,同時通過量化將計算數據縮小但是不影響模型訓練識別。
(mnist圖片數據是黑白,位深爲8位,0-255表示像素信息)。

mnist

通過可視化,我們能大概看到圖片的數字特徵是怎麼被感知到的。

同時將label標籤數據轉換成0-1的矩陣。

# 將訓練集和測試集標籤都進行獨熱碼轉化
y_TrainOneHot = np_utils.to_categorical(y_train_label)
y_TestOneHot = np_utils.to_categorical(y_test_label)

構建模型

# 建立Sequential 模型
model = Sequential()
# 建立輸入層、隱藏層
model.add(Dense(units=256,input_dim=784,kernel_initializer='normal',activation='relu'))
# 建立輸出層
model.add(Dense(units=10,kernel_initializer='normal',activation='softmax'))

# 定義模型訓練參數
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

定義神經網絡模型參數。這裏每一個參數都是一個非常深的學科,但是工程使用瞭解下就可以了。

訓練模型

# 開始訓練
train_history = model.fit(x=x_Train_normalize, y=y_TrainOneHot,
                              validation_split=0.2, epochs=10, batch_size=200, verbose=2)
# 顯示訓練過程
show_train_history(train_history, 'accuracy', 'val_accuracy')

mnist

隨着訓練次數不斷增加,整個精確度也越來越高。

我們看下訓練過程的日誌。

Epoch 1/10
240/240 - 3s - loss: 0.1211 - accuracy: 0.8309 - val_loss: 0.0564 - val_accuracy: 0.9228 - 3s/epoch - 11ms/step
Epoch 2/10
240/240 - 1s - loss: 0.0492 - accuracy: 0.9312 - val_loss: 0.0392 - val_accuracy: 0.9470 - 831ms/epoch - 3ms/step
Epoch 3/10
240/240 - 1s - loss: 0.0360 - accuracy: 0.9495 - val_loss: 0.0313 - val_accuracy: 0.9570 - 890ms/epoch - 4ms/step
Epoch 4/10
240/240 - 1s - loss: 0.0286 - accuracy: 0.9598 - val_loss: 0.0278 - val_accuracy: 0.9610 - 900ms/epoch - 4ms/step
Epoch 5/10
240/240 - 1s - loss: 0.0239 - accuracy: 0.9675 - val_loss: 0.0243 - val_accuracy: 0.9679 - 1s/epoch - 5ms/step
Epoch 6/10
240/240 - 1s - loss: 0.0204 - accuracy: 0.9723 - val_loss: 0.0224 - val_accuracy: 0.9698 - 1s/epoch - 5ms/step
Epoch 7/10
240/240 - 1s - loss: 0.0177 - accuracy: 0.9772 - val_loss: 0.0210 - val_accuracy: 0.9714 - 1s/epoch - 4ms/step
Epoch 8/10
240/240 - 1s - loss: 0.0155 - accuracy: 0.9805 - val_loss: 0.0201 - val_accuracy: 0.9729 - 984ms/epoch - 4ms/step
Epoch 9/10
240/240 - 1s - loss: 0.0137 - accuracy: 0.9833 - val_loss: 0.0189 - val_accuracy: 0.9742 - 1s/epoch - 5ms/step
Epoch 10/10
240/240 - 1s - loss: 0.0122 - accuracy: 0.9861 - val_loss: 0.0182 - val_accuracy: 0.9751 - 975ms/epoch - 4ms/step

可以看到,每一輪訓練,loss 的值在逐步變小,accuracy 在逐步增加。

每一次訓練,模型中的損失函數在計算出一個參數給到優化器進行反向傳播,不斷的調整神經元的權重。

模型訓練好之後,需要用測試數據集來驗證模型的準確度。

scores = model.evaluate(x_Test_normalize, y_TestOneHot)
print('accuracy=', scores[1])
accuracy= 0.975600004196167

保存模型

mode.save()
model.save('model.h5') #也可以保存到具體的文件中

保存的模型裏面具體是什麼,瞭解神經網絡原理之後,大概能明白。其實模型裏最重要的是 神經元的權重值
這個demo的模型我放到這裏了。
https://gitee.com/wangqingpei/blogimages/blob/master/mnist-helloworld/test/model-mnist/model.h5)

預測數據

我們準備幾個手寫的數字測試下。
mnist

讀取本地圖片文件

def get_local_image():
    img = Image.open('3.png')
    img = img.convert('L').resize((28, 28))
    img_array = np.array(img)
    # 將像素值轉換爲0-1之間的浮點數
    img_array = img_array.astype('float32') / 255.0
    img_array_result = np.reshape(img_array, (1, 784))

    return img_array_result

mnist

加載模型進行預測

def autoNumberWord():
    model = load_model("/Users/wangqingpei/Downloads/test/model-mnist/model.h5")
    img = get_local_image()
    prediction = model.predict(img)
    prediction_result = np.argmax(prediction)
    print('本地文件預測:', prediction_result)
240/240 - 1s - loss: 0.0130 - accuracy: 0.9843 - val_loss: 0.0183 - val_accuracy: 0.9755 - 848ms/epoch - 4ms/step
Epoch 10/10
240/240 - 1s - loss: 0.0116 - accuracy: 0.9866 - val_loss: 0.0177 - val_accuracy: 0.9761 - 873ms/epoch - 4ms/step
313/313 [==============================] - 1s 2ms/step - loss: 0.0167 - accuracy: 0.9767
accuracy= 0.9767000079154968
1/1 [==============================] - 0s 116ms/step
Backend MacOSX is interactive backend. Turning interactive mode on.
本地文件預測: 3

學會使用AI數字助手 chartGPT

在學習過程中,遇到問題要改變習慣,用chartGPT。~_~

在學習這個demo的時候,關於加載本地圖片的地方我搞了半天不行,後來求助chartGPT,還是很方便的。

mnist
mnist
mnist

未來AI工具肯定是越來越產品化,易使用。
但是,要想跟AI對話,需要對特定的領域有一定的理解。Prompt Engineer 也一定是趨勢。

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