我正在研究一个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]))