一个可重复使用的Tensorflow卷积网络

8

我希望能够重用Tensorflow "MNIST for Pros" CNN example中的代码。我的图片尺寸为388px X 191px,只有2个输出类别。原始代码可以在这里找到。 我尝试通过仅更改输入和输出层来重用此代码,如下所示:

输入层

x = tf.placeholder("float", shape=[None, 74108])

y_ = tf.placeholder("float", shape=[None, 2])

x_image = tf.reshape(x, [-1,388,191,1])

输出层

W_fc2 = weight_variable([1024, 2])

b_fc2 = bias_variable([2])

运行修改后的代码会得到一个模糊的堆栈跟踪:
W tensorflow/core/common_runtime/executor.cc:1027] 0x2136510 Compute status: Invalid argument: Input has 14005248 values, which isn't divisible by 3136
     [[Node: Reshape_4 = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_5, Reshape_4/shape)]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1267, in run
    _run_using_default_session(self, feed_dict, self.graph, session)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2763, in _run_using_default_session
    session.run(operation, feed_dict)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 345, in run
    results = self._do_run(target_list, unique_fetch_targets, feed_dict_string)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 419, in _do_run
    e.code)
tensorflow.python.framework.errors.InvalidArgumentError: Input has 14005248 values, which isn't divisible by 3136
     [[Node: Reshape_4 = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_5, Reshape_4/shape)]]
Caused by op u'Reshape_4', defined at:
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_array_ops.py", line 554, in reshape
    name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 633, in apply_op
    op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1710, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 988, in __init__
    self._traceback = _extract_stack()

我在Ubuntu 14.10上使用Python 2.7.10和TensorFlow 0.5.0执行您的代码时没有遇到任何错误。 - agold
1个回答

7
tensorflow.python.framework.errors.InvalidArgumentError: Input has 14005248 values, which isn't divisible by 3136
 [[Node: Reshape_4 = Reshape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](MaxPool_5, Reshape_4/shape)]]

但是你执行的方式阻止了你看到导致问题的实际代码行。将其保存到文件中并使用python <file> 命令运行。

  File "<stdin>", line 1, in <module>

但是答案是,您没有更改卷积和池化层的大小,因此当您运行28x28图像时,它们最终会缩小到一个7x7x(卷积深度)层。现在您正在运行巨大的图像,因此在第一卷积层和2x2最大池后,您要传入非常大的东西,但是您正在重新整形为:

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])

你的大尺寸图像使得h_pool2的输出更大。你需要使用更多的卷积和最大池化层来进一步缩小它们,也可以尝试增加W_fc1的大小以匹配输入大小.每个2x2的maxpools都会将x轴和y轴的尺寸缩小2.28x28x1 --> 14x14x32 --> 7x7x64.因此,你的图像从388 x 191 --> 194 x 95 --> 97 x 47。

请注意,具有97 * 47 = 4559个输入的全连接层将非常缓慢。


dga:感谢您的见解。我会尝试您的方法。 - user2849678
2
另一个解决方案是认识到“没有完全连接的层;只有卷积”——Yann LeCun。用卷积替换FC层,并使用类似“全局平均池化”的方法将任何图像尺寸缩小到已知形状。 - mdaoust
@dga和mdaoust:非常感谢。我尝试了dga建议的方法,它起作用了。我仍在寻找一个简单的“Conv Net for dummies”类型的解释。从上面的解释中,我知道2x2 maxpool会将大小缩小2倍。为什么第三个维度每个maxpool都会加倍呢? - user2849678
它不是因为最大池化而加倍,而是因为卷积而加倍。 W_conv1 = weight_variable([5, 5, 1, 32])W_conv2 = weight_variable([5, 5, 32, 64])。第一个在图像上运行5x5x1(1是颜色通道)卷积,每个位置产生32个输出。第二个在第一层的输出上运行5x5x32(32 ==前一个卷积的输出数量),并产生64个输出。所以它加倍是因为网络设计者指定了这种方式。 - dga
@dga 更准确地说,第一批训练效果不错。由于我只有47张图片,所以我尝试在每个训练批次中对图像进行随机更改(对比度/亮度)。这给我带来了新的错误。尝试将传递给AdamOptimizer的值从1更改为1e-8。超参数搜索网格严重缺失! W tensorflow/core/common_runtime/executor.cc:1027] 0xb518090 计算状态:无效参数:ReluGrad输入不是有限的。:张量具有NaN值 在<module> train_step = tf.train.AdamOptimizer(1e-8).minimize(cross_entropy) - user2849678
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - dga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接