[轉(zhuǎn)載]Python深度學(xué)習(xí):第2部分

原作者: Jon C-137
原文鏈接: https://medium.com/@jon.froiland/convolutional-neural-networks-for-sequence-processing-part-2-bdd3fc88cb10

進(jìn)一步了解MNIST數(shù)據(jù)集

MNIST數(shù)據(jù)集以一組4個Numpy數(shù)組的形式預(yù)裝在Keras中。如果按照前一部分的步驟設(shè)置了一個virtualenv,激活它,然后啟動一個python shell。

$ python
>>> from keras.datasets import mnist
>>> (train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_圖像和train_標(biāo)簽構(gòu)成訓(xùn)練集,模型將從中學(xué)習(xí)數(shù)據(jù)。然后將在測試集、測試圖像和測試標(biāo)簽上測試該模型。圖像被編碼為Numpy數(shù)組,標(biāo)簽是一個數(shù)字?jǐn)?shù)組,范圍從0到9。圖像和標(biāo)簽是一一對應(yīng)的。
接下來讓我們看看訓(xùn)練數(shù)據(jù):

>>> train_images.shape
(60000, 28, 28)
>>> len(train_labels)
60000
>>> train_labels
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)

工作流程如下:

  1. 向神經(jīng)網(wǎng)絡(luò)提供訓(xùn)練數(shù)據(jù)、訓(xùn)練圖像和訓(xùn)練標(biāo)簽。然后,網(wǎng)絡(luò)將學(xué)習(xí)關(guān)聯(lián)圖像和標(biāo)簽。
  2. 要求網(wǎng)絡(luò)為test_images生成預(yù)測,我們將驗(yàn)證這些預(yù)測是否與test_labels中的標(biāo)簽匹配。
    構(gòu)建網(wǎng)絡(luò)架構(gòu):
>>> from keras import models
>>> from keras import layers
>>> network = models.Sequential()
>>> network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
>>> network.add(layers.Dense(10, activation='softmax'))

神經(jīng)網(wǎng)絡(luò)的核心組成部分是層,一個數(shù)據(jù)處理模塊,你可以將其看作數(shù)據(jù)過濾器。一些數(shù)據(jù)進(jìn)入,它以一種更有用的形式出現(xiàn)。具體地說,層從輸入到它們的數(shù)據(jù)中提取表示-希望,表示對于手頭的問題更有意義。大多數(shù)深度學(xué)習(xí)包括將簡單的層鏈接在一起,這些層將實(shí)現(xiàn)一種漸進(jìn)式的數(shù)據(jù)蒸餾。一個深度學(xué)習(xí)模型就像一個數(shù)據(jù)處理的篩子,由一系列越來越精細(xì)的數(shù)據(jù)過濾器組成——層。
這里,我們的網(wǎng)絡(luò)由兩個密集層組成,這兩個密集層是密集連接(也稱為完全連接)的神經(jīng)層。第二層(也是最后一層)是10路softmax層,這意味著它將返回一個由10個概率分?jǐn)?shù)組成的數(shù)組(總和為1)。每個分?jǐn)?shù)將是當(dāng)前數(shù)字圖像屬于我們的10位數(shù)類之一的概率。
為了使網(wǎng)絡(luò)做好培訓(xùn)準(zhǔn)備,我們還需要選擇三件事,作為編譯步驟的一部分:

  1. *損失函數(shù) — *網(wǎng)絡(luò)將如何能夠根據(jù)訓(xùn)練數(shù)據(jù)來衡量其性能,從而如何能夠?qū)⒆约阂龑?dǎo)到正確的方向。
  2. *優(yōu)化器 — *網(wǎng)絡(luò)根據(jù)所看到的數(shù)據(jù)及其丟失功能進(jìn)行自我更新的機(jī)制。
  3. *培訓(xùn)和測試期間監(jiān)控的指標(biāo) — *在這里,我們只關(guān)心準(zhǔn)確性(正確分類的圖像的分?jǐn)?shù))。
    損失函數(shù)和優(yōu)化器的確切用途將在整個系列的帖子中明確說明
>>> network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

在訓(xùn)練之前,我們將對數(shù)據(jù)進(jìn)行預(yù)處理,將其重塑為網(wǎng)絡(luò)所期望的形狀,并對其進(jìn)行縮放,使所有值都在[0,1]區(qū)間內(nèi)。例如,以前,我們的訓(xùn)練圖像存儲在uint8類型的形狀數(shù)組(60000,28,28)中,值在[0,255]區(qū)間內(nèi)。我們將其轉(zhuǎn)換為值介于0和1之間的float32形狀數(shù)組(60000,28*28)。

準(zhǔn)備圖像數(shù)據(jù)

>>> train_images = train_images.reshape((60000, 28 * 28))
>>> train_images = train_images.astype('float32') / 255
>>> test_images = test_images.reshape((10000, 28 * 28))
>>> test_images = test_images.astype('float32') / 255

我們還需要對標(biāo)簽進(jìn)行分類編碼。

>>> from keras.utils import to_categorical
>>> train_labels = to_categorical(train_labels)
>>> test_labels = to_categorical(test_labels)

我們現(xiàn)在已經(jīng)準(zhǔn)備好對網(wǎng)絡(luò)進(jìn)行培訓(xùn),在Keras,這是通過調(diào)用網(wǎng)絡(luò)的fitmethod來完成的—我們將模型與其培訓(xùn)數(shù)據(jù)相匹配:

>>> network.fit(train_images, train_labels, epochs=5, batch_size=128)
Epoch 1/5
2018-08-31 10:06:23.500151: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
60000/60000 [==============================] - 4s 67us/step - loss: 0.2561 - acc: 0.9247
Epoch 2/5
60000/60000 [==============================] - 3s 56us/step - loss: 0.1044 - acc: 0.9692
Epoch 3/5
60000/60000 [==============================] - 3s 56us/step - loss: 0.0696 - acc: 0.9790
Epoch 4/5
60000/60000 [==============================] - 3s 56us/step - loss: 0.0501 - acc: 0.9854
Epoch 5/5
60000/60000 [==============================] - 3s 56us/step - loss: 0.0376 - acc: 0.9884
<keras.callbacks.History object at 0x7fa9537b3e80>

注意:我用的是AMD Ryzen? 5 2500U Quad-Core 和 AMD Radeon? Vega M Graphics-你的結(jié)果可能會有所不同。
訓(xùn)練過程中會顯示兩個數(shù)量:網(wǎng)絡(luò)在訓(xùn)練數(shù)據(jù)上的丟失和網(wǎng)絡(luò)在訓(xùn)練數(shù)據(jù)上的準(zhǔn)確性。
在訓(xùn)練數(shù)據(jù)上,我們很快達(dá)到了0.9884(98.84%)的準(zhǔn)確率?,F(xiàn)在讓我們檢查一下模型在測試集上是否也表現(xiàn)良好:

>>> test_loss, test_acc = network.evaluate(test_images, test_labels)
10000/10000 [==============================] - 0s 42us/step
>>> print('test_acc:', test_acc)
test_acc: 0.9792

測試集的準(zhǔn)確度是97.92%,比訓(xùn)練集的準(zhǔn)確度要低一點(diǎn)。訓(xùn)練精度和測試精度之間的差距就是一個過度擬合的例子:機(jī)器學(xué)習(xí)模型在新數(shù)據(jù)上的表現(xiàn)往往比在訓(xùn)練數(shù)據(jù)上的表現(xiàn)差。
MNIST的例子到此結(jié)束——您剛剛看到了如何構(gòu)建和訓(xùn)練一個神經(jīng)網(wǎng)絡(luò),用不到20行的Python代碼對手寫數(shù)字進(jìn)行分類。

Chollet, Fran?ois. Deep learning with Python. Shelter Island, NY: Manning Publications Co, 2018. Print.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容