当前位置: 首页 > 知识库问答 >
问题:

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

佴阳辉
2023-03-14

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

我尝试过改变图层形状并使用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'(op:'Reshape')的形状[1,31,73,201,3](1364589元素),输入形状:[1,36,84,204,3],[5]并且输入张量计算为部分形状:输入[1]=[1,31,73,201,3]。

共有1个答案

胡昊
2023-03-14

您的输入形状是[1、31、73、201、3]。在转置卷积过程中,您正在三个调整卷大小的层中执行升迁。如果将这些数字沿轴相乘,则为12、12、12(每个数字为2*3*2)。因此,解码器的输出将是每个维度中12的倍数。

但是您输入的维度形状不是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)
 类似资料:
  • 我在Keras建立了一个卷积神经网络。 根据CS231讲座,卷积操作为每个过滤器创建一个特征映射(即激活映射),然后将其堆叠在一起。在我的例子中,卷积层有一个300维的输入。因此,我预计会进行以下计算: 每个过滤器的窗口大小为5。因此,每个滤波器产生300-5 1=296个卷积 但是,实际输出形状看起来不同: 偏移值的形状很有意义,因为每个过滤器都有一个偏移值。然而,我不了解重量的形状。显然,第一

  • 我在keras建立了一个ConvNet,这是其中的两层 第一层大小的输出,我完全理解,因为有8个大小为3x3的过滤器,每个过滤器都被应用于生成单独的特征图,因此 第二层的输出大小为24x24x16,我不理解。由于第二层的每个过滤器将作用于第一层输出的每个特征映射,因此输出的大小不应该是24x24x128吗? 基本上,我不明白一层的输出是如何馈送到另一层的输入的

  • 如果输入到神经网络卷积层的是128x128x3大小的图像,并对其应用40个5x5大小的滤波器,那么输出大小会是多少?

  • 问题是卷积神经网络的数学细节。假设网络的体系结构(其目标是图像分类)是这样的 输入图像32x32 第一个隐藏层3x28x28(由3个大小为5x5的滤波器卷积而成,步幅=0,无填充),随后是激活 池化层(在2x2区域上池化),产生3x14x14输出 第二隐藏层6x10x10(由6个大小为5x5的滤波器卷积而成,步幅=0,无填充),随后激活 池化层(在2x2区域上池化),产生6x5x5输出 具有100

  • 卷积神经网络有一个批量过滤器, 持续不断的在图片上滚动收集图片里的信息,每一次收集的时候都只是收集一小块像素区域, 然后把收集来的信息进行整理, 这时候整理出来的信息有了一些实际上的呈现, 比如这时的神经网络能看到一些边缘的图片信息, 然后在以同样的步骤, 用类似的批量过滤器扫过产生的这些边缘信息, 神经网络从这些边缘信息里面总结出更高层的信息结构,比如说总结的边缘能够画出眼睛,鼻子等等. 再经过

  • Convolution1D层 keras.layers.convolutional.Convolution1D(nb_filter, filter_length, init='uniform', activation='linear', weights=None, border_mode='valid', subsample_length=1, W_regularizer=None, b_regu