【问题标题】:reuse middle layer as input for another model in Keras重用中间层作为 Keras 中另一个模型的输入
【发布时间】:2019-03-03 05:37:45
【问题描述】:

我正在使用 Keras 构建一个 5 层自动编码器。我制作了从输入映射到输出的模型,这很好。我构建了另一个模型,该模型从输入映射到工作正常的潜在编码向量。但是,我随后尝试创建一个解码模型,将潜在编码向量映射到不起作用的输出。

我知道首先我应该为制作该形状的解码模型制作一个输入层,但我不知道如何将我的编码层数据作为解码模型的输入并让它从编码向量到最后一层。

from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist
import numpy as np

(x_train, _), (x_test, _) = mnist.load_data()

# Prepare data and normalize
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape(len(x_train), -1)
x_test = x_test.reshape(len(x_test), -1)

input_size = 784
hidden_size = 128
coded_size = 64

x = Input(shape=(input_size,))
hidden_1 = Dense(hidden_size, activation='relu')(x)
coded =Dense(coded_size, activation='relu')(hidden_1)
hidden_2 = Dense(hidden_size, activation='relu')(coded)
r = Dense(input_size, activation='sigmoid')(hidden_2)

autoencoder = Model(inputs=x, outputs=r)
encoder = Model(inputs=x, outputs=coded)

decoder_input = Input(shape=(coded_size,))  # should do this, but don't know how to connect it below
decoder = Model(inputs=coded, output=r)

【问题讨论】:

  • 您必须通过在 Keras 中使用 Input 类构建中间(潜在)层来重建解码器,因为您不能将 Tensor 层用作 Model 类的输入层。你也可以查看这个非常好的Autoencoder教程blog.keras.io/building-autoencoders-in-keras.html

标签: python machine-learning neural-network keras autoencoder


【解决方案1】:

你可以这样做:

decoder_input = Input(shape=(coded_size,))
next_input = decoder_input

# get the decoder layers and apply them consecutively
for layer in autoencoder.layers[-2:]:
    next_input = layer(next_input)

decoder = Model(inputs=decoder_input, outputs=next_input)

附带说明,您的模型中没有h。我觉得一定要换成coded

【讨论】:

  • 啊好吧,所以你的意思是我必须再次重建整个解码器序列才能完成这项工作,而不能只是从整个层序列的中间开始。我现在修复了变量。
  • @zipline86 没错。因为它是一条新路径,因为我们需要定义一个 new 输入层,因此必须由 Keras 在解码器层中创建 new nodes
  • 我刚刚尝试过,但我得到了:用户警告:更新您对 Keras 2 API 的 Model 调用:Model(inputs=Tensor("in..., outputs=Tensor("de...)。我尝试了 decoder = Model(inputs=Tensor(decoder_input), output=Tensor(next_input)) 但这也不起作用。关于如何更新以使其更适合 Keras 2.0 的任何想法?
  • @zipline86 这只是一个警告,因为 Model 类中的关键字参数名称 output 已更改为 outputs。而已。我编辑了我的答案。
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2020-03-21
  • 2021-06-18
  • 2020-11-07
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多