编辑我的问题是过滤器的宽度和高度,我误解了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>
的conv层
输入图像是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),我将得到<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>
这个问题是我的大步数吗?它们应该是什么(我尝试过不同的变体但没有成功)
当使用转置卷积时,您需要逆向思考:如果给定(形状的)输出,您将如何获得输入(
conv3
形状的[batch_size, 25, 25, 128]
)?你将做一系列的3x3卷积和最大池。不幸的是,在TensorFlow中还没有解冷,所以你只需要转置卷积。
滤波器应具有正常CNN形状:如3x3卷积或5x5。如果要增加输出大小,需要使用跨步转置卷积。
以及代码(不要忘记步幅=2):
编辑:
刚刚看到你的编辑。CS231n中的slides是如何使用转置卷积的一个很好的例子,使用video更好!
相关问题 更多 >
编程相关推荐