可重用的Tensorflow卷积网络

8 投票
1 回答
3302 浏览
提问于 2025-05-10 23:47

我想要重用一些代码,这些代码来自于Tensorflow的“专业版MNIST”卷积神经网络示例。我的图片大小是388像素宽,191像素高,只有两个输出类别。原始代码可以在这里找到

我尝试通过只更改输入层和输出层来重用这段代码,具体如下:

输入层

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()

相关文章:

  • 暂无相关问题
暂无标签

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的最大池化,每次在x和y方向上都缩小一半。28x28x1 --> 14x14x32 --> 7x7x64。所以你的图片是从388 x 191 --> 194 x 95 --> 97 x 47

需要注意的是,一个全连接层有97*47 = 4559个输入会非常慢。

撰写回答