當前位置:
首頁 > 知識 > 有源碼提供:還在苦惱如何寫CNN網路?看大神如何使用keras11行代碼構建CNN網路

有源碼提供:還在苦惱如何寫CNN網路?看大神如何使用keras11行代碼構建CNN網路

有源碼提供:還在苦惱如何寫CNN網路?看大神如何使用keras11行代碼構建CNN網路

我曾經演示過如何使用TensorFlow創建卷積神經網路(CNN)來對MNIST手寫數字數據集進行分類。TensorFlow是一款精湛的工具,具有強大的功能和靈活性。然而,對於快速原型製作工作,可能顯得有些麻煩。Keras是一個運行在TensorFlow或者Theano的更高級別的庫,旨在流線化構建深度學習網路的過程。事實上,在上一篇TensorFlow教程中,TensorFlow大約需要42行完成的內容,在Keras中只需11行就可以完成類似的功能。接下來我將向你展示如何通過Keras做到這一點。

該Keras教程將向你展示如何使用MNIST數據集構建CNN並實現> 99%的準確性。它與我之前的卷積神經網路教程中構建的結構完全相同,下圖顯示了網路的架構:

有源碼提供:還在苦惱如何寫CNN網路?看大神如何使用keras11行代碼構建CNN網路

這個Keras教程的完整代碼可以在這裡找到。

Keras教程中的主要代碼講解:

下面的代碼是在此Keras教程中使用的CNN結構的「膽量」

model = Sequential()model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1),

接下來我們一步一步的來解釋:

Model = Sequential()

Keras中的模型可以有兩種——序貫和通過API函數。對於構建的大多數深度學習網路,序貫模型是最常用的。它允許你從輸入到輸出整個過程都能輕鬆地堆疊網路層(甚至循環層)。而API函數可以幫助你構建更複雜的網路體系結構,本教程將不介紹它。

第一行將模型類型聲明為Sequential()。

model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1),

接下來,我們添加一個2D卷積層來處理2D MNIST輸入的圖像。傳遞給Conv2D()函數的第一個參數是輸出通道的數量。這裡我們設置為我們有32個輸出通道,下一個輸入是kernel_size,我們選擇了一個5×5移動窗口,其次是x和y方向(1,1)的步態。接著,激活函數是整流線性單元,最後我們必須與輸入層的大小提供模型。

還要注意,我們不必聲明任何權重或偏差變數,Keras會幫助我們進行完成。

model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

接下來我們添加一個2D max pooling層。層的定義很簡單。在這種情況下,我們只是簡單地指定在x和y方向上的池的大小和(2,2)的步。

model.add(Conv2D(64, (5, 5), activation="relu"))model.add(MaxPooling2D(pool_size=(2, 2)))

接下來,我們添加另一個卷積層+最大池化層,具有64個輸出通道。在Keras中Conv2D()函數的參數默認的步伐是(1,1),在Keras 中默認步伐是使它等於池的大小。

該層的輸入張量是(batch_size,28,28,32)28×28是圖像的大小,32是來自上一層的輸出通道數。但是,我們不必明確說明輸入的形狀是什麼,Keras也能自動識別。這樣可以快速組合網路架構,而不用擔心網路周圍張量的大小。

model.add(Flatten())model.add(Dense(1000, activation="relu"))model.add(Dense(num_classes, activation="softmax"))

現在我們已經在Keras中構建了卷積層,我們希望將這些輸出平坦化,以完全進入我們的連接層。在TensorFlow中,我們為了平坦化必須弄清楚卷積層的輸出張量的大小,還要明確我們的權重和偏差變數的大小。

接下來的兩行聲明了我們的完全連接層,使用Keras中的Dense()層。首先我們指定大小,根據我們的架構,我們指定了1000個節點,每個節點都是由ReLU功能激活。第二個是我們softmax分類或輸出層,這是我們類數量的大小。就這樣 - 我們已經成功地開發了CNN的架構,只有8行代碼。現在讓我們來訓練模型並執行預測。

訓練和評估卷積神經網路

我們已經開發了Keras的CNN架構,但是我們還沒有指定損失函數,或者告訴框架使用哪種類型的優化器(即梯度下降,Adam optimiser等)。在Keras中,這些可以在一個命令中執行:

model.compile(loss=keras.losses.categorical_crossentropy,

Keras提供了許多損失函數(或者你可以建立自己的),這裡可以看到的keras所有的損失函數。我們將使用標準交叉熵來進行分類(keras.losses.categorical_crossentropy)。Keras還提供了許多優化器,可以在這裡看到。在這種情況下,我們使用Adam優化器(keras.optimizers.Adam)。最後,我們可以在模型上運行evaluate()時計算的度量。

接下來,我們要訓練我們的模型。這可以通過在Keras中再次運行下面這個命令來完成:

model.fit(x_train, y_train,

該命令看起來類似於非常受歡迎的Python機器學習庫中scikit learn使用的語法。我們首先傳遞我們的所有訓練的數據,x_train和y_train,下一個參數是批量大小,我們不必在Keras訓練期間明確我們數據的批量處理,而是指定批量大小。在這種情況下,我們使用的批量大小為128。接下來我們設置訓練周期(在這種情況下為10)。詳細標誌在此處設置為1,指定設定是否要在控制台中列印詳細信息以了解訓練進度。

3328/60000 [>.............................] - ETA: 87s - loss: 0.2180 - acc: 0.9336

3456/60000 [>.............................] - ETA: 87s - loss: 0.2158 - acc: 0.9349

3584/60000 [>.............................] - ETA: 87s - loss: 0.2145 - acc: 0.9350

3712/60000 [>.............................] - ETA: 86s - loss: 0.2150 - acc: 0.9348

最後,我們將驗證或測試數據傳遞給擬合函數,因此Keras知道在模型上運行evaluate()時,會測量指標的數據。

一旦模型被訓練,我們可以評估它並列印結果:

score = model.evaluate(x_test, y_test, verbose=0)print("Test loss:", score[0])print("Test accuracy:", score[1])

在上述模型培訓10個周期之後,我們實現了99.2%的準確度,你可以看到每個周期的準確性的改善如下圖所示:

有源碼提供:還在苦惱如何寫CNN網路?看大神如何使用keras11行代碼構建CNN網路

Kersa讓事情很更加簡單了,你不覺得嗎?我希望這個Keras教程已經展示了它如何成為深度學習解決方案的有用框架。

作為一種附錄,我會告訴你如何跟蹤我們通過訓練時期的準確性,這使我能夠生成上面的圖表。

在Keras中記錄網路性能

Keras有一個實用的程序,名為「回調」,可用於跟蹤訓練期間的各種變數。你還可以使用它來創建檢查點,將模型在訓練的不同階段進行保存,以幫助你避免工作結果丟失。整個結果會被傳遞到.fit()函數,如上所述。我會向你顯示一個相當簡單的用例,其中記錄了準確性。

要創建一個回調,我們創建一個繼承的類,它繼承自keras.callbacks.Callback:

class AccuracyHistory(keras.callbacks.Callback):

上面代碼繼承的Callback超類有一些可以在我們的回調定義中覆蓋的方法,例如 on_train_begin,on_epoch_end,on_batch_begin和on_batch_end。這些方法的名稱就是代表了訓練過程中我們可以「做事情」的時刻。在上面的代碼中,在訓練開始時,我們初始化一個列表self.acc = []來存儲我們的精度結果。使用on_epoch_end ()方法,我們可以從日誌中提取我們想要的變數,這是一個字典,默認情況下保留了訓練過程中的丟失和準確性。然後我們實例化這樣的回調:

history = AccuracyHistory()

現在我們可以使用回調參數名將歷史記錄傳遞給.fit()函數。請注意,.fit()需要一個回調參數的列表,所以你必須傳遞這樣的歷史:[history]。要訪問我們在訓練完成後創建的準確性列表,你可以簡單地調用history.acc:

plt.plot(range(1,11), history.acc)

本文由@阿里云云棲社區組織翻譯。

文章原標題《Keras tutorial – build a convolutional neural network in 11 lines》

作者:Andy譯者:袁虎

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲棲社區 的精彩文章:

安全態勢,交互發現——基於阿里雲輕鬆搭建安全大屏
程序猿轉型AI必須知道的幾件事!
未來的超級智能網路攻擊需要AI競技俱樂部來拯救
用AI防範金融風險,螞蟻金服:「AI技術成熟一個開放一個」

TAG:雲棲社區 |

您可能感興趣

Reddit熱議:只要2行代碼,免費開源ML管理工具TRAINS
利用PHPstorm進行代碼review
如何使用Reviewboard進行代碼Review?
PyTorch代碼調試利器:自動print每行代碼的Tensor信息
Oracle開源GraphPipe:幾行代碼讓你在TensorFlow部署PyTorch模型
GitHub推出新功能Actions,直接網站上構建、共享和執行代碼
一行代碼切換TensorFlow與PyTorch,模型訓練也能用倆框架
漏洞交易公司Zerodium披露:NoScript漏洞允許在Tor中執行代碼
iOS被曝新漏洞:15行代碼讓iPhone崩潰
textgenrnn:只需幾行代碼即可訓練文本生成網路
一行代碼下載 Instagram 圖片
GitHub發布GitHub Actions平台,可直接運行代碼
白話生成對抗網路 GAN,50 行代碼玩轉 GAN 模型!附源碼
TP-Link TL-WR740N存在嚴重漏洞,允許攻擊者在設備上遠程執行代碼
Jeff Dean推薦:用TPU跑Julia程序,只需不到1000行代碼
iOS被爆新漏洞:只需15行代碼就可以讓你的iPhone崩潰重啟!
5行代碼秀碾壓,比Keras還好用的fastai來了,嘗鮮PyTorch 1.0必備伴侶
資源 | Pandas on Ray:僅需改動一行代碼,即可讓Pandas加速四倍
Pandas on Ray:僅需改動一行代碼,即可讓Pandas加速四倍
PyTorch Hub:圖靈獎得主 Yann LeCun 強推!一行代碼輕鬆復現主流模型