Tensorflow中的反卷积

  • 实现函数:tf.nn.conv2d_transpose(input_tensor, filter_weights_tensor, output_shape, strides, padding)
    • input_tensor: 代表的是输入的tensor,默认的size是[batch_size, w, h, channel]
    • filter_weight_tensor: 代表卷积运算时filter参数的tensor,默认的size是[filter_size, filter_size, output_channel, in_channel]
    • output_shape: 代表输出的tensor的大小,是一个list[batch_size, output_w, output_h, output_channel]
    • strides: 代表对应卷积操作的步长,[1, stride_w, stride_h, 1]
    • padding: 补全的方式
  • 注意,如果outputshape没设置对的话,会在运行时报错。
  • 那么如何计算output shape呢?这里我们把反卷积称之为卷积操作的转置。假设我们padding的方式是SAME,输入图像的size是 wi,hi,ci w i , h i , c i ,输入图像的size是 wo,ho,co w o , h o , c o 。filter的size是 fw,fh f w , f h 。stride的大小是 sw,sh s w , s h

    • co c o 是取决于filter的个数。
    • wo=wisw w o = w i ∗ s w
    • ho=hish h o = h i ∗ s h
    • 这里我们就疑惑了,为什么步长设置大了,反而得到的输出结果还变大了呢?

      • 从理解角度来说,因为我们这里是将反卷积看作卷积的转置,所以我们可以把stride看成对应卷积操作的步长。比如说,我们通过卷积操作将 wo,ho w o , h o 变成了 wi,hi w i , h i ,这里的步长就是上述卷积操作的步长。
      • 从实现角度来讲,我们知道反卷积的本质还是卷积,他其实是在图像内部插入了许多0点,从而实现了步长大于1的操作。如下图所示,其中蓝色框中间的点就是插入的0点。其实内部反卷积的步长还是1,但是对应的卷积的步长就是2了。

      反卷积和卷积的动画

      • 每个反卷积操作都可以看成一个卷积操作的转置,由于shape可以决定padding和stride的大小,我们的反卷积的padding 和stride大小和对应的卷积的padding和stride大小一致

你可能感兴趣的:(Tensorflow,深度学习,反卷积,Tensorflow)