InvalidArgumentError:拟合模型时出错
Posted
技术标签:
【中文标题】InvalidArgumentError:拟合模型时出错【英文标题】:InvalidArgumentError:Error at the time of fit model 【发布时间】:2021-04-09 17:44:27 【问题描述】:我正在使用带有 keras 的 Multi-Layer Perceptron 进行疾病分类,下面是过程的描述, 将数据集拆分为 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 个 epoch 训练模型**
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
【问题讨论】:
【参考方案1】:您的标签 (train_y) 包含介于 0 和 3(含)之间的值:
收到的标签值 3 超出了 [0, 3) 的有效范围。标签值: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)
])
【讨论】:
以上是关于InvalidArgumentError:拟合模型时出错的主要内容,如果未能解决你的问题,请参考以下文章
InvalidArgumentError:收到的标签值 8825 超出 [0, 8825) SEQ2SEQ 模型的有效范围
Tensorflow 中带有 model.fit 的 InvalidArgumentError
TensorFlow 多 GPU InvalidArgumentError:cifar10_multi_gpu.py
tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found.
tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found.