【问题标题】:Why doesn't connect to the expected layer in Keras model为什么不连接到 Keras 模型中的预期层
【发布时间】:2018-12-05 18:44:30
【问题描述】:

我想在 Keras(2.2.4,带有 TensorFlow 后端)中构建一个变分自动编码器,这是我的代码:

dims = [1000, 256, 64, 32]
x_inputs = Input(shape=(dims[0],), name='inputs')
h = x_inputs

# internal layers in encoder
for i in range(n_stacks-1):
    h = Dense(dims[i + 1], activation='relu', kernel_initializer='glorot_uniform', name='encoder_%d' % i)(h)

# hidden layer
z_mean = Dense(dims[-1], kernel_initializer='glorot_uniform', name='z_mean')(h)
z_log_var = Dense(dims[-1], kernel_initializer='glorot_uniform', name='z_log_var')(h)

z = Lambda(sampling, output_shape=(dims[-1],), name='z')([z_mean, z_log_var])

encoder = Model(inputs=x_inputs, outputs=z, name='encoder')
encoder_z_mean = Model(inputs=x_inputs, outputs=z_mean, name='encoder_z_mean')


# internal layers in decoder
latent_inputs = Input(shape=(dims[-1],), name='latent_inputs')
h = latent_inputs
for i in range(n_stacks-1, 0, -1):
    h = Dense(dims[i], activation='relu', kernel_initializer='glorot_uniform', name='decoder_%d' % i)(h)

# output
outputs = Dense(dims[0], activation='relu', kernel_initializer='glorot_uniform' name='mean')

decoder = Model(inputs=latent_inputs, outputs=outputs, name='decoder')

ae_output = decoder(encoder_z_mean(x_inputs))
ae = Model(inputs=x_inputs, outputs=ae_output, name='ae')
ae.summary()

vae_output = decoder(encoder(x_inputs))
vae = Model(inputs=x_inputs, outputs=vae_output, name='vae')
vae.summary()

问题是我可以打印“ae”和“vae”模型的摘要,但是当我训练ae模型时,它说

tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'latent_inputs' with dtype float and shape [?,32]

在模型中,“decoder”应该连接到ae模型中“encoder_z_mean”层的输出。但是当我打印“ae”模型的摘要时,“decoder”实际上连接到“encoder_z_mean[1][0]”。应该是“encoder_z_mean[0][0]”吗?

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    一些更正:

    • x_inputs 已经是编码器的输入了,不要再用encoder_z_mean(x_inputs)或者encoder(x_inputs)调用
      • 除了创建第二个节点(您担心的 1,这不是问题)之外,它可能是错误的根源,因为它不是额外的输入,而是相同的输入
      • 健康地使用它需要创建一个新的Input(...)张量来调用
    • 最后一个Dense 层没有在张量上调用。你可能想要(h) 那里。

    这样做:

    # output - called h in the last layer
    outputs = Dense(dims[0], activation='relu', kernel_initializer='glorot_uniform' name='mean')(h)
    
    #unchanged
    decoder = Model(inputs=latent_inputs, outputs=outputs, name='decoder')   
    
    #adjusted inputs
    ae_output = decoder(encoder_z_mean.output)
    ae = Model(encoder_z_mean.input, ae_output, name='ae')
    ae.summary()
    
    vae_output = decoder(encoder.output)
    vae = Model(encoder.input, vae_output, name='vae')
    vae.summary()
    

    解码器仍有可能出现[1][0],但这根本不是问题。这意味着解码器本身有自己的输入节点(编号 0),当您使用另一个模型的输出调用它时,您创建了一个额外的输入节点(编号 1)。这是无害的。节点 1 将被使用,而节点 0 将被忽略。

    【讨论】:

    • 感谢您的回答。我按照你的建议更正了。现在解码器确实连接到 [0][0],但仍然出现相同的错误:tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'latent_inputs' with dtype float and shape [?,32 ]。看起来很奇怪。
    • @Tian,你训练的怎么样了?你的 keras 和 tensorflow 版本是什么?
    猜你喜欢
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多