Python tensorflow如何使用可变图像进行conv2d#U转置';尺寸?

Python tensorflow如何使用可变图像进行conv2d#U转置';尺寸?,python,tensorflow,Python,Tensorflow,我正试图找到一种方法来卷积转置可变大小的图像。 我使用了tf.nn.conv2d_转置api,但失败了 import tensorflow as tf def conv2d_transpose(inputs, filters_shape, strides, name, padding="SAME", activation=None): filters = get_conv_filters(filters_shape, name) inputs_shape = inputs.get_s

我正试图找到一种方法来卷积转置可变大小的图像。 我使用了tf.nn.conv2d_转置api,但失败了

import tensorflow as tf

def conv2d_transpose(inputs, filters_shape, strides, name, padding="SAME", activation=None):
  filters = get_conv_filters(filters_shape, name)

  inputs_shape = inputs.get_shape().as_list()
  output_shape = tf.stack(calc_output_shape(inputs_shape, filters_shape, strides, padding)) #tf.pack renamed tf.stack
  strides = [1,*strides,1]

  conv_transpose = tf.nn.conv2d_transpose(inputs, filters, output_shape=output_shape,
                                          strides=strides, padding=padding, name=name+"transpose")

  if activation != None:
    conv_transpose = activation(conv_transpose)

  return conv_transpose

def get_conv_filters(filters_size, name):
  conv_weights = tf.Variable(tf.truncated_normal(filters_size), name=name + "weights")
  return conv_weights

def calc_output_shape(inputs_shape, filters_shape, strides, padding): # For conv_transpose
  batch_size, inputs_height, inputs_width, n_channel = inputs_shape
  filters_height, filters_width, before_n_channel, after_n_channel = filters_shape
  strides_height, strides_width = strides

  if padding =="SAME":
    output_height = inputs_height*strides_height
    output_width = inputs_width*strides_width

  else: # padding="VALID"
    output_height = (inputs_height-1)*strides_height+filters_height
    output_width = (inputs_width-1)*strides_width+filters_width

  return [batch_size, output_height, output_width, after_n_channel]
主要的 然后,我得到以下错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-0a594abc4f59> in <module>()
     36 
     37 input_images = tf.placeholder(tf.float32, [None, None, None, 3])
---> 38 transpose_layer = conv2d_transpose(input_images, filters_shape=[3,3,3,3], strides=[2,2], name="conv_3_transpose", padding="SAME", activation=tf.nn.relu)
     39 

<ipython-input-11-0a594abc4f59> in conv2d_transpose(inputs, filters_shape, strides, name, padding, activation)
      5 
      6   inputs_shape = inputs.get_shape().as_list()
----> 7   output_shape = tf.stack(calc_output_shape(inputs_shape, filters_shape, strides, padding)) #tf.pack renamed tf.stack
      8   strides = [1,*strides,1]
      9 

<ipython-input-11-0a594abc4f59> in calc_output_shape(inputs_shape, filters_shape, strides, padding)
     26 
     27   if padding =="SAME":
---> 28     output_height = inputs_height*strides_height
     29     output_width = inputs_width*strides_width
     30 

TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
36
37 input_images=tf.placeholder(tf.float32,[None,None,None,3])
--->38转置层=conv2d转置(输入图像、过滤器形状=[3,3,3,3],步幅=[2,2],name=“conv\u 3\u转置”,padding=“相同”,激活=tf.nn.relu)
39
在conv2d_转置中(输入、过滤器_形状、步幅、名称、填充、激活)
5.
6 inputs\u shape=inputs.get\u shape().as\u list()
---->7输出形状=tf.stack(计算输出形状(输入形状、过滤器形状、步幅、填充))#tf.pack重命名为tf.stack
8步幅=[1,*步幅,1]
9
在计算输出形状中(输入形状、过滤器形状、步幅、填充)
26
27如果填充=“相同”:
--->28输出高度=输入高度*跨步高度
29输出宽度=输入宽度*跨步宽度
30
TypeError:不支持*:“NoneType”和“int”的操作数类型
我认为这个错误的原因是输入的形状不是固定的。因此,计算输出_形状时出错。
我应该如何克服这个问题?

使用动态形状,您可以找到详细信息。您的
输入\u形状应为:

inputs_shape = tf.shape(inputs)
...
batch_size, inputs_height, inputs_width, n_channel = inputs_shape[0],inputs_shape[1],inputs_shape[2],inputs_shape[3]  

谢谢你们的评论帮助我解决了这个问题。另外,我从你的评论中学到了更多的东西。
inputs_shape = tf.shape(inputs)
...
batch_size, inputs_height, inputs_width, n_channel = inputs_shape[0],inputs_shape[1],inputs_shape[2],inputs_shape[3]