簡體   English   中英

如何僅在自動編碼器訓練期間保存編碼器部分的最佳權重?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM