Tensorflow: ошибка при изменении размера пакета глубокой CNN

Я воспроизвел глубокую CNN из исследовательской работы. Когда я изначально построил модель, я предполагал, что размер пакета будет один. Однако теперь, когда я узнал больше о размерах пакетов, я хочу использовать размер пакета 40.

Вот репозиторий Github

Это очень глубокая сеть, поэтому ниже я покажу более простую версию проекта:

x = tf.placeholder(tf.float32, shape=[None, 7168])
y_ = tf.placeholder(tf.float32, shape=[None, 7168, 3])

#MANY CONVOLUTIONS OMITTED HERE

#one of many transpose convolutions, the 40 here is a change I made for the batch size
w = tf.Variable(tf.constant(1.,shape=[2,2,4,1,192]))
DeConnv1 = tf.nn.conv3d_transpose(layer1, filter = w, output_shape = [40,32,32,7,1], strides = [1,2,2,2,1], padding = 'SAME')

#I reshape the final convolution's batch size because I was getting errors
final = tf.reshape(final, [40, 7168])

#Accuracy and loss functions omitted because they do not deal with batch size

#Lastly, I train the model where a and be are size [40][7169][3] 40 is the batch size
train_step.run(feed_dict={x: a, y_: b, keep_prob: .5})

Когда я запускаю код из репозитория, я получаю эту ошибку. Какие еще изменения мне нужно внести, чтобы размер пакета равнялся 40?

Traceback (most recent call last):
  File "<stdin>", line 31, in <module>
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2042, 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 4490, in _run_using_default_session
    session.run(operation, feed_dict)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 889, in run
    run_metadata_ptr)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1120, in _run
    feed_dict_tensor, options, run_metadata)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1317, in _do_run
    options, run_metadata)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1336, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InternalError: cuDNN Backward Data function launch failure : input shape([320,4,4,1,896]) filter shape([3,3,1,896,800])
         [[Node: gradients/conv3d_2/Conv3D_grad/Conv3DBackpropInputV2 = Conv3DBackpropInputV2[T=DT_FLOAT, data_format="NDHWC", padding="VALID", strides=[1, 1, 1, 1, 1], _device="/job:localhost/replica:0/task:0/device:GPU:0"](gradients/conv3d_2/Conv3D_grad/Shape, conv3d_1/kernel/read, gradients/conv3d_2/BatchToSpaceND_grad/SpaceToBatchND)]]

Caused by op u'gradients/conv3d_2/Conv3D_grad/Conv3DBackpropInputV2', defined at:
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 343, in minimize
    grad_loss=grad_loss)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/optimizer.py", line 414, in compute_gradients
    colocate_gradients_with_ops=colocate_gradients_with_ops)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients_impl.py", line 581, in gradients
    grad_scope, op, func_call, lambda: grad_fn(op, *out_grads))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients_impl.py", line 353, in _MaybeCompile
    return grad_fn()  # Exit early
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients_impl.py", line 581, in <lambda>
    grad_scope, op, func_call, lambda: grad_fn(op, *out_grads))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_grad.py", line 82, in _Conv3DGrad
    data_format=data_format),
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.py", line 1084, in conv3d_backprop_input_v2
    data_format=data_format, name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2956, in create_op
    op_def=op_def)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1470, in __init__
    self._traceback = self._graph._extract_stack()  # pylint: disable=protected-access

...which was originally created as op u'conv3d_2/Conv3D', defined at:
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 2, in conv3d_dilation
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/convolutional.py", line 809, in conv3d
    return layer.apply(inputs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/base.py", line 671, in apply
    return self.__call__(inputs, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/base.py", line 575, in __call__
    outputs = self.call(inputs, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/layers/convolutional.py", line 167, in call
    outputs = self._convolution_op(inputs, self.kernel)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.py", line 835, in __call__
    return self.conv_op(inp, filter)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.py", line 499, in __call__
    return self.call(inp, filter)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.py", line 492, in _with_space_to_batch_call
    result = self.op(input_converted, filter)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.py", line 187, in __call__
    name=self.name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.py", line 847, in conv3d
    padding=padding, data_format=data_format, name=name)

InternalError (see above for traceback): cuDNN Backward Data function launch failure : input shape([320,4,4,1,896]) filter shape([3,3,1,896,800])
         [[Node: gradients/conv3d_2/Conv3D_grad/Conv3DBackpropInputV2 = Conv3DBackpropInputV2[T=DT_FLOAT, data_format="NDHWC", padding="VALID", strides=[1, 1, 1, 1, 1], _device="/job:localhost/replica:0/task:0/device:GPU:0"](gradients/conv3d_2/Conv3D_grad/Shape, conv3d_1/kernel/read, gradients/conv3d_2/BatchToSpaceND_grad/SpaceToBatchND)]]

person Devin Haslam    schedule 31.01.2018    source источник


Ответы (2)


Попробуй это:

shape = tf.shape(tf.reshape(x, [-1, 32, 32, 7, 1]))
DeConnv1 = tf.nn.conv3d_transpose(layer1, filter=w, output_shape=shape, strides=[1,2,2,2,1], padding='SAME')

final = tf.reshape(final, [-1, 7168])

Таким образом, вы не жестко кодируете 40 в модели, но можете передать любой размер пакета, который вы хотите, включая 40.

person Maxim    schedule 31.01.2018
comment
Я все еще получаю ту же самую ошибку. Не могли бы вы объяснить, что именно означает ошибка? Спасибо. - person Devin Haslam; 31.01.2018
comment
Хм... у меня нет ошибки. На самом деле InternalError указывает, что форма в порядке на стороне тензорного потока, но проблема глубже на уровне CUDA. Нормально ли работает tensorflow на вашей машине? - person Maxim; 31.01.2018
comment
Спасибо за помощь. Кажется, что 40 по какой-то причине было слишком большим размером партии. Возможно, проблема с памятью или что-то в этом роде. - person Devin Haslam; 31.01.2018
comment
Ах, если у вас так много слоев, как в этом вопросе, 40 действительно может быть слишком много. - person Maxim; 31.01.2018
comment
Если бы вы увидели эти результаты, что бы подсказала вам ваша интуиция? с моделью не так? Кстати, это никогда не произойдет с размером партии 1. Еще раз спасибо, я не знаю, что бы я делал без вашей помощи на этом сайте. - person Devin Haslam; 31.01.2018
comment
Похоже, инициализация веса, вероятно, слишком велика, потому что потери растут, в конечном итоге до NaN. Кроме того, обучение очень глубоких моделей может быть сложным, я бы рекомендовал вам добавлять слои итеративно. - person Maxim; 31.01.2018

Лучше всего избегать жесткого кодирования размера пакета на графике. Как обсуждалось здесь (см. «Как мне построить график, который работает с переменными размерами пакетов?» ) вы должны указать формы как [None, nx, ny, nz] и получить размеры пакетов, используя tf.shape(input)[0]. Кроме того, для изменения формы вы можете использовать такую ​​форму: tf.reshape(input, [-1, nx, ny, nz]), где -1 указывает, что размер пакета должен быть установлен на соответствующий размер во время выполнения.

person RobR    schedule 31.01.2018