Tensorflow conv2d_transpose (deconv) out_backprop的行数与计算值不匹配

编辑 我的问题出在滤波器的宽度和高度上,我误解了API文档… 现在正在修正

解决方案 请参考这里的第53张幻灯片关于反卷积的讲解


我遇到的问题与这里类似,但情况有些不同。

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

…所以差了一个?

一些背景信息…

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

输入图像是200×200,我有3个最大池化层——因此h = w = 25。我想添加3个反卷积层,以便恢复到原始分辨率(我在做图像分割)。

反卷积代码如下:

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()但没有成功——如这里推荐的)权重如下:

'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]这一行(如这里推荐的),最后三个维度也是问号?如果我将第一个维度改为常数(例如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])得到输入(conv3形状为[batch_size, 25, 25, 128])?

你会进行一系列3×3的卷积和最大池化操作。不幸的是,TensorFlow中尚未提供去池化功能,因此你只能使用转置卷积。

滤波器应该具有常规CNN形状:如3×3卷积,或5×5。如果你想增加输出尺寸,你需要使用步进的转置卷积。

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 = 10conv3 = 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的幻灯片非常好地展示了如何使用转置卷积,结合视频效果更佳!

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注