В качестве фона я следую этому краткому руководству для классификации с несколькими метками , в котором у меня есть несколько конечных классов, для которых прогноз может быть связан с более чем одним конечным классом:
К сожалению, я получаю следующую ошибку:
Epoch 1/300
Traceback (most recent call last):
File "learn.py", line 124, in <module>
model.fit(train, train_labels, epochs=300)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\training.py", line 66, in _method_wrapper
return method(self, *args, **kwargs)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\training.py", line 848, in fit
tmp_logs = train_function(iterator)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\eager\def_function.py", line 580, in __call__
result = self._call(*args, **kwds)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\eager\def_function.py", line 627, in _call
self._initialize(args, kwds, add_initializers_to=initializers)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\eager\def_function.py", line 505, in _initialize
self._stateful_fn._get_concrete_function_internal_garbage_collected( # pylint: disable=protected-access
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\eager\function.py", line 2446, in _get_concrete_function_internal_garbage_collected
graph_function, _, _ = self._maybe_define_function(args, kwargs)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\eager\function.py", line 2777, in _maybe_define_function
graph_function = self._create_graph_function(args, kwargs)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\eager\function.py", line 2657, in _create_graph_function
func_graph_module.func_graph_from_py_func(
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\framework\func_graph.py", line 981, in func_graph_from_py_func
func_outputs = python_func(*func_args, **func_kwargs)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\eager\def_function.py", line 441, in wrapped_fn
return weak_wrapped_fn().__wrapped__(*args, **kwds)
File "C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\framework\func_graph.py", line 968, in wrapper
raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\training.py:571 train_function *
outputs = self.distribute_strategy.run(
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\distribute\distribute_lib.py:951 run **
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\distribute\distribute_lib.py:2290 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\distribute\distribute_lib.py:2649 _call_for_each_replica
return fn(*args, **kwargs)
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\training.py:532 train_step **
loss = self.compiled_loss(
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\engine\compile_utils.py:205 __call__
loss_value = loss_obj(y_t, y_p, sample_weight=sw)
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\losses.py:143 __call__
losses = self.call(y_true, y_pred)
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\losses.py:246 call
return self.fn(y_true, y_pred, **self._fn_kwargs)
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\losses.py:1595 binary_crossentropy
K.binary_crossentropy(y_true, y_pred, from_logits=from_logits), axis=-1)
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\keras\backend.py:4692 binary_crossentropy
return nn.sigmoid_cross_entropy_with_logits(labels=target, logits=output)
C:\Users\xwb18152\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\ops\nn_impl.py:171 sigmoid_cross_entropy_with_logits
raise ValueError("logits and labels must have the same shape (%s vs %s)" %
ValueError: logits and labels must have the same shape ((None, 5) vs (None, 20))
Для справки: это выходные данные фигур для train и train_labels:
train.shape <- (66633, 15)
train_labels.shape <- (66633, 20)
Тем не менее, я знаю, что train_labels.shape
показывает 20, но до One Hot Encoding и передачи его в функцию train_test_split
sklearn
, заголовок таблицы меток выглядит следующим образом:
Movement Distance Speed Delay Loss
1 1 25 0 0
1 1 25 0 0
1 1 25 0 0
1 1 25 0 0
1 1 25 0 0
Я не уверен, почему он внезапно перешел с 5 классов на 20 ..
Код , который я использую для модели, выглядит следующим образом:
## Pre-process ##
# Normalise
sc = MinMaxScaler()
dataset = sc.fit_transform(dataset)
# One-hot encode (OHE)
ohe = OneHotEncoder()
labels = ohe.fit_transform(labels).toarray()
# Split into train and test
train, test, train_labels, test_labels = train_test_split(dataset, labels, test_size=0.2) #80% train split
## Define model architecture ##
# Declare model format
model = Sequential()
model.add(Dense(30, input_dim=15, activation='relu'))
model.add(Dense(5, activation='sigmoid')) # Sigmoid for multi-label classification
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
## Fit the model ##
model.fit(train, train_labels, epochs=300)
РЕДАКТИРОВАТЬ: Набор данных и метки изначально являются pandas
фреймами данных.