【发布时间】:2019-04-06 14:04:55
【问题描述】:
我已经定义并训练了一个自动编码器模型如下:
input_enc = Input(batch_shape=(batch_size, seq_len, n_features), name='encoder_input')
first_enc = LSTM(32, activation='tanh', dropout=0.1, recurrent_dropout=0.1, return_sequences=True, stateful=True, name='encoder_first_layer')(input_enc)
if output_dropout:
first_enc = Dropout(0.2)(first_enc)
encoded, hidden_state, cell_state = LSTM(14, activation='tanh', dropout=0.1, recurrent_dropout=0.1, return_sequences=False, return_state=True , stateful=True, name='encoded')(first_enc)
decoder_input = RepeatVector(28, name='repeatVector')(encoded)
first_dec = LSTM(32, return_sequences=True, name='decoder_first_layer')(decoder_input)
out_decoder = LSTM(1, return_sequences=True, name='decoder_output_layer')(first_dec)
autoencoder_model = Model(input_enc, out_decoder)
encoder_model = Model(inputs=input_enc, outputs=[encoded, hidden_state, cell_state])
自动编码器模型的输入形状是(n_samples, seq_len=28, n_features=1) 和batch_size = 138
在尝试了自动编码器后,我加载了编码器部分并将其用作另一个模型的输入。
input_layer = Input(batch_shape=(batch_size, seq_len, n_features), name='ae_prediction_input')
encoder_first_layer = encoder.layers[1](input_layer)
encoded_layer, h_state, c_state = encoder.layers[2](encoder_first_layer)
first_layer = Dense(24, input_dim=28, activation=activation, name="first_dense_layer")(h_state)
if dropout:
first_layer = Dropout(0.2, name="first_dropout_layer")(first_layer)
second_layer = Dense(12, activation=activation, name="second_dense_layer")(first_layer)
if dropout:
second_layer = Dropout(0.2, name="snd_dropout_layer")(second_layer)
out = Dense(1, name='output_layer')(second_layer)
new_model = Model(input_layer, out)
new.compile(loss='mean_squared_error', optimizer=rmsprop_optimizer)
history = new_model.fit(train_data, train_y, epochs=5, callbacks=[earlyStopping], batch_size=batch_size
, validation_data=(validation_data, validation_y), shuffle=False)
起初我试图使用编码器的输入层,但给了我这个错误:ValueError: Layer encoder_first_layer was called with an input that isn't a symbolic tensor. Received type: <class 'eras.engine.input_layer.InputLayer'>.Full input: [<keras.engine.input_layer.InputLayer object at 0x13b97ced0>]. All inputs to the layer should be tensors. 所以相反,我正在创建一个新的输入层,最重要的是我添加了预训练的第一个 LSTM 层编码器模式。当我尝试适应 new_model 时,第一个 epoch 运行,在第一个 epoch 结束时我收到以下错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'encoder_input' with dtype float and shape [138,28,1]
[[{{node encoder_input}} = Placeholder[dtype=DT_FLOAT, shape=[138,28,1], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
有什么问题?为什么第一个 epoch 运行,然后它记得编码器输入层没有接收值?
更新:问题似乎与验证数据有关。在最后一个 epoch 结束时,Keras 检查验证数据并运行它。这就是它给出这个错误的地方。
【问题讨论】:
-
能否提供完整的代码示例。完整是指您如何运行此图(例如,您如何使用 model.fit 或 model.train_on_batch)?
-
我能想到的一个原因是,特别是考虑到错误出现在第一个 epoch 的末尾,因为您专门指定
batch_shape,所以您最后一批输入的数据可能较少(即较少超过 138 个条目),这可能会引发您观察到的异常。您可以尝试 2 件事:1. 使用shape代替shape,您不需要定义批量大小 2. 如果您有大量数据,请忽略最后一批数据。 -
@thushv89 感谢您的评论。
batch_size=138划分训练和验证数据。training.shape=(49956,28,1), validation.shape=(16422,28,1), test.shape=(8004,28,1)。我试图从fit()中删除validation_data=(validation_data, validation_y),它可以正常工作并训练模型没有错误!但随后它无法运行new_model.evaluate(train_data, train_y, verbose=0, batch_size=batch_size)并出现与以前相同的错误。 -
@thushv89 它抱怨将数据馈送到预训练编码器的第一层
encoder_input,我还没有加载它来创建new_model。相反,我使用了一个新的Input()层。有错吗? -
嗯,我能想到的另一个原因是,您创建预测模型的方式(即
new_model)需要改变。不要得到model.layers[x],而是尝试创建一个新层,例如LSTM(....)然后使用model.layers[x].get_weights()并将其用于预测模型中新层的set_weights。
标签: python keras deep-learning lstm autoencoder