[英]How to save best weights of the encoder part only during auto-encoder training??
我正在使用帶有張量流的 keras 來實現帶有 CNN 的深度自動編碼器:
所以基本上模型類似於:
input_data = Input(shape=(40,500,1))
#encoder
x= Conv2D(32,kernel_size=(3,3), padding="same",activation='linear')(input_data)
encoded= Conv2D(15,kernel_size=(1,2), strides=(1,2), padding="same",activation='linear')(x)
#decoder
x= Conv2DTranspose(15,kernel_size=(1,2), padding="same",activation='linear')(encoded)
x= Conv2DTranspose(32,kernel_size=(3,3), padding="same",activation='linear')(x)
decoded = Conv2DTranspose(1, (3, 3), activation=activationfuntion, padding="same")(x)
autoencoder = Model(inputs=input_data,outputs=decoded)
encoder = Model(inputs=input_data,outputs=encoded)
為了在訓練期間保存最佳模型權重,我使用了 ModelCheckpoint:
autoencoder.compile(loss='mean_squared_error', optimizer='rmsprop');
checkpoint=ModelCheckpoint('bestweight.best.hdf5',monitor='val_loss',verbose=1,save_best_only=True,mode='min');
callbacks_list=[checkpoint]
history_info =autoencoder.fit(x_train, x_train,
batch_size=batch_size,
epochs=50,
validation_data=(x_validation,x_validation),
callbacks=callbacks_list,
shuffle=True)
然后在測試數據集上進行測試:
autoencoder.load_weights('bestweight.best.hdf5');
autoencoder.predict(test_data);
我的問題是:
我知道如何保存整個自動編碼器的最佳權重,但是有沒有辦法只保存編碼器部分的最佳訓練權重,以便我以后可以使用它進行測試。 所以我可以這樣使用它:
encoder.load_weights('encoderbestweight.best.hdf5');
encoder.predict(test_data);
在嘗試回答您的問題之前,我想對您對 ModelCheckpoint 回調的使用做一個簡短的評論。 讓我們看看默認參數:
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
save_weights_only參數的默認值為False ,這意味着您實際保存的不僅是模型的權重,還包括整個架構! 因此,在加載模型的權重時,您可以重新定義模型並使用load_weights 。 或者,您可以使用load_model函數直接從文件加載模型。
現在,為了僅保存編碼器,我將編寫一個新的檢查點回調,如下所示:
class CustomCheckpoint(Callback):
def __init__(self, filepath, encoder):
self.monitor = 'val_loss'
self.monitor_op = np.less
self.best = np.Inf
self.filepath = filepath
self.encoder = encoder
def on_epoch_end(self, epoch, logs=None):
current = logs.get(self.monitor)
if self.monitor_op(current, self.best):
self.best = current
# self.encoder.save_weights(self.filepath, overwrite=True)
self.encoder.save(self.filepath, overwrite=True) # Whichever you prefer
作為替代方案,由於您已經擁有整個網絡的保存文件,您可以像這樣將編碼器與解碼器分開:
from keras.models import load_model
autoencoder = load_model("path_to_file")
encoder = Model(autoencoder.layers[0].input, autoencoder.layers[1].output)
編碼器部分是前兩層。 所以在“autoencoder.fit()”之后試試這個
encoder = Model(input_data, autoencoder.layers[2].output)
更多“https://www.kaggle.com/marlesson/autoencoder-embedding-for-food”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.