InvalidArgumentError:Error at the time of fit model

InvalidArgumentError:Error at the time of fit model

我正在使用 多层感知器 和 keras 进行疾病分类,下面是过程描述, 将数据集拆分为train_x、train_y、test_x、test_y:

from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split

images,y = shuffle(images, y,random_state=1)
train_x, test_x, train_y, test_y = train_test_split(images, y, test_size=0.10, random_state = 415)

使用tensorflow nad kears开发顺序模型

import keras
import tensorflow as tf

model = keras.Sequential([keras.layers.Flatten(input_shape=(300,300,3)),
                         keras.layers.Dense(256, activation=tf.nn.tanh),
                         keras.layers.Dense(3, activation=tf.nn.softmax)
                         ])

编译模型

model.compile(optimizer=tf.optimizers.Adam(),
             loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

** 用 30 个时期训练模型**

model.fit(train_x,train_y, epochs=30)   #I faced the error here

以下错误,请关注帮助我:

Epoch 1/30
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-32-7830734727c4> in <module>
      1 # Train the model with 30 epochs
----> 2 model.fit(train_x,train_y, epochs=30)

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py in _method_wrapper(self, *args, **kwargs)
     64   def _method_wrapper(self, *args, **kwargs):
     65     if not self._in_multi_worker_mode():  # pylint: disable=protected-access
---> 66       return method(self, *args, **kwargs)
     67 
     68     # Running inside `run_distribute_coordinator` already.

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
    846                 batch_size=batch_size):
    847               callbacks.on_train_batch_begin(step)
--> 848               tmp_logs = train_function(iterator)
    849               # Catch OutOfRangeError for Datasets of unknown size.
    850               # This blocks until the batch has finished executing.

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
    578         xla_context.Exit()
    579     else:
--> 580       result = self._call(*args, **kwds)
    581 
    582     if tracing_count == self._get_tracing_count():

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
    609       # In this case we have created variables on the first call, so we run the
    610       # defunned version which is guaranteed to never create variables.
--> 611       return self._stateless_fn(*args, **kwds)  # pylint: disable=not-callable
    612     elif self._stateful_fn is not None:
    613       # Release the lock early so that multiple threads can perform the call

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py in __call__(self, *args, **kwargs)
   2418     with self._lock:
   2419       graph_function, args, kwargs = self._maybe_define_function(args, kwargs)
-> 2420     return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
   2421 
   2422   @property

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py in _filtered_call(self, args, kwargs)
   1659       `args` and `kwargs`.
   1660     """
-> 1661     return self._call_flat(
   1662         (t for t in nest.flatten((args, kwargs), expand_composites=True)
   1663          if isinstance(t, (ops.Tensor,

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
   1743         and executing_eagerly):
   1744       # No tape is watching; skip to running the function.
-> 1745       return self._build_call_outputs(self._inference_function.call(
   1746           ctx, args, cancellation_manager=cancellation_manager))
   1747     forward_backward = self._select_forward_and_backward_functions(

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py in call(self, ctx, args, cancellation_manager)
    591       with _InterpolateFunctionError(self):
    592         if cancellation_manager is None:
--> 593           outputs = execute.execute(
    594               str(self.signature.name),
    595               num_outputs=self._num_outputs,

~/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     57   try:
     58     ctx.ensure_initialized()
---> 59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
     60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:

InvalidArgumentError:  Received a label value of 3 which is outside the valid range of [0, 3).  Label values: 1 1 1 2 2 0 0 2 1 1 1 3 3 3 2 1 3 2 1 0 3 3 1 1 3 3 1 1 1 3 3 3
     [[node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at <ipython-input-28-7830734727c4>:2) ]] [Op:__inference_train_function_549]

Function call stack:
train_function

您的标签 (train_y) 包含 0 到 3(含)之间的值:

Received a label value of 3 which is outside the valid range of [0, 3). Label values: 1 1 1 2 2 0 0 2 1 1 1 3 3 3 2 1 3 2 1 0 3 3 1 1 3 3 1 1 1 3 3 3

这意味着有 4 个不同的标签 (0, 1, 2, 3)。

因此你的模型最后一层的维度应该等于 4 而不是 3:

model = keras.Sequential([keras.layers.Flatten(input_shape=(300,300,3)),
                         keras.layers.Dense(256, activation=tf.nn.tanh),
                         keras.layers.Dense(4, activation=tf.nn.softmax)
                         ])