【问题标题】:Tensorflow conv2d_transpose (deconv) Number of rows of out_backprop doesn't match computedTensorflow conv2d_transpose (deconv) out_backprop 的行数与计算的不匹配
【发布时间】:2016-10-21 22:44:34
【问题描述】:

编辑我的问题是我的过滤器的宽度和高度,我误解了 API 文档...现在正在纠正中

解决方案遵循here幻灯片53的反卷积


我有一个与here 类似的问题,但它有点时髦。

优化器初始化时我的错误是Conv2DBackpropInput: Number of rows of out_backprop doesn't match computed: actual = 25, computed = 26

...所以它减了 1?

一些背景...

我有一个尺寸为<tf.Tensor 'MaxPool_2:0' shape=(?, 25, 25, 128) dtype=float32>的卷积层

输入图像为 200x200,我有 3 个 maxpool 层 - 因此 h = w = 25。我想添加 3 个 deconv 层,以便返回原始分辨率(我正在进行图像分割)。

deconv 代码如下所示:

temp_batch_size = tf.shape(x)[0]
# output_shape = tf.pack([temp_batch_size, 50, 50, 64])
output_shape = [temp_batch_size, 50, 50, 64]
conv4 = tf.nn.conv2d_transpose(conv3, weights['wdc1'], output_shape=output_shape, strides=[1,1,1,1], padding="VALID")
# conv4 = tf.nn.local_response_normalization(conv4)

# output_shape = tf.pack([temp_batch_size, 100, 100, 32])
output_shape = [temp_batch_size, 100, 100, 32]
conv5 = tf.nn.conv2d_transpose(conv4, weights['wdc2'], output_shape=output_shape, strides=[1,1,1,1], padding="VALID")
# conv5 = tf.nn.local_response_normalization(conv5)

# output_shape = tf.pack([temp_batch_size, 200, 200, 1])
output_shape = [temp_batch_size, 200, 200, 1]
conv6 = tf.nn.conv2d_transpose(conv5, weights['wdc3'], output_shape=output_shape, strides=[1,1,1,1], padding="VALID")
# conv6 = tf.nn.local_response_normalization(conv6)

(你可以看到我尝试tf.pack() 没有成功——正如推荐的here)权重在哪里:

'wdc1' : tf.Variable(tf.random_normal([25, 25, 64,128])),

'wdc2' : tf.Variable(tf.random_normal([50, 50, 32,64])),

'wdc3' : tf.Variable(tf.random_normal([100, 100, 1,32])),

一些调试看起来像这样:

(Pdb) conv3
<tf.Tensor 'MaxPool_2:0' shape=(?, 25, 25, 128) dtype=float32>
(Pdb) conv4
<tf.Tensor 'conv2d_transpose:0' shape=(?, ?, ?, ?) dtype=float32>
(Pdb) conv5
<tf.Tensor 'conv2d_transpose_1:0' shape=(?, ?, ?, ?) dtype=float32>
(Pdb) conv6
<tf.Tensor 'conv2d_transpose_2:0' shape=(?, ?, ?, ?) dtype=float32>

我觉得很奇怪,因为我有 temp_batch_size = tf.shape(x)[0] 行(推荐 here),最后 3 个维度也是问号?如果我将第一个维度更改为常数(例如 10),我会得到 &lt;tf.Tensor 'conv2d_transpose:0' shape=(10, 50, 50, 64) dtype=float32&gt;

所以也许这是我的问题的一部分?如果我将它改回常量batch_size,那么我会在优化器初始化时收到错误ValueError: Shapes (10, 101, 101, 32) and (10, 100, 100, 32) are not compatible。再一次,减一。

使用此配置进行调试...

(Pdb) conv4
<tf.Tensor 'conv2d_transpose:0' shape=(10, 50, 50, 64) dtype=float32>
(Pdb) conv5
<tf.Tensor 'conv2d_transpose_1:0' shape=(10, 100, 100, 32) dtype=float32>
(Pdb) conv6
<tf.Tensor 'conv2d_transpose_2:0' shape=(10, 200, 200, 1) dtype=float32>

问题是我的步数吗?它们应该是什么(我尝试了不同的变体但没有成功)

【问题讨论】:

    标签: python machine-learning neural-network artificial-intelligence tensorflow


    【解决方案1】:

    使用转置卷积时,您需要反省:在给定输出(形状为 [batch_size, 200, 200, 1])的情况下,您将如何获得输入(形状为 conv3[batch_size, 25, 25, 128])?

    您将执行一系列 3x3 卷积和最大池化。不幸的是,TensorFlow 中尚不支持 unpooling,因此您只需使用转置卷积即可。

    过滤器应具有正常的 CNN 形状:如 3x3 卷积或 5x5。如果要增加输出大小,则需要使用跨步转置卷积。

    weights = {
      'wdc1' : tf.Variable(tf.random_normal([3, 3, 64, 128])),
      'wdc2' : tf.Variable(tf.random_normal([3, 3, 32, 64])),
      'wdc3' : tf.Variable(tf.random_normal([3, 3, 1, 32]))
    }
    

    还有代码(别忘了stride = 2):

    temp_batch_size = 10
    
    conv3 = tf.zeros([temp_batch_size, 25, 25, 128])
    output_shape = [temp_batch_size, 50, 50, 64]
    conv4 = tf.nn.conv2d_transpose(conv3, weights['wdc1'], output_shape=output_shape, strides=[1,2,2,1], padding="SAME")
    
    output_shape = [temp_batch_size, 100, 100, 32]
    conv5 = tf.nn.conv2d_transpose(conv4, weights['wdc2'], output_shape=output_shape, strides=[1,2,2,1], padding="SAME")
    
    output_shape = [temp_batch_size, 200, 200, 1]
    conv6 = tf.nn.conv2d_transpose(conv5, weights['wdc3'], output_shape=output_shape, strides=[1,2,2,1], padding="SAME")
    

    编辑:

    刚刚看到您的编辑。 CS231n 中的slides 很好地说明了如何使用转置卷积,video 更好!

    【讨论】:

    • 感谢奥利维尔!这正是我所做的!
    • 顺便说一句,别忘了 ReLUs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多