用Keras從零開始6步驟訓練神經網路

本文將簡要介紹Keras的功能特點,使用Keras構建模型一般流程的6個步驟,以及使用Keras處理mnist分類問題的一個簡單範例。

一,Keras簡介

Keras 是一個用 Python 編寫的高級神經網路 API,它能夠以 TensorFlow,Theano 或者 CNTK, MXNet 作為後端運行。

Keras 具有以下優勢:

簡單易用:Keras是為人類而不是為機器設計的 API。它把用戶體驗放在首要和中心位置。Keras遵循減少認知困難的最佳實踐,它提供一致且簡單的 API,將常見用例所需的用戶操作數量降至最低,並且在用戶錯誤時提供清晰和可操作的反饋。

功能強大:Keras同時支持卷積神經網路

和循環神經網路,以及兩者的組合,它可以在CPU和GPU上無縫運行。Keras不僅提供了構建和訓練神經網路模型的高級功能,還提供了模型結果可視化的工具,以及常見的圖像和文本數據的預處理工具,另外Keras中還包括一些常用的玩具數據集和一些著名的已經訓練好的神經網路模型。

高度靈活:用戶可以使用Keras的函數式API構建任意結構的神經網路,如多輸入多輸出結構,殘差網路,Inception網路等。通過自定義層和自定義模型,用戶可以實現高度定製化的功能。利用Keras的後端backend提供的一些函數用戶甚至可以從底層開始實現任意模型。

總之,這幾乎是一個無懈可擊的封裝,集極致的體驗,強大的功能,無限的靈活性於一身。

這就是Keras,你恰好發現了她!

目前Keras是github排名第二的開源深度學習

框架,也是Kaggle競賽中使用人數最多的神經網路框架。

二,使用流程

使用Keras進行神經網路實驗的一般流程包括以下6個步驟。其中準備數據,構建模型和訓練模型是必選的3個步驟。

1,準備數據:

可以從keras的dataset導入玩具數據集,也可以導入外部數據集,並使用圖像,文本,序列等數據預處理工具進行數據預處理。當數據規模較大時,需要使用Sequence等工具構建數據管道以備在訓練過程中並行讀取。

2,構建模型

可以使用以下3種方式構建模型:使用Sequential按層順序構建模型,使用函數式API構建任意結構模型,繼承Model基類構建自定義模型。

模型由層layer組成,keras中有許多已經定義好的層,用戶可以使用backend函數定義Lambda匿名層,此外用戶也可以繼承Layer層基類構建自定義層。

另外,用戶也可以將application中已經訓練好的模型載入進來,對其進行微調或者將其部分結構作為模型的一部分,模型本身也可以被看成一個層。

構建完模型後,需要用compile方法來編譯模型,指定優化器,目標函數,評估指標,以及回調函數。

可以用summary方法來查看模型的結構和參數數量。也可以用plot_model方法來可視化模型的結構圖。

如果需要使用tensorboard來對模型結構圖及訓練過程進行可視化,可以調用tensorboard回調函數。

3,訓練模型

一般情況下可以用模型的fit方法訓練模型,當數據集較大時,應當使用內存友好的fit_generator方法訓練模型,如果需要細粒度的自定義訓練過程,可以用train_on_batch逐批次地訓練模型。

如果需要使用GPU訓練模型,需要安裝CUDA和cuDNN以支持相應計算,並安裝tensorflow-gpu版本,則可以無縫切換到GPU運行。

如果需要使用多個GPU訓練模型,可以使用keras.utils.multi_gpu_model創建支持多個GPU同時訓練的模型。

4,評估模型

在通常情況下,訓練模型時候指定驗證集就可以在訓練過程中輸出模型的在訓練集和驗證集的損失和評估指標。然後可以用matplotlib將結果可視化,也可以利用回調函數在tensorboard中進行可視化。如果需要自定義評估指標,可以利用backend介面進行編寫。

在模型訓練完成後,可以用evaluate方法對模型進行評估,當數據集較大時,使用對內存友好的evaluate_generator方法評估模型,如果需要細粒度的評估,可以用test_on_batch在一個批次上評估模型。

5,使用模型

一般情況下使用模型的predict方法進行預測,當數據集較大時,使用predict_generator方法進行預測。

6,保存模型

keras可以用模型的save方法保存模型的結構和權重到.h5文件,也可以用save_weight方法只保存模型的權重到.h5文件,也可以用to_json或者to_yaml方法只保存模型的結構到json或者yaml文件。

三,mnist分類範例

我們以mnist手寫數字識別數據集為例介紹分類範例。這是一個多分類問題。

import keras
import tensorflow as tf
from keras import backend as K

1,導入數據

from keras import datasets

# 從自帶數據集載入數據
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()

# 將數據reshape並縮放
x_train = x_train.reshape((-1, 28 * 28))
x_train = x_train.astype(float32) / 255
x_test = x_test.reshape((-1,28*28))
x_test = x_test.astype(float32) / 255

from keras import utils

# 將標籤轉換為onehot編碼
y_train = utils.to_categorical(y_train,num_classes= 10)
y_test = utils.to_categorical(y_test,num_classes= 10)

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

2,構建模型

from keras import models,layers

model = models.Sequential()
model.add(layers.Dense(512,activation = relu,input_shape=(28 * 28,)))
model.add(layers.Dense(10,activation = softmax ))

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

model.summary()

3,訓練模型

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

4,評估模型

import matplotlib.pyplot as plt

%matplotlib inline
%config InlineBackend.figure_format = svg

acc = history.history[acc]
val_acc = history.history[val_acc]
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, bo, label=Training accuracy)
plt.plot(epochs, val_acc, b, label=Validation accuracy)
plt.title(Training and validation accuracy)
plt.xlabel(Epochs)
plt.ylabel(Accuracy)
plt.legend()
plt.show()

5,使用模型

6,保存模型

# 保存模型結構及權重
model.save(my_model.h5)

del model

# 恢復模型結構及權重
model = models.load_model(my_model.h5)
model.evaluate(x_test,y_test)


推薦閱讀:

No.3--Prerequisites and Notation
Deep neural network in vedio based person re-id
【2.改善深層神經網路】第一周深度學習實踐-Dpt【筆記3】
深度教練:讓深度學習模擬人類教學過程,大幅減少訓練數據和時間
神經網路-卷積

TAG:Keras | 深度學習(DeepLearning) | 神經網路 |