我有一个CNN 1d自动编码器,该编码器具有密集的中央层。我想训练这种自动编码器并保存其模型。我还想保留解码器部分,以实现此目标:将一些中心特征(独立计算)提供给经过训练并加载的解码器,以通过解码器查看这些独立计算的特征的图像。
## ENCODER
encoder_input = Input(batch_shape=(None,501,1))
x = Conv1D(256,3, activation='tanh', padding='valid')(encoder_input)
x = MaxPooling1D(2)(x)
x = Conv1D(32,3, activation='tanh', padding='valid')(x)
x = MaxPooling1D(2)(x)
_x = Flatten()(x)
encoded = Dense(32,activation = 'tanh')(_x)
## DECODER (autoencoder)
y = Conv1D(32, 3, activation='tanh', padding='valid')(x)
y = UpSampling1D(2)(y)
y = Conv1D(256, 3, activation='tanh', padding='valid')(y)
y = UpSampling1D(2)(y)
y = Flatten()(y)
y = Dense(501)(y)
decoded = Reshape((501,1))(y)
autoencoder = Model(encoder_input, decoded)
autoencoder.save('autoencoder.hdf5')
## DECODER (independent)
decoder_input = Input(batch_shape=K.int_shape(x)) # import keras.backend as K
y = Conv1D(32, 3, activation='tanh', padding='valid')(decoder_input)
y = UpSampling1D(2)(y)
y = Conv1D(256, 3, activation='tanh', padding='valid')(y)
y = UpSampling1D(2)(y)
y = Flatten()(y)
y = Dense(501)(y)
decoded = Reshape((501,1))(y)
decoder = Model(decoder_input, decoded)
decoder.save('decoder.hdf5')
编辑:
为了确保清楚,我首先需要联接encoded
和第一个y
,因为y
必须以encoded
作为输入。完成此操作后,我需要一种方法来加载经过训练的解码器并将encoded
替换为一些新的主要功能,以便为我的解码器提供资源。
编辑以下答案:
我实现了建议,请参见下面的代码
## ENCODER
encoder_input = Input(batch_shape=(None,501,1))
x = Conv1D(256,3, activation='tanh', padding='valid')(encoder_input)
x = MaxPooling1D(2)(x)
x = Conv1D(32,3, activation='tanh', padding='valid')(x)
x = MaxPooling1D(2)(x)
_x = Flatten()(x)
encoded = Dense(32,activation = 'tanh')(_x)
## DECODER (autoencoder)
encoded = Reshape((32,1))(encoded)
y = Conv1D(32, 3, activation='tanh', padding='valid')(encoded)
y = UpSampling1D(2)(y)
y = Conv1D(256, 3, activation='tanh', padding='valid')(y)
y = UpSampling1D(2)(y)
y = Flatten()(y)
y = Dense(501)(y)
decoded = Reshape((501,1))(y)
autoencoder = Model(encoder_input, decoded)
autoencoder.compile(optimizer='adam', loss='mse')
epochs = 10
batch_size = 100
validation_split = 0.2
# train the model
history = autoencoder.fit(x = training, y = training,
epochs=epochs,
batch_size=batch_size,
validation_split=validation_split)
autoencoder.save_weights('autoencoder_weights.h5')
## DECODER (independent)
decoder_input = Input(batch_shape=K.int_shape(encoded)) # import keras.backend as K
y = Conv1D(32, 3, activation='tanh', padding='valid', name='decod_conv1d_1')(decoder_input)
y = UpSampling1D(2, name='decod_upsampling1d_1')(y)
y = Conv1D(256, 3, activation='tanh', padding='valid', name='decod_conv1d_2')(y)
y = UpSampling1D(2, name='decod_upsampling1d_2')(y)
y = Flatten(name='decod_flatten')(y)
y = Dense(501, name='decod_dense1')(y)
decoded = Reshape((501,1), name='decod_reshape')(y)
decoder = Model(decoder_input, decoded)
decoder.save_weights('decoder_weights.h5')
encoder = Model(inputs=encoder_input, outputs=encoded, name='encoder')
features = encoder.predict(training) # features
np.savetxt('features.txt', np.squeeze(features))
predictions = autoencoder.predict(training)
predictions = np.squeeze(predictions)
np.savetxt('predictions.txt', predictions)
然后我打开另一个文件,然后执行
import h5py
import keras.backend as K
def load_weights(model, filepath):
with h5py.File(filepath, mode='r') as f:
file_layer_names = [n.decode('utf8') for n in f.attrs['layer_names']]
model_layer_names = [layer.name for layer in model.layers]
weight_values_to_load = []
for name in file_layer_names:
if name not in model_layer_names:
print(name, "is ignored; skipping")
continue
g = f[name]
weight_names = [n.decode('utf8') for n in g.attrs['weight_names']]
weight_values = []
if len(weight_names) != 0:
weight_values = [g[weight_name] for weight_name in weight_names]
try:
layer = model.get_layer(name=name)
except:
layer = None
if layer is not None:
symbolic_weights = (layer.trainable_weights +
layer.non_trainable_weights)
if len(symbolic_weights) != len(weight_values):
print('Model & file weights shapes mismatch')
else:
weight_values_to_load += zip(symbolic_weights, weight_values)
K.batch_set_value(weight_values_to_load)
## DECODER (independent)
decoder_input = Input(batch_shape=(None,32,1))
y = Conv1D(32, 3, activation='tanh',padding='valid',name='decod_conv1d_1')(decoder_input)
y = UpSampling1D(2, name='decod_upsampling1d_1')(y)
y = Conv1D(256, 3, activation='tanh', padding='valid', name='decod_conv1d_2')(y)
y = UpSampling1D(2, name='decod_upsampling1d_2')(y)
y = Flatten(name='decod_flatten')(y)
y = Dense(501, name='decod_dense1')(y)
decoded = Reshape((501,1), name='decod_reshape')(y)
decoder = Model(decoder_input, decoded)
#decoder.save_weights('decoder_weights.h5')
load_weights(decoder, 'autoencoder_weights.h5')
# Read autoencoder
decoder.summary()
# read encoded features
features = np.loadtxt('features.txt'.format(batch_size, epochs))
features = np.reshape(features, [1500,32,1])
# evaluate loaded model on features
prediction = decoder.predict(features)
autoencoderpredictions = np.loadtxt('predictions.txt'.format(batch_size, epochs))
fig, ax = plt.subplots(5, figsize=(10,20))
for i in range(5):
ax[i].plot(prediction[100*i], color='blue', label='Decoder')
ax[i].plot(autoencoderpredictions[100*i], color='red', label='AE')
ax[i].set_xlabel('Time components', fontsize='x-large')
ax[i].set_ylabel('Amplitude', fontsize='x-large')
ax[i].set_title('Seismogram n. {:}'.format(1500+100*i+1), fontsize='x-large')
ax[i].legend(fontsize='x-large')
plt.subplots_adjust(hspace=1)
plt.close()
prediction
和autoencoderpredictions
不同意。似乎prediction
只是很小的噪声,而autoencoder predictions
则具有合理的值。
答案 0 :(得分:0)
您需要:(1)节省AE(自动编码器)的权重; (2)负荷重量文件; (3)反序列化文件,并仅分配与新模型(解码器)兼容的权重。
.save
确实包含权重,但是通过使用.save_weights
可以节省额外的反序列化步骤。此外,.save
保存了优化器状态和模型架构,后者与您的新解码器无关。load_weights
尝试分配所有保存的权重,这将不起作用以下代码完成了(3)(和补救措施(2)),如下所示:
file_layer_names
(列表)中model_layer_names
(列表)中file_layer_names
迭代为name
;如果name
在model_layer_names
中,则将具有该名称的已加载重量附加到weight_values_to_load
weight_values_to_load
中分配权重以使用K.batch_set_value
进行建模请注意,这要求您在AE和解码器模型中的每个图层命名并使它们匹配。可以将这些代码重写为在try-except
循环中按顺序进行蛮力分配,但这既效率低又容易出错。
用法:
## omitted; use code as in question but name all ## DECODER layers as below
autoencoder.save_weights('autoencoder_weights.h5')
## DECODER (independent)
decoder_input = Input(batch_shape=K.int_shape(x))
y = Conv1D(32, 3, activation='tanh',padding='valid',name='decod_conv1d_1')(decoder_input)
y = UpSampling1D(2, name='decod_upsampling1d_1')(y)
y = Conv1D(256, 3, activation='tanh', padding='valid', name='decod_conv1d_2')(y)
y = UpSampling1D(2, name='decod_upsampling1d_2')(y)
y = Flatten(name='decod_flatten')(y)
y = Dense(501, name='decod_dense1')(y)
decoded = Reshape((501,1), name='decod_reshape')(y)
decoder = Model(decoder_input, decoded)
decoder.save_weights('decoder_weights.h5')
load_weights(decoder, 'autoencoder_weights.h5')
功能
:import h5py
import keras.backend as K
def load_weights(model, filepath):
with h5py.File(filepath, mode='r') as f:
file_layer_names = [n.decode('utf8') for n in f.attrs['layer_names']]
model_layer_names = [layer.name for layer in model.layers]
weight_values_to_load = []
for name in file_layer_names:
if name not in model_layer_names:
print(name, "is ignored; skipping")
continue
g = f[name]
weight_names = [n.decode('utf8') for n in g.attrs['weight_names']]
weight_values = []
if len(weight_names) != 0:
weight_values = [g[weight_name] for weight_name in weight_names]
try:
layer = model.get_layer(name=name)
except:
layer = None
if layer is not None:
symbolic_weights = (layer.trainable_weights +
layer.non_trainable_weights)
if len(symbolic_weights) != len(weight_values):
print('Model & file weights shapes mismatch')
else:
weight_values_to_load += zip(symbolic_weights, weight_values)
K.batch_set_value(weight_values_to_load)