#python #machine-learning #neural-network #pytorch #one-hot-encoding
#питон #машинное обучение #нейронная сеть #пыторч #одно горячее кодирование
Вопрос:
Я создаю модель машинного обучения для расчета коэффициента выигрыша в игре при различных комбинациях символов. Я получил ошибку в последней строке, используя функцию потерь. Я думаю, это потому, что входные данные являются одним горячим вектором. Выходные данные модели несовместимы с целевыми данными. Поскольку целевые данные-это просто логическое значение, выигрывайте или проигрывайте. Пожалуйста, дайте мне совет, как справиться с этой проблемой. Как сделать один горячий вход совместимым с другим горячим?
'''for example, when the number of character is 4 and eahc team member is 2. x_data is [ [[0,0,1,0], [0,1,0,0], [1,0,0,0,],[0,1,0,0]], [game2]...] team A1, temaA2, temaB1 teamB2 ''' y_data = [[0], [0], [0], [1], [1], [1]] # team blue win: 1, lose : 0 x_train = torch.FloatTensor(x_data) y_train = torch.FloatTensor(y_data) class BinaryClassifier(nn.Module): def __init__(self): super(BinaryClassifier, self).__init__() self.layer1 = nn.Sequential( nn.Linear(in_features=num_characters, out_features=10, bias=True), nn.ReLU(), ) self.layer2 = nn.Sequential( nn.Linear(in_features=10, out_features=1, bias=True), nn.Sigmoid(), ) def forward(self, x): x = self.layer1(x) x = self.layer2(x) return torch.sigmoid(x) model = BinaryClassifier() optimizer = optim.SGD(model.parameters(), lr=1) nb_epochs = 1000 for epoch in range(nb_epochs 1): hypothesis = model(x_train) cost = nn.BCELoss(hypothesis, y_train) # RuntimeError: bool value of Tensor with more than one value is ambiguous
Ответ №1:
Во-первых, ваша проблема не в однократном кодировании, потому что вывод вашей модели-это число, а Y_data равно 0-1, поэтому они совместимы. Ваша проблема заключается в создании экземпляра потери. Поэтому вам необходимо создать экземпляр потери, а затем передать аргументы:
... model = BinaryClassifier() optimizer = torch.optim.SGD(model.parameters(), lr=1) loss = nn.BCELoss() nb_epochs = 1000 for epoch in range(nb_epochs 1): hypothesis = model(x_train) cost = loss(hypothesis, y_train)
О ваших x_data, если ваши данные похожи:
[[0,0,1,0], [0,1,0,0], [1,0,0,0,], [0,1,0,0],...]
в self.layer1
вы должны указать in_features
с 4.
Если x_data похоже:
[ [[0,0,1,0], [0,1,0,0], [1,0,0,0,], [0,1,0,0]], [[0,0,1,0], [0,1,0,0], [1,0,0,0,], [0,1,0,0]], ...]
и вы хотите использовать линейный слой, вам нужно выровнять каждый образец, потому что линейный слой принимает входные данные 1-dim.
Например, вышесказанное было бы:
[[0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0], [0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0], ...]
и. in_features=16
К вашему сведению, вы можете использовать CNN (Сверточная нейронная сеть) для ввода 2 и более измерений, а для последовательных входов вы можете использовать RNN (Рекуррентная нейронная сеть).
Надеюсь, это может быть полезно.
Комментарии:
1. Спасибо вам за ваш совет. Я скучал по этому. Однако тогда я получил еще одну ошибку. Ошибка значения: Цель и входные данные должны содержать одинаковое количество элементов. целевой элемент (6) != входной элемент (60). Я думаю, что 6-это число y_data, которое является результатом игры. А 60-это число x_data. * 10 (количество игровых персонажей в одной игре (в данном случае синий: 5, красный: 5). Должен ли я сопоставлять y_data с данными результата? Как [1,1,1,1,1,0,0,0,0,], это означает победу голубой команды.
2. Не могли бы вы, пожалуйста, указать точную структуру x_data.
3.
x_data = [ [[0,0,1,0], [0,1,0,0], [1,0,0,0,],[0,1,0,0]] ]
это точные данные игры. Одна игра состоит из 4 игроков (красный:2, синий 2:) и [1,0,0,0,] является одним горячим вектором для персонажа. В моем случае персонажей больше.4. Я отредактировал ответ.