Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用二进制交叉熵| Keras tf自动编码器时输入和输出形状不匹配_Python_Tensorflow_Keras_Deep Learning - Fatal编程技术网

Python 使用二进制交叉熵| Keras tf自动编码器时输入和输出形状不匹配

Python 使用二进制交叉熵| Keras tf自动编码器时输入和输出形状不匹配,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我正在构建一个自动编码器,它接收16x16个展平图像,我不断得到以下错误: ValueError: A target array with shape (999, 16, 16, 256) was passed for an output of shape (None, 256) while using as loss `binary_crossentropy`. This loss expects targets to have the same shape as the output. 我

我正在构建一个自动编码器,它接收16x16个展平图像,我不断得到以下错误:

ValueError: A target array with shape (999, 16, 16, 256) was passed for an output of shape (None, 256) while using as loss `binary_crossentropy`. This loss expects targets to have the same shape as the output.
我的尝试:我认为我必须在
topk
层之后重塑解码器内部的张量,但它没有解决错误,只是输出了更多错误。我在下面评论了我的尝试。 我相信我需要做一些类型的重塑,以便输入形状和输出形状彼此匹配,这样二进制交叉熵损失就可以工作了

下面是我的代码的一个最简单的工作示例:

encoding_dim = 16
input_img = tf.keras.layers.Input(shape=(16, 16, 256), name ="input")
# flatten your images
flatten = tf.keras.layers.Flatten()(input_img)
encoded = tf.keras.layers.Dense(encoding_dim, activation='relu')(flatten)
encoded2 = tf.keras.layers.Dense(256, activation='sigmoid')(encoded)
# top_k layer
topk = tf.keras.layers.Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
                                                sorted=True,
                                                name="topk").values)(encoded)
decoded = tf.keras.layers.Dense(128, activation='relu')(topk) 
decoded2 = tf.keras.layers.Dense(256, activation='sigmoid')(decoded)
#decoded3 = tf.keras.layers.Reshape((16,16,256))(decoded2)
autoencoder = tf.keras.Model(input_img, decoded2)
autoencoder.compile(optimizer = 'adadelta', 
                    loss='binary_crossentropy')
autoencoder.fit(x_train, x_train,
            epochs=100,
            batch_size=256,
            shuffle=False,
            validation_data=(x_test, x_test))

当前,您的输入形状是
(批处理,16、16、256)

如果要将
batch
明确指定为
256
,则应在
输入层中使用
batch\u shape
参数,而不是
shape
。但是,您不应该这样做,因为最好保持它的灵活性,以防您想要更改它(或者通常情况下批量大小不等)


您的输出必须具有相同的形状,因此它应该是
keras.layers.Dense(16*16,activation=“sigmoid”)
keras.layers.reformate((16,16))
在最后一个输出节点。请注意,您没有在任何地方指定批次,只指定其余的维度。

您可以在计算损失的地方发布零件吗?@gorjan Updated!你能详细说明一下形状吗?(999、16、16、256)