TensorFlow CNN tf.nn.conv2d ValueError: 输出深度不是 (op: 'Conv2D') 组数的倍数



我正在研究一个CNN分类模型,并尝试应用MNIST数据集,并在tf.nn.conv2d((操作期间获得以下ValueError异常,有关更多详细信息,请参阅下文。

conv2d操作的代码片段:

CONV2_f = 5
CONV2_n = 16
...
#POOL1
self.max_pool_layer_1 = tf.nn.max_pool(self.a_convolutional_layer_1, ksize=[ 1, 2, 2, 1 ], strides=[ 1, 2, 2, 1 ], padding='VALID')
print('POOL1 layer dimension: ', self.max_pool_layer_1.shape)
#         set_trace()
#CONV2
self.filter_convolutional_layer_2 = tf.Variable(tf.random.normal([CONV2_f,CONV2_f, image_channels, CONV2_n]))
print('self.max_pool_layer_1.shape = ',self.max_pool_layer_1.shape)
print('self.filter_convolutional_layer_2.shape = ', self.filter_convolutional_layer_2.shape)
self.conv2d_convolutional_layer_2 = tf.nn.conv2d(self.max_pool_layer_1, use_cudnn_on_gpu=True, filter=self.filter_convolutional_layer_2, strides=[1, 1, 1, 1], padding='VALID')

打印报表:

Input layer dimension:  (1000, 28, 28, 1)
CONV1 layer dimension:  (1000, 24, 24, 6)
POOL1 layer dimension:  (1000, 12, 12, 6)
self.max_pool_layer_1.shape =  (1000, 12, 12, 6)
self.filter_convolutional_layer_2.shape =  (5, 5, 1, 16)

异常摘录:


---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
C:devprogramsMiniconda3envsmseml2-gpulibsite-packagestensorflowpythonframeworkops.py in _create_c_op(graph, node_def, inputs, control_inputs)
1863   try:
-> 1864     c_op = c_api.TF_FinishOperation(op_desc)
1865   except errors.InvalidArgumentError as e:
InvalidArgumentError: Depth of output (16) is not a multiple of the number of groups (6) for 'Conv2D_1' (op: 'Conv2D') with input shapes: [1000,12,12,6], [5,5,1,16].
During handling of the above exception, another exception occurred:
ValueError                                Traceback (most recent call last)
<ipython-input-21-b36571fb8c02> in <module>
10     mnist.train_images.shape[3],
11     batch_size,
---> 12     learning_rate,
13 )
14 
<ipython-input-13-d4fafa792491> in __init__(self, num_classes, image_height, image_width, image_channels, batch_size, learning_rate)
49         print('self.filter_convolutional_layer_2.shape = ', self.filter_convolutional_layer_2.shape)
50 
---> 51         self.conv2d_convolutional_layer_2 = tf.nn.conv2d(self.max_pool_layer_1, use_cudnn_on_gpu=True, filter=self.filter_convolutional_layer_2, strides=[1, 1, 1, 1], padding='VALID')
52 
53         self.biases_convolutional_layer_2 = tf.Variable(tf.random.normal([1, CONV2_n]))
C:devprogramsMiniconda3envsmseml2-gpulibsite-packagestensorflowpythonopsnn_ops.py in conv2d(input, filter, strides, padding, use_cudnn_on_gpu, data_format, dilations, name, filters)
1951                            data_format=data_format,
1952                            dilations=dilations,
-> 1953                            name=name)
1954 
1955 
C:devprogramsMiniconda3envsmseml2-gpulibsite-packagestensorflowpythonopsgen_nn_ops.py in conv2d(input, filter, strides, padding, use_cudnn_on_gpu, explicit_paddings, data_format, dilations, name)
1069                   padding=padding, use_cudnn_on_gpu=use_cudnn_on_gpu,
1070                   explicit_paddings=explicit_paddings,
-> 1071                   data_format=data_format, dilations=dilations, name=name)
1072   _result = _op.outputs[:]
1073   _inputs_flat = _op.inputs
C:devprogramsMiniconda3envsmseml2-gpulibsite-packagestensorflowpythonframeworkop_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords)
786         op = g.create_op(op_type_name, inputs, dtypes=None, name=scope,
787                          input_types=input_types, attrs=attr_protos,
--> 788                          op_def=op_def)
789       return output_structure, op_def.is_stateful, op
790 
C:devprogramsMiniconda3envsmseml2-gpulibsite-packagestensorflowpythonutildeprecation.py in new_func(*args, **kwargs)
505                 'in a future version' if date is None else ('after %s' % date),
506                 instructions)
--> 507       return func(*args, **kwargs)
508 
509     doc = _add_deprecated_arg_notice_to_docstring(
C:devprogramsMiniconda3envsmseml2-gpulibsite-packagestensorflowpythonframeworkops.py in create_op(***failed resolving arguments***)
3614           input_types=input_types,
3615           original_op=self._default_original_op,
-> 3616           op_def=op_def)
3617       self._create_op_helper(ret, compute_device=compute_device)
3618     return ret
C:devprogramsMiniconda3envsmseml2-gpulibsite-packagestensorflowpythonframeworkops.py in __init__(self, node_def, g, inputs, output_types, control_inputs, input_types, original_op, op_def)
2025           op_def, inputs, node_def.attr)
2026       self._c_op = _create_c_op(self._graph, node_def, grouped_inputs,
-> 2027                                 control_input_ops)
2028 
2029     # Initialize self._outputs.
C:devprogramsMiniconda3envsmseml2-gpulibsite-packagestensorflowpythonframeworkops.py in _create_c_op(graph, node_def, inputs, control_inputs)
1865   except errors.InvalidArgumentError as e:
1866     # Convert to ValueError for backwards compatibility.
-> 1867     raise ValueError(str(e))
1868 
1869   return c_op
ValueError: Depth of output (16) is not a multiple of the number of groups (6) for 'Conv2D_1' (op: 'Conv2D') with input shapes: [1000,12,12,6], [5,5,1,16].

主要问题似乎是:ValueError:对于输入形状为[100,12,12,6]、[5,5,16]的"Conv2D_1'"(操作:"Conv2D'"(,输出深度(16(不是组数(6(的倍数

有趣的是,我已经使用我的CNN分类模型对猫的数据进行了分类,它的输出深度和组数相同。

事实:

  • Windows 10
  • Anaconda Powershell for Windows(版本4.7.12(
  • Python(3.7.4.final.0版(
  • 使用GPU加速
  • CUDU(10.0版(
  • cuDNN(7.4.2版(
  • 环境依赖项(Environment.yml(:
name: PLACEHOLDER
channels:
- defaults
dependencies:
- jupyter==1.0.0
- matplotlib==3.1.1
- numpy==1.16.5
- scikit-learn==0.21.2
- scipy==1.3.1
- tensorboard==1.14.0
- tensorflow-gpu==1.14.0
- python==3.7.0

你知道我做错了什么吗?

我感谢您提前提供的答案和提示!

多亏了一位朋友,我一段时间后找到了解决方案。

代替:

self.filter_convolutional_layer_2 = tf.Variable(tf.random.normal([CONV2_f,CONV2_f, image_channels, CONV2_n]))

用途:

self.filter_convolutional_layer_2 = tf.Variable(tf.random.normal([CONV2_f,CONV2_f, self.max_pool_layer_1.shape[3], CONV2_n]))

相关内容

最新更新