python - 3D 卷积自动编码器的输出层与输入层不匹配

标签 python tensorflow keras conv-neural-network

我正在尝试创建一个 3 维卷积神经网络自动编码器。我无法将张量的输入尺寸与输出相匹配

我尝试更改图层形状并使用 Keras 自动编码器。

        padding = 'SAME'
        stride = [1,1,1]

        self.inputs_ = tf.placeholder(tf.float32, input_shape, name='inputs')
        self.targets_ = tf.placeholder(tf.float32, input_shape, name='targets')

        conv1 = tf.layers.conv3d(inputs= self.inputs_, filters=16, kernel_size=(3,3,3), padding= padding, strides = stride, activation=tf.nn.relu)  
        maxpool1 = tf.layers.max_pooling3d(conv1, pool_size=(2,2,2), strides=(2,2,2), padding= padding)
        conv2 = tf.layers.conv3d(inputs=maxpool1, filters=32, kernel_size=(3,3,3), padding= padding, strides = stride, activation=tf.nn.relu)
        maxpool2 = tf.layers.max_pooling3d(conv2, pool_size=(3,3,3), strides=(3,3,3), padding= padding)
        conv3 = tf.layers.conv3d(inputs=maxpool2, filters=96, kernel_size=(2,2,2), padding= padding , strides = stride, activation=tf.nn.relu)
        maxpool3 = tf.layers.max_pooling3d(conv3, pool_size=(2,2,2), strides=(2,2,2), padding= padding)
        #latent internal representation

        #decoder
#         tf.keras.layers.UpSampling3D()
        unpool1 =K.resize_volumes(maxpool3,2,2,2,"channels_last")
        deconv1 = tf.layers.conv3d_transpose(inputs=unpool1, filters=96, kernel_size=(2,2,2), padding= padding , strides = stride, activation=tf.nn.relu)
        unpool2 = K.resize_volumes(deconv1,3,3,3,"channels_last")
        deconv2 = tf.layers.conv3d_transpose(inputs=unpool2, filters=32, kernel_size=(3,3,3), padding= padding , strides = stride, activation=tf.nn.relu)
        unpool3 = K.resize_volumes(deconv2,2,2,2,"channels_last")
        deconv3 = tf.layers.conv3d_transpose(inputs=unpool3, filters=16, kernel_size=(3,3,3), padding= padding , strides = stride, activation=tf.nn.relu)
        self.output = tf.layers.dense(inputs=deconv3, units=3)
        self.output = tf.reshape(self.output, self.input_shape)

ValueError:无法将具有 1850688 个元素的张量 reshape 为 [1,31,73,201,3](1364589 个元素),用于“ reshape ”(操作:“ reshape ”),输入形状为:[1,36,84,204,3 ]、[5] 并将输入张量计算为部分形状:input[1] = [1,31,73,201,3]。

最佳答案

您的输入形状是 [1, 31, 73, 201, 3] 。在转置卷积期间,您正在执行 [2,2,2] 的放大, [3,3,3][2,2,2]在你的三个resize_volumes层。如果将这些数字沿轴相乘,它将是 [12, 12, 12] (每一个2*3*2)。因此,解码器的输出在每个维度上都是 12 的倍数。

但是您的输入尺寸形状为 [x, 31, 73, 201, x]不是 12 的倍数。大于这些尺寸的最接近的倍数是 [x, 36, 84, 204, x] 。因此,解决方案是在解码部分之后,您将去掉多余的尺寸并将其与原始尺寸相匹配,或者更好的解决方案是用零填充原始形状并使其成为 12 的倍数。第二种解决方案,您将不得不考虑输入的新维度。

更新了代码(仅更改了部分)

self.inputs_ = tf.placeholder(tf.float32, input_shape, name='inputs')
pad_inputs = tf.pad(self.inputs_, [[0,0], [2, 3], [5, 6], [1, 2], [0, 0]]) # Pad at the edges
print(pad_inputs.shape)  # [1, 36, 84, 204, 3]

conv1 = tf.layers.conv3d(inputs= pad_inputs, filters=16, kernel_size=(3,3,3), padding= padding, strides = stride, activation=tf.nn.relu)

最后,

self.output = tf.reshape(self.output, pad_inputs.shape)

关于python - 3D 卷积自动编码器的输出层与输入层不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57734929/

相关文章:

python - 当我尝试在 Tensorflow 中调整图像大小时如何修复 "TypeError: x and y must have the same dtype, got tf.uint8 != tf.float32"

python - 如何在损失函数中使用模型输入?

python - 返回序列lstm keras的输出是什么

c++ - 在 C 中 reshape 张量

tensorflow - tensorflow 中的最小 RNN 示例

python - 如何在 Keras 中实现 1-sigmoid?

python - 使用 re.sub 删除特定子字符串后的所有内容

python - 如何在 PySpark 中查找 DataFrame 的大小或形状?

Python:用户选择 int 或 float

python - 在 Tkinter 中如何将被调用函数作为参数传递?