【问题标题】:Disappearing Dimensions in Multi-Output Keras Model多输出 Keras 模型中的消失维度
【发布时间】:2018-05-12 12:24:21
【问题描述】:

当我尝试训练下面描述的自动编码器时,我收到一个错误 ' 形状为 (256, 28, 28, 1) 的目标数组已传递给形状 (None, 0, 28, 1)同时用作损失`binary_crossentropy。这种损失期望目标具有与输出相同的形状。' 输入和输出维度都应该是 (28,28,1),其中 256 是批量大小。运行 .summary() 确认解码器模型的输出是正确的 (28,28,1),但是当编码器和解码器一起编译时,这似乎会发生变化。知道这里发生了什么吗?这三个函数在网络生成时依次调用。

def buildEncoder():
    input1 = Input(shape=(28,28,1))
    input2 = Input(shape=(28,28,1))
    merge = concatenate([input1,input2])
    convEncode1 = Conv2D(16, (3,3), activation = 'relu', padding = 'same')(merge)
    maxPoolEncode1 = MaxPooling2D(pool_size=(2, 1))(convEncode1)
    convEncode2 = Conv2D(16, (3,3), activation = 'sigmoid', padding = 'same')(maxPoolEncode1)
    convEncode3 = Conv2D(1, (3,3), activation = 'sigmoid', padding = 'same')(convEncode2)
    model = Model(inputs = [input1,input2], outputs = convEncode3)
    model.compile(loss='binary_crossentropy', optimizer=adam)
    return model

def buildDecoder():
    input1 = Input(shape=(28,28,1))
    upsample1 = UpSampling2D((2,1))(input1)
    convDecode1 = Conv2D(16, (3,3), activation = 'relu', padding = 'same')(upsample1)
    crop1 = Cropping2D(cropping = ((0,28),(0,0)))(convDecode1)
    crop2 = Cropping2D(cropping = ((28,0),(0,0)))(convDecode1)
    convDecode2_1 = Conv2D(16, (3,3), activation = 'relu', padding = 'same')(crop1)
    convDecode3_1 = Conv2D(16, (3,3), activation = 'relu', padding = 'same')(crop2)
    convDecode2_2 = Conv2D(1, (3,3), activation = 'sigmoid', padding = 'same')(convDecode2_1)
    convDecode3_2 = Conv2D(1, (3,3), activation = 'sigmoid', padding = 'same')(convDecode3_1)
    model = Model(inputs=input1, outputs=[convDecode2_2,convDecode3_2])
    model.compile(loss='binary_crossentropy', optimizer=adam)
    return model

def buildAutoencoder():   
    autoInput1 = Input(shape=(28,28,1))
    autoInput2 = Input(shape=(28,28,1))
    encode = encoder([autoInput1,autoInput2])
    decode = decoder(encode)
    model = Model(inputs=[autoInput1,autoInput2], outputs=[decode[0],decode[1]])
    model.compile(loss='binary_crossentropy', optimizer=adam)
    return model

运行 model.summary() 函数确认 this 的最终输出维度

【问题讨论】:

  • 我不认为你应该编译中间模型,只编译最后一个用于训练。您可以尝试删除编码器和解码器模型的编译吗?
  • 我尝试注释掉这两行,但我收到了同样的错误。我认为需要编译,以便我可以自己运行中间体进行编码和解码操作。
  • 你不需要编译中间模型,除非你想单独训练它们。

标签: python tensorflow machine-learning keras autoencoder


【解决方案1】:

您的编码器中的形状计算似乎有误。您假设解码器会得到 (None, 28, 28, 1),但您的编码器实际上会输出 (None, 14, 28, 28, 1)。

print(encoder) # Tensor("model_1/conv2d_3/Sigmoid:0", shape=(?, 14, 28, 1), dtype=float32)

现在在您的解码器中,您正在裁剪等,假设您有 (28, 28, 1) 可能会将其削减为 0。模型自行工作,当您连接它们时会发生不匹配。

【讨论】:

  • 非常感谢老兄。结果表明,默认情况下,连接层在最后一个轴上连接了两个输入,而不是第一个。正如你所指出的,这意味着当我在第一个轴上分开时,我最终得到了错误的形状。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多