1. 程式人生 > 其它 >如何為Keras中的深度學習模型建立Checkpoint

如何為Keras中的深度學習模型建立Checkpoint

深度學習模式可能需要幾個小時,幾天甚至幾周的時間來訓練。

如果執行意外停止,你可能就白乾了。

在這篇文章中,你將會發現在使用Keras庫的Python訓練過程中,如何檢查你的深度學習模型。

讓我們開始吧。

  • 2017/03/07更新:更新了Keras 2.0.2,TensorFlow 1.0.1和Theano 0.9.0的示例。

圖片版權所有saragoldsmith

Checkpoint神經網路模型

應用程式Checkpoint是為長時間執行程序準備的容錯技術。

這是一種在系統故障的情況下拍攝系統狀態快照的方法。一旦出現問題不會讓進度全部丟失。Checkpoint可以直接使用,也可以作為從它停止的地方重新執行的起點。

訓練深度學習模型時,Checkpoint是模型的權重。他們可以用來作預測,或作持續訓練的基礎。

Keras庫通過回撥API提供Checkpoint功能。

ModelCheckpoint回撥類允許你定義檢查模型權重的位置在何處,檔案應如何命名,以及在什麼情況下建立模型的Checkpoint。

API允許你指定要監視的指標,例如訓練或驗證資料集的丟失或準確性。你可以指定是否尋求最大化或最小化分數的改進。最後,用於儲存權重的檔名可以包括諸如訓練次數的編號或標準的變數。

當模型上呼叫fit()函式時,可以將ModelCheckpoint傳遞給訓練過程。

注意,你可能需要安裝h5py庫以HDF5格式輸出網路權重。

Checkpoint神經網路模型改進

應用Checkpoint時,應在每次訓練中觀察到改進時輸出模型權重。

下面的示例建立一個小型神經網路Pima印第安人發生糖尿病的二元分類問題。你可以在UCI機器學習庫下載這個資料集。本示例使用33%的資料進行驗證。

Checkpoint設定成當驗證資料集的分類精度提高時儲存網路權重(monitor=’val_acc’ and mode=’max’)。權重儲存在一個包含評價的檔案中(weights-improvement – { val_acc = .2f } .hdf5)。

# Checkpoint the weights when validation accuracy improves
from keras.modelsimport Sequential
from keras.layersimport Dense
from keras.callbacksimport ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
# fix random seed for reproducibility
seed= 7
numpy.random.seed(seed)
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# create model
model= Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# checkpoint
filepath="weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5"
checkpoint= ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list= [checkpoint]
# Fit the model
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0)

執行示例會生成以下輸出(有刪節):

...
Epoch00134: val_acc didnot improve
Epoch00135: val_acc didnot improve
Epoch00136: val_acc didnot improve
Epoch00137: val_acc didnot improve
Epoch00138: val_acc didnot improve
Epoch00139: val_acc didnot improve
Epoch00140: val_acc improvedfrom 0.83465 to0.83858, saving model to weights-improvement-140-0.84.hdf5
Epoch00141: val_acc didnot improve
Epoch00142: val_acc didnot improve
Epoch00143: val_acc didnot improve
Epoch00144: val_acc didnot improve
Epoch00145: val_acc didnot improve
Epoch00146: val_acc improvedfrom 0.83858 to0.84252, saving model to weights-improvement-146-0.84.hdf5
Epoch00147: val_acc didnot improve
Epoch00148: val_acc improvedfrom 0.84252 to0.84252, saving model to weights-improvement-148-0.84.hdf5
Epoch00149: val_acc didnot improve

你將在工作目錄中看到包含多個HDF5格式的網路權重檔案。例如:

...
weights-improvement-53-0.76.hdf5
weights-improvement-71-0.76.hdf5
weights-improvement-77-0.78.hdf5
weights-improvement-99-0.78.hdf5

這是一個非常簡單的Checkpoint策略。如果驗證精度在訓練週期上下波動 ,則可能會建立大量不必要的Checkpoint檔案。然而,它將確保你具有在執行期間發現的最佳模型的快照。

Checkpoint最佳神經網路模型

如果驗證精度提高的話,一個更簡單的Checkpoint策略是將模型權重儲存到相同的檔案中。

這可以使用上述相同的程式碼輕鬆完成,並將輸出檔名更改為固定(不包括評價或次數的資訊)。

在這種情況下,只有當驗證資料集上的模型的分類精度提高到到目前為止最好的時候,才會將模型權重寫入檔案“weights.best.hdf5”。

# Checkpoint the weights for best model on validation accuracy
from keras.modelsimport Sequential
from keras.layersimport Dense
from keras.callbacksimport ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
# fix random seed for reproducibility
seed= 7
numpy.random.seed(seed)
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# create model
model= Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# checkpoint
filepath="weights.best.hdf5"
checkpoint= ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list= [checkpoint]
# Fit the model
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0)

執行示例會生成以下輸出(有刪節):

...
Epoch00139: val_acc improvedfrom 0.79134 to0.79134, saving model to weights.best.hdf5
Epoch00140: val_acc didnot improve
Epoch00141: val_acc didnot improve
Epoch00142: val_acc didnot improve
Epoch00143: val_acc didnot improve
Epoch00144: val_acc improvedfrom 0.79134 to0.79528, saving model to weights.best.hdf5
Epoch00145: val_acc improvedfrom 0.79528 to0.79528, saving model to weights.best.hdf5
Epoch00146: val_acc didnot improve
Epoch00147: val_acc didnot improve
Epoch00148: val_acc didnot improve
Epoch00149: val_acc didnot improve

你應該在本地目錄中看到權重檔案:

weights.best.hdf5

這是一個在你的實驗中需要經常用到的方便的Checkpoint策略。它將確保你的最佳模型被儲存,以便稍後使用。它避免了輸入程式碼來手動跟蹤,並在訓練時序列化最佳模型。

載入Checkpoint神經網路模型

現在你已經瞭解瞭如何在訓練期間檢查深度學習模型,你需要回顧一下如何載入和使用一個Checkpoint模型。

Checkpoint只包括模型權重。它假定你瞭解網路結構。這也可以序列化成JSON或YAML格式。

在下面的示例中,模型結構是已知的,並且最好的權重從先前的實驗中載入,然後儲存在weights.best.hdf5檔案的工作目錄中。

那麼將該模型用於對整個資料集進行預測。

# How to load and use weights from a checkpoint
from keras.modelsimport Sequential
from keras.layersimport Dense
from keras.callbacksimport ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
# fix random seed for reproducibility
seed= 7
numpy.random.seed(seed)
# create model
model= Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# load weights
model.load_weights("weights.best.hdf5")
# Compile model (required to make predictions)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print("Created model and loaded weights from file")
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# estimate accuracy on whole dataset using loaded weights
scores= model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
執行示例生成以下輸出:
Created modeland loaded weightsfrom file
acc:77.73%

總結

在這篇文章中,你已經發現Checkpoint對深度學習模型長期訓練的重要性。

你學習了兩種可用於你下一個深入Checkpoint學習專案的Checkpoint策略:

  1. Checkpoint模型改進。
  2. Checkpoint的最佳模型。

你還學習瞭如何載入Checkpoint模型並做出預測。

原文:http://machinelearningmastery.com/check-point-deep-learning-models-keras/

深度學習模式可能需要幾個小時,幾天甚至幾周的時間來訓練。

如果執行意外停止,你可能就白乾了。

在這篇文章中,你將會發現在使用Keras庫的Python訓練過程中,如何檢查你的深度學習模型。

讓我們開始吧。

  • 2017/03/07更新:更新了Keras 2.0.2,TensorFlow 1.0.1和Theano 0.9.0的示例。

圖片版權所有saragoldsmith

Checkpoint神經網路模型

應用程式Checkpoint是為長時間執行程序準備的容錯技術。

這是一種在系統故障的情況下拍攝系統狀態快照的方法。一旦出現問題不會讓進度全部丟失。Checkpoint可以直接使用,也可以作為從它停止的地方重新執行的起點。

訓練深度學習模型時,Checkpoint是模型的權重。他們可以用來作預測,或作持續訓練的基礎。

Keras庫通過回撥API提供Checkpoint功能。

ModelCheckpoint回撥類允許你定義檢查模型權重的位置在何處,檔案應如何命名,以及在什麼情況下建立模型的Checkpoint。

API允許你指定要監視的指標,例如訓練或驗證資料集的丟失或準確性。你可以指定是否尋求最大化或最小化分數的改進。最後,用於儲存權重的檔名可以包括諸如訓練次數的編號或標準的變數。

當模型上呼叫fit()函式時,可以將ModelCheckpoint傳遞給訓練過程。

注意,你可能需要安裝h5py庫以HDF5格式輸出網路權重。

Checkpoint神經網路模型改進

應用Checkpoint時,應在每次訓練中觀察到改進時輸出模型權重。

下面的示例建立一個小型神經網路Pima印第安人發生糖尿病的二元分類問題。你可以在UCI機器學習庫下載這個資料集。本示例使用33%的資料進行驗證。

Checkpoint設定成當驗證資料集的分類精度提高時儲存網路權重(monitor=’val_acc’ and mode=’max’)。權重儲存在一個包含評價的檔案中(weights-improvement – { val_acc = .2f } .hdf5)。

# Checkpoint the weights when validation accuracy improves
from keras.modelsimport Sequential
from keras.layersimport Dense
from keras.callbacksimport ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
# fix random seed for reproducibility
seed= 7
numpy.random.seed(seed)
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# create model
model= Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# checkpoint
filepath="weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5"
checkpoint= ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list= [checkpoint]
# Fit the model
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0)

執行示例會生成以下輸出(有刪節):

...
Epoch00134: val_acc didnot improve
Epoch00135: val_acc didnot improve
Epoch00136: val_acc didnot improve
Epoch00137: val_acc didnot improve
Epoch00138: val_acc didnot improve
Epoch00139: val_acc didnot improve
Epoch00140: val_acc improvedfrom 0.83465 to0.83858, saving model to weights-improvement-140-0.84.hdf5
Epoch00141: val_acc didnot improve
Epoch00142: val_acc didnot improve
Epoch00143: val_acc didnot improve
Epoch00144: val_acc didnot improve
Epoch00145: val_acc didnot improve
Epoch00146: val_acc improvedfrom 0.83858 to0.84252, saving model to weights-improvement-146-0.84.hdf5
Epoch00147: val_acc didnot improve
Epoch00148: val_acc improvedfrom 0.84252 to0.84252, saving model to weights-improvement-148-0.84.hdf5
Epoch00149: val_acc didnot improve

你將在工作目錄中看到包含多個HDF5格式的網路權重檔案。例如:

...
weights-improvement-53-0.76.hdf5
weights-improvement-71-0.76.hdf5
weights-improvement-77-0.78.hdf5
weights-improvement-99-0.78.hdf5

這是一個非常簡單的Checkpoint策略。如果驗證精度在訓練週期上下波動 ,則可能會建立大量不必要的Checkpoint檔案。然而,它將確保你具有在執行期間發現的最佳模型的快照。

Checkpoint最佳神經網路模型

如果驗證精度提高的話,一個更簡單的Checkpoint策略是將模型權重儲存到相同的檔案中。

這可以使用上述相同的程式碼輕鬆完成,並將輸出檔名更改為固定(不包括評價或次數的資訊)。

在這種情況下,只有當驗證資料集上的模型的分類精度提高到到目前為止最好的時候,才會將模型權重寫入檔案“weights.best.hdf5”。

# Checkpoint the weights for best model on validation accuracy
from keras.modelsimport Sequential
from keras.layersimport Dense
from keras.callbacksimport ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
# fix random seed for reproducibility
seed= 7
numpy.random.seed(seed)
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# create model
model= Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# checkpoint
filepath="weights.best.hdf5"
checkpoint= ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list= [checkpoint]
# Fit the model
model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, callbacks=callbacks_list, verbose=0)
執行示例會生成以下輸出(有刪節):
...
Epoch00139: val_acc improvedfrom 0.79134 to0.79134, saving model to weights.best.hdf5
Epoch00140: val_acc didnot improve
Epoch00141: val_acc didnot improve
Epoch00142: val_acc didnot improve
Epoch00143: val_acc didnot improve
Epoch00144: val_acc improvedfrom 0.79134 to0.79528, saving model to weights.best.hdf5
Epoch00145: val_acc improvedfrom 0.79528 to0.79528, saving model to weights.best.hdf5
Epoch00146: val_acc didnot improve
Epoch00147: val_acc didnot improve
Epoch00148: val_acc didnot improve
Epoch00149: val_acc didnot improve

你應該在本地目錄中看到權重檔案:

weights.best.hdf5

這是一個在你的實驗中需要經常用到的方便的Checkpoint策略。它將確保你的最佳模型被儲存,以便稍後使用。它避免了輸入程式碼來手動跟蹤,並在訓練時序列化最佳模型。

載入Checkpoint神經網路模型

現在你已經瞭解瞭如何在訓練期間檢查深度學習模型,你需要回顧一下如何載入和使用一個Checkpoint模型。

Checkpoint只包括模型權重。它假定你瞭解網路結構。這也可以序列化成JSON或YAML格式。

在下面的示例中,模型結構是已知的,並且最好的權重從先前的實驗中載入,然後儲存在weights.best.hdf5檔案的工作目錄中。

那麼將該模型用於對整個資料集進行預測。

# How to load and use weights from a checkpoint
from keras.modelsimport Sequential
from keras.layersimport Dense
from keras.callbacksimport ModelCheckpoint
import matplotlib.pyplot as plt
import numpy
# fix random seed for reproducibility
seed= 7
numpy.random.seed(seed)
# create model
model= Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
# load weights
model.load_weights("weights.best.hdf5")
# Compile model (required to make predictions)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print("Created model and loaded weights from file")
# load pima indians dataset
dataset= numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X= dataset[:,0:8]
Y= dataset[:,8]
# estimate accuracy on whole dataset using loaded weights
scores= model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

執行示例生成以下輸出:

Created modeland loaded weightsfrom file
acc:77.73%

總結

在這篇文章中,你已經發現Checkpoint對深度學習模型長期訓練的重要性。

你學習了兩種可用於你下一個深入Checkpoint學習專案的Checkpoint策略:1. Checkpoint模型改進。

2. Checkpoint的最佳模型。

你還學習瞭如何載入Checkpoint模型並做出預測。

原文:http://machinelearningmastery.com/check-point-deep-learning-models-keras/