Python Tensorflow conv2d_转置输出_形状

Python Tensorflow conv2d_转置输出_形状,python,tensorflow,conv-neural-network,convolution,deconvolution,Python,Tensorflow,Conv Neural Network,Convolution,Deconvolution,我想实现一个不固定输入大小的生成性对抗网络(GAN),比如4d张量(Batch\u size,None,None,3) 但是当我使用conv2d_转置时,有一个参数output_shape,这个参数在反褶积运算后必须通过真实大小 例如,如果批次img的大小是(64,32,32,128),那么w是重量,后面是(3,3,64,128) deconv=tf.nn.conv2d\u转置(批处理\u img,w,输出\u形状=[64,64,64,64],步幅=[1,2,2,1],填充=[SAME]) 因

我想实现一个不固定输入大小的生成性对抗网络(GAN),比如
4d张量(Batch\u size,None,None,3)

但是当我使用conv2d_转置时,有一个参数
output_shape
,这个参数在反褶积运算后必须通过
真实大小

例如,如果批次img的大小是(64,32,32,128),那么w是重量,后面是(3,3,64,128)

deconv=tf.nn.conv2d\u转置(批处理\u img,w,输出\u形状=[64,64,64,64],步幅=[1,2,2,1],填充=[SAME])

因此,我用
大小(64,64,64,64,64)
得到
deconv
,如果我传递输出形状的
真实大小就可以了

但是,我想使用非固定输入大小
(64,无,无,128)
,并使用
(64,无,无,64)
获取
deconv

但是,它会产生如下错误

TypeError:无法将类型的对象转换为张量…

那么,我能做些什么来避免deconv中的这个参数呢?还是有其他方法实现非固定GAN?

  • 输出形状列表不接受列表中包含None,因为None对象无法转换为张量对象
  • None仅允许在
    tf.占位符的形状中使用
  • 对于不同大小的输出形状而不是None请尝试-1例如,您想要大小
    (64,None,None,128)
    所以请尝试
    [64,-1,-1,128]
    。。。我不确定这是否有效。。。我的第一个参数不是固定大小,因此我使用了-1
  • 然而,对于转置卷积
    tf.layers.conv2d\u transpose()
  • 我确信高级api
    tf.layers.conv2d\u transpose()
    将适合您,因为它需要不同输入的张量
  • 您甚至不需要指定
    输出形状
    ,只需要指定要使用的
    输出通道
    内核
  • 有关更多详细信息:。。。我希望这有帮助

    • 我也遇到了这个问题。正如在这里的另一个答案中所建议的那样,使用-1是行不通的。相反,您必须抓住传入张量的形状并构造
      output\u size
      参数。这是我写的一个测试的摘录。在这种情况下,它是未知的第一维度,但它应该适用于已知和未知参数的任何组合

      output_shape = [8, 8, 4] # width, height, channels-out. Handle batch size later
      xin = tf.placeholder(dtype=tf.float32, shape = (None, 4, 4, 2), name='input')
      filt = tf.placeholder(dtype=tf.float32, shape = filter_shape, name='filter')
      
      ## Find the batch size of the input tensor and add it to the front
      ## of output_shape
      dimxin = tf.shape(xin)
      ncase = dimxin[0:1]
      oshp = tf.concat([ncase,output_shape], axis=0)
      
      z1 = tf.nn.conv2d_transpose(xin, filt, oshp, strides=[1,2,2,1], name='xpose_conv')
      

      我找到了一个解决方案,将tf.shape用于未指定的形状,并将_shape()用于指定的形状

      def get_deconv_lens(H, k, d):
          return tf.multiply(H, d) + k - 1
      
      def deconv2d(x, output_shape, k_h=2, k_w=2, d_h=2, d_w=2, stddev=0.02, name='deconv2d'):
          # output_shape: the output_shape of deconv op
          shape = tf.shape(x)
          H, W = shape[1], shape[2]
          N, _, _, C = x.get_shape().as_list()
          H1 = get_deconv_lens(H, k_h, d_h)
          W1 = get_deconv_lens(W, k_w, d_w)
      
          with tf.variable_scope(name):
              w = tf.get_variable('weights', [k_h, k_w, C, x.get_shape()[-1]], initializer=tf.random_normal_initializer(stddev=stddev))
              biases = tf.get_variable('biases', shape=[C], initializer=tf.zeros_initializer())
      
          deconv = tf.nn.conv2d_transpose(x, w, output_shape=[N, H1, W1, C], strides=[1, d_h, d_w, 1], padding='VALID')
          deconv = tf.nn.bias_add(deconv, biases)
      
          return deconv