Как сделать одноразовые данные совместимыми с одноразовыми данными?

#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. Я отредактировал ответ.