尝试拟合我的模型时出现“ValueError: Shapes (64, 4) and (64, 10) is incompatible”

时间:2021-05-02 04:30:38

标签: python python-3.x tensorflow machine-learning keras

我正在尝试按照从 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 随批大小值而变化。我还使用了 kaggle 数据集,并且能够毫无问题地运行代码。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这里的问题是输出标签,你没有指定你使用的数据,而是由于输出标签的数量

如果从 10 更改为 4,这是一个简单的修复

model.add(layers.Dense(4, activation='softmax')) # Expected label