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

当我尝试训练下面描述的自编码器时,收到了一个错误,错误信息是‘传递了一个形状为(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 modeldef 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 modeldef 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()函数确认了这个模型的最终输出维度


回答:

看起来您在编码器中计算形状时出现了错误。您假设解码器将获得(None, 28, 28, 1),但实际上您的编码器输出的却是(None, 14, 28, 1)。

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

现在在您的解码器中,您在假设有(28, 28, 1)的基础上进行裁剪等操作,这可能会将其裁剪到0。单独的模型是可以工作的,问题出在您将它们连接起来的时候。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注