- 实现函数: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=wi∗sw w o = w i ∗ s w
- ho=hi∗sh 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中的反卷积
最新推荐文章于 2020-11-22 19:21:54 发布