如何解决InvalidArgumentError:拟合模型时的错误
我正在使用带有 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,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 个 epochs 训练模型**
model.fit(train_x,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,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,**kwargs):
65 if not self._in_multi_worker_mode(): # pylint: disable=protected-access
---> 66 return method(self,**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,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,**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,**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,**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,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,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,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,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,name)
57 try:
58 ctx.ensure_initialized()
---> 59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle,device_name,op_name,60 inputs,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(含)之间的值:
接收到超出有效范围 [0,3) 的标签值 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)
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。