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

2024-04-25 00:53:04 发布

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

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

我已经尝试改变图层形状和使用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个元素的张量重塑为形状[1,31,73201,3](1364589个元素)的形状[1,31,73201,3](1364589个元素),输入形状为[1,36,84204,3],[5]且输入张量计算为部分形状:input[1]=[1,31,73201,3]。在


Tags: selfsizelayerstfnnactivationkernelfilters
1条回答
网友
1楼 · 发布于 2024-04-25 00:53:04

您的输入形状是[1, 31, 73, 201, 3]。在转置卷积过程中,您正在三个resize_volumes层中执行[2,2,2][3,3,3]和{}的向上缩放。如果你把这些数字乘以轴,它将是[12, 12, 12](每个2*3*2)。因此,解码器的输出在每个维度上都是12的倍数。在

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

更新代码(仅更改部分)

^{1}$

最后

^{pr2}$

相关问题 更多 >