Как я могу изменить функцию потерь при изменении формы моих данных? - PullRequest
0 голосов
/ 26 марта 2020

Поскольку мои данные слишком велики, я использую pd.read_csv('',chunksize=). Я использую categorical_crossentropy в качестве функции потерь, однако на последнем блоке у меня есть только одна цель. Итак, я получаю сообщение об ошибке:

Вы передаете целевой массив формы (2110, 1) при использовании в качестве потери categorical_crossentropy.

Теперь я знаю, что могу используйте binary_crossentropy. Вот что я и сделал.

X_train, X_test, y_train, y_test = train_test_split(train_data, train_labels, shuffle=True, test_size=0.3)
if y_train.shape[1] == 1:
   loss = 'binary_crossentropy'
else:
   loss = 'categorical_crossentropy'

Когда я это делаю, я получаю ошибку:

IndexError: index 1 выходит за пределы оси 0 с размером 1

Мои данные имеют горячее кодирование. Как я могу устранить эту ошибку? Спасибо.

ОБНОВЛЕНИЕ

Моя цель для последнего чанка выглядит так:

array([[1.],
       [1.],
       [1.],
       ...,
       [1.],
       [1.],
       [1.]], dtype=float32)

Мой X_train:

array([[ 0,  0,  0, ...,  8,  0,  0],
       [ 0,  0,  0, ..., 11,  0,  0],
       [ 0,  0,  0, ...,  7,  0,  0],
       ...,
       [ 0,  0,  0, ...,  8,  0,  0],
       [ 0,  0,  0, ..., 22,  0,  0],
       [ 0,  0,  0, ...,  5,  0,  1]])

Мой способ кодирования меток:

    labels = np.array(labels)
    train_data = docs_encoded.astype(int)
    encoder = LabelEncoder()
    encoder.fit(labels)
    encoded_labels = encoder.transform(labels)
    train_labels = np_utils.to_categorical(encoded_labels)

1 Ответ

0 голосов
/ 26 марта 2020

Вы пытаетесь изучить две задачи (двоичная и мультиклассовая классификация), используя одну и ту же модель. Это невозможно, если в каждом примере нет двух целей: 1 для двоичного кода и одного для мультиклассовой классификации. Что вы можете сделать, так это использовать мультиклассовую классификацию, используя «categoryorical_crossentropy» в качестве функции потерь, но обрабатывать свои метки соответствующим образом. Если у вашего последнего блока есть одна цель, просто закодируйте ее одним нажатием, как и все остальные цели.

ОБНОВЛЕНИЕ Если у вас 789 уникальных классов, а последний чун содержит метки, как вы сказали:

# I'm creating a mock label array for the last chunk.
import numpy as np
last_chunk_labels = np.array([[1.],
       [1.],
       [1.],
       [1.],
       [1.],
       [1.]])
categorical_labels = np_utils.to_categorical(a, 789)

ваши последние категориальные метки чанка будут выглядеть примерно так:

array([[0., 1., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.]], dtype=float32)

, где в каждой строке 789 элементов, где 0 - везде, а 1 - в индексе для метки класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...