Tensorflow conv2d_transpose (deconv) out_backprop 的行数与计算的不匹配
Tensorflow conv2d_transpose (deconv) Number of rows of out_backprop doesn't match computed
编辑 我的问题是过滤器的宽度和高度,我误解了 API 文档...现在正在更正
解决方案 按照 here 幻灯片 53
的反卷积
我遇到了与 类似的问题,但更有趣。
我的错误是 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 层,以便 return 原始分辨率(我正在做图像分割)。
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),我会得到 <tf.Tensor 'conv2d_transpose:0' shape=(10, 50, 50, 64) dtype=float32>
所以这可能是我问题的一部分?如果我将其改回常量 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>
问题是我的步数吗?它们应该是什么(我尝试了不同的变体但没有成功)
使用转置卷积时,您需要逆向思考:在给定输出(形状 [batch_size, 200, 200, 1]
)的情况下,您将如何获得输入(形状 [batch_size, 25, 25, 128]
的 conv3
)?
你会做一系列的 3x3 卷积和最大池化。不幸的是,TensorFlow 中尚不提供反池化,因此您只能使用转置卷积。
过滤器应具有正常的 CNN 形状:例如 3x3 卷积或 5x5。如果你想增加输出尺寸,你需要使用strided transpose convolutions。
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]))
}
和代码(不要忘记步幅 = 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")
编辑:
刚刚看到您的编辑。 slides from CS231n are a very good illustration of how to use transposed convolutions, it's even better with the video !
编辑 我的问题是过滤器的宽度和高度,我误解了 API 文档...现在正在更正
解决方案 按照 here 幻灯片 53
的反卷积我遇到了与
我的错误是 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 层,以便 return 原始分辨率(我正在做图像分割)。
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),我会得到 <tf.Tensor 'conv2d_transpose:0' shape=(10, 50, 50, 64) dtype=float32>
所以这可能是我问题的一部分?如果我将其改回常量 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>
问题是我的步数吗?它们应该是什么(我尝试了不同的变体但没有成功)
使用转置卷积时,您需要逆向思考:在给定输出(形状 [batch_size, 200, 200, 1]
)的情况下,您将如何获得输入(形状 [batch_size, 25, 25, 128]
的 conv3
)?
你会做一系列的 3x3 卷积和最大池化。不幸的是,TensorFlow 中尚不提供反池化,因此您只能使用转置卷积。
过滤器应具有正常的 CNN 形状:例如 3x3 卷积或 5x5。如果你想增加输出尺寸,你需要使用strided transpose convolutions。
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]))
}
和代码(不要忘记步幅 = 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")
编辑:
刚刚看到您的编辑。 slides from CS231n are a very good illustration of how to use transposed convolutions, it's even better with the video !