代码之家  ›  专栏  ›  技术社区  ›  Tian

为什么不连接到Keras模型中的预期层

  •  0
  • Tian  · 技术社区  · 7 年前

    我想在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]
    

    在模型中,“解码器”应连接到ae模型中“编码器z_均值”层的输出。但当我打印“ae”模型的摘要时,“decoder”实际上连接到“encoder_z_mean[1][0]”。是否应该是“编码器z_表示[0][0]”?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Daniel Möller    7 年前

    一些更正:

    • 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]