keras moel使用中间层作为输入和输出

时间:2019-07-29 05:57:55

标签: python tensorflow keras

我在Keras(Tensoflow后端)中有一个基本的LSTM自动编码器。该模型的结构如下:

l0 = Input(shape=(10, 2))
l1 = LSTM(16, activation='relu', return_sequences=True)(l0)
l2 = LSTM(8, activation='relu', return_sequences=False)(l1)
l3 = RepeatVector(10)(l2)
l4 = LSTM(8, activation='relu', return_sequences=True)(l3)
l5 = LSTM(16, activation='relu', return_sequences=True)(l4)
l6 = TimeDistributed(Dense(2))(l5)

我可以如下提取并编译编码器和自动编码器:

encoder = Model(l0, l2)
auto_encoder = Model(l0, l6)
auto_encoder.compile(optimizer='rmsprop', loss='mse', metrics=['mse'])

但是,当我尝试使用诸如以下的中间层制作模型时:

decoder = Model(inputs=l3, outputs=l6)

我收到以下错误:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_12:0", shape=(?, 10, 2), dtype=float32) at layer "input_12". The following previous layers were accessed without issue: []

我不明白l3l6彼此之间是如何断开的!我还尝试使用get_layer(...).inputget_layer(...).output制作解码器,但会引发相同的错误。

一种解释对我有很大帮助。

1 个答案:

答案 0 :(得分:0)

问题是您尝试使用以下模型创建的模型没有输入层:

decoder = Model(inputs=l3, outputs=l6)

您可以通过生成形状正确的新Input()图层然后访问每个现有图层来创建一个图层。像这样:

input_layer = Input(shape=(8,))
l3 = auto_encoder.layers[3](input_layer)
l4 = auto_encoder.layers[4](l3)
l5 = auto_encoder.layers[5](l4)
l6 = auto_encoder.layers[6](l5)

decoder = Model(input_layer, l6)
decoder.summary()