我正在尝试编写自己的神经网络来检测特定的手势,参考了https://www.kaggle.com/benenharrington/hand-gesture-recognition-database-with-cnn/execution上的代码。
model.add(layers.Conv2D(32, (5, 5), strides=(2, 2), activation='relu', input_shape=(200, 200,1))) model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation='relu'))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Flatten())model.add(layers.Dense(128, activation='relu'))model.add(layers.Dense(10, activation='softmax'))model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
当我尝试使用以下代码拟合我的模型时:model.fit(x_train, y_train, epochs=10, batch_size=64, verbose=1, validation_data=(x_validate, y_validate))
我得到了以下错误:
File ".\My_data_model.py", line 73, in <module> model.fit(x_train, y_train, epochs=10, batch_size=2, verbose=1, validation_data=(x_validate, y_validate)) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\engine\training.py", line 108, in _method_wrapper return method(self, *args, **kwargs) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1098, in fit tmp_logs = train_function(iterator) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\eager\def_function.py", line 780, in __call__ result = self._call(*args, **kwds) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\eager\def_function.py", line 823, in _call self._initialize(args, kwds, add_initializers_to=initializers) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\eager\def_function.py", line 696, in _initialize self._stateful_fn._get_concrete_function_internal_garbage_collected( # pylint: disable=protected-access File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\eager\function.py", line 2855, in _get_concrete_function_internal_garbage_collected graph_function, _, _ = self._maybe_define_function(args, kwargs) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\eager\function.py", line 3213, in _maybe_define_function graph_function = self._create_graph_function(args, kwargs) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\eager\function.py", line 3065, in _create_graph_function func_graph_module.func_graph_from_py_func( File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\framework\func_graph.py", line 986, in func_graph_from_py_func func_outputs = python_func(*func_args, **func_kwargs) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\eager\def_function.py", line 600, in wrapped_fn return weak_wrapped_fn().__wrapped__(*args, **kwds) File "D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\framework\func_graph.py", line 973, in wrapper raise e.ag_error_metadata.to_exception(e)ValueError: in user code: D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\engine\training.py:806 train_function * return step_function(self, iterator) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\engine\training.py:796 step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:1211 run return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2585 call_for_each_replica return self._call_for_each_replica(fn, args, kwargs) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\distribute\distribute_lib.py:2945 _call_for_each_replica return fn(*args, **kwargs) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\engine\training.py:789 run_step ** outputs = model.train_step(data) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\engine\training.py:748 train_step loss = self.compiled_loss( D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\engine\compile_utils.py:204 __call__ loss_value = loss_obj(y_t, y_p, sample_weight=sw) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\losses.py:149 __call__ losses = ag_call(y_true, y_pred) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\losses.py:253 call ** return ag_fn(y_true, y_pred, **self._fn_kwargs) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\util\dispatch.py:201 wrapper return target(*args, **kwargs) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\losses.py:1535 categorical_crossentropy return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\util\dispatch.py:201 wrapper return target(*args, **kwargs) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\keras\backend.py:4687 categorical_crossentropy target.shape.assert_is_compatible_with(output.shape) D:\anaconda3\envs\tf-gpu-cuda8\lib\site-packages\tensorflow\python\framework\tensor_shape.py:1134 assert_is_compatible_with raise ValueError("Shapes %s and %s are incompatible" % (self, other)) ValueError: Shapes (64, 4) and (64, 10) are incompatible
通过调整代码,我注意到错误消息中的64会随着batchsize值的变化而变化。我使用了kaggle数据集,并且能够无问题地运行代码。
有什么建议吗?
回答:
这里的问题在于输出标签,你没有说明使用了什么数据,但这是由于输出标签数量的原因
如果你将10改为4,这是一个简单的修复
model.add(layers.Dense(4, activation='softmax')) # 预期标签