Размер мини-пакета PyTorch CrossEntropyLoss

Я пытаюсь построить простой пример с нулевым CrossEntropyLoss, с тремя классами и размером мини-пакета = 1:

ce_loss = nn.CrossEntropyLoss()
outputs = torch.tensor([[1,0,3]], dtype=float)
targets = torch.tensor([1,0,3], dtype=torch.int64)
loss = ce_loss(outputs, targets)

Что приводит к ошибке:

ValueError: Expected input batch_size (1) to match target batch_size (3).

Что не так и откуда берется target batch_size (3)?

Обновление 1

Согласно моему пониманию документов PyTorch, я пробую следующие случаи. Укажите, пожалуйста, в чем я ошибаюсь.

Пример 1:

outputs = torch.tensor([[1,1]], dtype=float)
targets = torch.tensor([1], dtype=torch.int64)
loss = ce_loss(outputs, targets)

Выход:

loss: 0.6931471805599453

Вопросов:

1) У меня есть один класс, равный 1, и два прогноза для этого класса, каждое из которых равно 1, правильно?

2) Почему убыток ненулевой?

Пример 2:

outputs = torch.tensor([[1]], dtype=float)
targets = torch.tensor([1], dtype=torch.int64)
loss = ce_loss(outputs, targets)

Ошибка:

IndexError: Target 1 is out of bounds.

Вопросов:

1) У меня есть один класс, равный 1, и одно предсказание для этого класса, равное 1, правильно?

2) Почему ошибка индекса?

Пример 3:

outputs = torch.tensor([[1,1],[2,2]], dtype=float)
targets = torch.tensor([1, 2], dtype=torch.int64)
loss = ce_loss(outputs, targets)

Ошибка:

IndexError: Target 2 is out of bounds.

Вопросов:

1) У меня есть два класса, равные 1 и 2, два прогноза для этих классов, равные 1 и 2 (размер пакета = 2), правильно?

2) Почему ошибка индекса?

--- Другие вопросы: ----

Какую форму должны иметь выходные данные и цели для следующих случаев:

1) Бинарная классификация, один временной шаг, одно значение, предсказываемое одним выходным нейроном, размер пакета = 1

2) Двоичная классификация, пять различных временных шагов, 5 значений, предсказываемых одним выходным нейроном, размер пакета = 5

3) Семь классов, один временной шаг, 7 значений, предсказываемых 7 выходными нейронами, размер пакета = 1

4) Семь классов, пять различных временных шагов, 5 наборов из 7 значений предсказываются 7 выходными нейронами, размер пакета = 5


person dokondr    schedule 24.02.2020    source источник


Ответы (1)


Ваш outputs содержит 1 партию (1 образец):

outputs = torch.tensor([[1,0,3]], dtype=float)

С другой стороны, ваш targets содержит 3 класса, что соответствует 3 пакетам (3 образца).

Вы должны передать только одну целевую метку, соответствующую образцу в outputs, например.

targets = torch.tensor([1], dtype=torch.int64)

Дополнительные сведения о входных данных, переданных в CrossEntropy, см. здесь.

person kHarshit    schedule 24.02.2020
comment
Спасибо, см. Обновление 1 моего вопроса. - person dokondr; 25.02.2020