当前位置:   article > 正文

1. tf.nn.conv2d_transpose解决output_shape问题,解决需要固定输出尺寸的问题_tf 为什么output shape不显示

tf 为什么output shape不显示

tensorflow 使用反卷积的时候有两种方式,
一种使用tf.layers

tf.layers.conv2d_transpose(inputs, filters, kernel_size, strides=(1, 1), padding='valid', data_format='channels_last', activation=None, use_bias=True, kernel_initializer=None, bias_initializer=<tensorflow.python.ops.init_ops.Zeros object at 0x000000000BC10EF0>, kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, trainable=True, name=None, reuse=None)
  • 1

另外一种是使用tf.nn

tf.nn.conv2d_transpose(value, filter, output_shape, strides, padding='SAME', data_format='NHWC', name=None)
  • 1

tf.layers是tf.nn上进一步的封装,使用更为简单。但是tf.layers.conv2d_transpose与tf.nn.conv2d_transpose相比,前者不需要指定输出的尺寸,而后者是需要指定的。但是相对而言,个人认为tf.nn.conv2d_transpose较为灵活。例如,当只是使用tensorflow实现卷积操作,而卷积核固定为常数不需要更新时,tf.nn.conv2d_transpose则不能适用。
但是tf.nn.conv2d_transpose存在的问题是需要指定输出的尺寸,我们知道tensorflow是一种静态图的方式。在网络建立时指定输出尺寸,例如bacth_size等,会导致只能处理固定尺寸的输入。
对于这种问题,有两种解决方式:

tf.layers.conv2d_transpose实现反卷积

tf.layers.conv2d_transpose实现反卷积时,无需指定输出尺寸,根据有灵活性。但是前提是,你的需求可以转换为tf.layers.conv2d_transpose的形式来实现。例如,只是在网络中添加一个需要更新参数的反卷积层,实现网络搭建的目的,那么使用tf.layers.conv2d_transpose实现反卷积就够了。

tf.nn.conv2d_transpose实现反卷积

这个问题在github https://github.com/tensorflow/tensorflow/issues/833#issuecomment-278016198 讨论过。为了不用指定output_shape,解决的方式是使用输入变量的尺寸和卷积核的尺寸计算出输出的卷积核的尺寸。毕竟一旦输入确定,卷积核的尺寸确定,输出的尺寸是可以被计算的。计算方式如下:

o ′ = s ( i − 1 ) + k − 2 p o&#x27; = s\left( {i - 1} \right) + k - 2p o=s(i1)+k2p

其中, o ′ o&#x27; o为输出尺寸 , i i i为输入尺寸, k k k为卷积核尺寸, p p p为padding尺寸。

但是,面临的关键的问题是,尽管可以通过输入计算出来,但是,在建立Graph的时候,输出的尺寸通常为None。因此关键在于如何获取输入的尺寸,github上给出了答案,我这里总结为(为了更灵活,这里使用外部padding)

inputs = tf.pad(inputs, tf.constant([[0, 0], [padding_size, padding_size], [padding_size, padding_size ], [0, 0]]), mode='reflect'))
out_size = stride * (tf.shape(inputs)[1] - 1) + kernel_size - 2*padding_size
outputs = tf.nn.con2d_transpose(inputs, kernel, output_shape=[tf.shape(inputs)[0], out_size, out_size, tf.shape(inputs)[3]])
  • 1
  • 2
  • 3

这样就再也不用担心使用tf.nn.con2d_transpose时没有办法指定output_shape了。
如有错误,请大家不宁赐教。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号