6

Я хочу повторно использовать код из Tensorflow "MNIST for Pros" CNN example. Мои изображения 388px X 191px, всего 2 класса выходных данных. Исходный код может быть found here. Я пытался повторно использовать этот код, изменяя входного & выходных слоев ТОЛЬКО, как показано ниже:Многоразовая сверточная сеть Tensorflow

входной слой

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

У меня не было ошибок при выполнении кода с использованием Python 2.7.10, TensorFlow 0.5.0 на Ubuntu 14.10. – agold

ответ

6
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 изображений через, они в конечном счете сократились до (convolutional_depth) слоя 7x7x. Теперь вы бежите огромные изображения через, так что после первого сверточного слоя и 2х2 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 maxpools - каждый уменьшает размер на 2 в размерах x и y. 28x28x1 -> 14x14x32 -> 7x7x64. Таким образом, ваши изображения идут от 388 x 191 -> 194 x 95 -> 97 x 47

Как предупреждение, полностью подключенный уровень с входами 97 * 47 = 4559 будет медленным.

+0

dga: Спасибо за понимание. Попробуй свой подход. – user2849678

+2

Другим решением является осознание того, что [«Нет полностью связанных слоев, только свертки» - Ян ЛеКун] (https://www.facebook.com/yann.lecun/posts/10152820758292143). Замените слои FC свертками и используйте что-то вроде «глобального среднего пула», чтобы уменьшить размеры изображения до известной формы. – mdaoust

+0

@dga & mdaoust: Большое спасибо. Я пробовал подход, предложенный dga, и это сработало. Я все еще ищу простое объяснение «Conv Net для манекенов». Из приведенного выше объяснения я понимаю, что 2x2 maxpool сокращает размер на 2. Почему 3-й размер удваивается с каждым maxpool. – user2849678

Смежные вопросы