【问题标题】:A reusable Tensorflow convolutional Network一个可重用的 TensorFlow 卷积网络
【发布时间】:2016-02-26 15:22:54
【问题描述】:

我想重用来自Tensorflow "MNIST for Pros" CNN example 的代码。 我的图像是 388px X 191px,只有 2 个输出类。原码可以是found here。 我尝试通过更改仅输入和输出层来重用此代码,如下所示:

输入层

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 执行您的代码时没有收到任何错误。

标签: python neural-network convolution tensorflow conv-neural-network


【解决方案1】:
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 &lt;file&gt; 它。

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

但答案是您没有更改卷积层和池化层的大小,因此当您过去运行 28x28 图像时,它们最终会缩小到 7x7x(convolutional_depth) 层。现在你正在运行巨大的图像,所以在第一个卷积层和 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 最大池运行 - 每个在 x 和 y 维度上将大小缩小 2。 28x28x1 --> 14x14x32 --> 7x7x64。所以你的图像是 388 x 191 --> 194 x 95 --> 97 x 47

作为警告,具有 97*47 = 4559 个输入的全连接层将会非常缓慢。

【讨论】:

  • dga:感谢您的洞察力。会尝试你的方法。
  • 另一个解决方案是实现"There are no fully connected layers; only convolutions" --Yann LeCun。用卷积替换 FC 层,并使用诸如“全局平均池化”之类的东西来从任何图像尺寸减少到已知形状。
  • @dga & mdaoust:非常感谢。我尝试了 dga 建议的方法,它奏效了。我仍在寻找一种简单的“傻瓜式卷积网络”的解释。从上面的解释中,我知道 2x2 maxpool 将大小缩小了 2。为什么每个 maxpool 的第 3 维都加倍。
  • 不是因为 maxpool 而加倍,而是因为卷积而加倍。 W_conv1 = weight_variable([5, 5, 1, 32])W_conv2 = weight_variable([5, 5, 32, 64]) 第一个在图像上运行 5x5x1(1 是颜色通道)卷积,每个位置产生 32 个输出。第二个在第一层的输出上运行 5x5x32(32 == 前一个卷积的输出数),并产生 64 个输出。所以它翻了一番,因为网络的设计者指定了这种方式。
  • @dga 更准确地说,第一批训练奏效了。由于我只有 47 张图像,因此我尝试在每批训练中随机更改图像(对比度/亮度)进行训练。这给了我新的错误。尝试将传递给 AdamOptimizer 的值从 1 更改为 1e-8。严重缺少超参数的搜索网格! W tensorflow/core/common_runtime/executor.cc:1027] 0xb518090 Compute status: Invalid argument: ReluGrad input is not finite. : Tensor had NaN values in &lt;module&gt; train_step = tf.train.AdamOptimizer(1e-8).minimize(cross_entropy)
猜你喜欢
  • 2019-08-18
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多