Как сделать мультиклассовую классификацию без горячего кодирования, используя 'sparse_categorical_entropy' в керасе? - PullRequest
1 голос
/ 13 апреля 2020

Мои данные довольно простые, введите массивы из m = 10 действительных чисел и выведите еще один массив из m = 10 чисел. Я пытаюсь отсортировать массивы с помощью нейронных сетей, я посылаю случайные числа и ожидаю, что NN выведет argsort (x), то есть массив целых чисел с позициями упорядоченного массива.

( N, 10) вход

array([0.2843506 , 0.89343795, 0.37331381, 0.67697506, 0.85043472,
       0.77386477, 0.08902575, 0.94891316, 0.83865261, 0.93507237])

---> (N, 10) выход

array([6, 0, 2, 3, 5, 8, 4, 1, 9, 7])

Я знаю, что стандартная практика скажет сделать кодирование в горячем режиме, но я знаю, что вы можете пропустите его с потерей sparse_categorical_entropy.

Вот моя модель:

def model_build():
  in_x = Input(shape=(m,))
  x = Dense(m,activation='relu')(in_x)
  x = Dense(m,activation='relu')(x)
  x = Dense(m,activation='relu')(x)
  x=Dense(m, activation='softmax')(x)

Сборка просто отлично:

Model: "model_110"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_111 (InputLayer)       (None, 10)                0         
_________________________________________________________________
dense_424 (Dense)            (None, 10)                110       
_________________________________________________________________
dense_425 (Dense)            (None, 10)                110       
_________________________________________________________________
dense_426 (Dense)            (None, 10)                110       
_________________________________________________________________
dense_427 (Dense)            (None, 10)                110       
=================================================================
Total params: 440
Trainable params: 440
Non-trainable params: 0
_________________________________________________________________
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:9: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor("in..., outputs=Tensor("de...)`
  if __name__ == '__main__':


  model = Model(inputs=in_x, output=x)
  return model  

Также компилируется без проблем

opt = Adam()
model.compile(optimizer=opt,
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_accuracy'])

Но не подходит:

H=model.fit(X_train,y_train, validation_data=(X_val,y_val),epochs=100)

Это дает мне ошибку формы:

ValueError: Error when checking target: expected dense_427 to have shape (1,) but got array with shape (10,)

Вот полная ошибка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-520-8559bb070d1e> in <module>()
      1 H=model.fit(X_train,y_train, validation_data=(X_val,y_val),
      2             #callbacks=callbacks_list,
----> 3             epochs=100)

2 frames
/usr/local/lib/python3.6/dist-packages/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_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
   1152             sample_weight=sample_weight,
   1153             class_weight=class_weight,
-> 1154             batch_size=batch_size)
   1155 
   1156         # Prepare validation data.

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    619                 feed_output_shapes,
    620                 check_batch_axis=False,  # Don't enforce the batch size.
--> 621                 exception_prefix='target')
    622 
    623             # Generate sample-wise weight values given the `sample_weight` and

/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    143                             ': expected ' + names[i] + ' to have shape ' +
    144                             str(shape) + ' but got array with shape ' +
--> 145                             str(data_shape))
    146     return data
    147 

ValueError: Error when checking target: expected dense_427 to have shape (1,) but got array with shape (10,)
...