Классификация с несколькими метками - ValueError: логиты и метки должны иметь одинаковую форму ((None, 5) vs (None, 20)) - PullRequest
0 голосов
/ 14 июля 2020

В качестве фона я следую этому краткому руководству для классификации с несколькими метками , в котором у меня есть несколько конечных классов, для которых прогноз может быть связан с более чем одним конечным классом:

К сожалению, я получаю следующую ошибку:

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 фреймами данных.

...