【问题标题】:How to save best weights of the encoder part only during auto-encoder training??如何仅在自动编码器训练期间保存编码器部分的最佳权重?
【发布时间】:2018-06-22 07:39:47
【问题描述】:

我正在使用带有张量流的 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);

【问题讨论】:

    标签: python tensorflow keras autoencoder


    【解决方案1】:

    在尝试回答您的问题之前,我想简要说明一下您对 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)
    

    【讨论】:

      【解决方案2】:

      编码器部分是前两层。所以在“autoencoder.fit()”之后试试这个

      encoder = Model(input_data, autoencoder.layers[2].output)

      更多“https://www.kaggle.com/marlesson/autoencoder-embedding-for-food”

      【讨论】:

      • 虽然这个问题没有被接受的答案,但它是在 2.5 年前提出的,并且有 2 个提交的答案。
      • 被问到时没看到。所以,发布了这个可能的答案。
      猜你喜欢
      • 2020-02-10
      • 2021-04-03
      • 2019-12-24
      • 2021-01-29
      • 2021-05-10
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多