我正在使用具有张量流的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)
,然后稍后在testdataset上进行测试:
autoencoder.load_weights('bestweight.best.hdf5');
autoencoder.predict(test_data);
我的问题是:
我知道如何保存整个自动编码器的最佳权重,但是有一种方法可以保存 encoder 部分的最佳训练权重,以便以后用于测试。 所以我可以这样使用它:
encoder.load_weights('encoderbestweight.best.hdf5');
encoder.predict(test_data);
答案 0 :(得分: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)
答案 1 :(得分:0)
编码器部分是前两层。所以在“ autoencoder.fit()”之后尝试一下
encoder = Model(input_data, autoencoder.layers[2].output)
了解更多“ https://www.kaggle.com/marlesson/autoencoder-embedding-for-food”