多输出Keras模型中的消失维数

2024-10-02 00:37:44 发布

您现在位置:Python中文网/ 问答频道 /正文

当我尝试训练下面描述的自动编码器时,我收到一个错误,即'一个形状为(256,28,28,1)的目标数组被传递给一个形状为(None,0,28,1)的输出,同时用作loss`binary\u crossentropy。此损失期望目标与输出具有相同的形状。输入和输出维度都应为(28,28,1),256为批量大小。Running.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

运行型号.概要()函数确认此


Tags: inputmodelactivationrelusamebinaryshapepadding
1条回答
网友
1楼 · 发布于 2024-10-02 00:37:44

看起来你的编码器有形状错误的计算。您假设解码器将得到(无,28,28,1),但编码器实际输出(无,14,28,28,1)。你知道吗

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

现在在你的解码器中,你正在裁剪等假设你有(28,28,1),这大概是削减到0。这些模型是独立工作的,当你连接它们时,就会发生不匹配。你知道吗

相关问题 更多 >

    热门问题