Многоразовая сверточная сеть Tensorflow
Я хочу повторно использовать код из 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])
Запуск модифицированного кода дает неопределенный stacktrace:
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 ответ:
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(convolutional_depth) слоя. Теперь вы прогоняете огромные изображения, поэтому после первого сверточного слоя и 2x2 maxpool у вас есть очень большая вещь вы пытаетесь питаться, но вы изменяетесь в:
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-каждый сжимает размер на 2 в X и y измерениях. 28x28x1 --> 14x14x32 --> 7x7x64. Итак, ваши изображения идут от 388 x 191 -> 194 x 95 --> 97 x 47
В качестве предупреждения, полностью связанный слой с 97*47 = 4559 входами будет ледниково медленным.