pytorch程序需要返回“石头、布、剪刀”游戏的结果。输入以单热Tensor的形式给出:[ [1,0,0],[0,1,0] ]([1,0,0]-石头,[0,1,0] -剪刀)输出必须为:[1,0](第一个玩家赢,第二个玩家输)。这段代码有什么问题?
import torch
from torch import nn
import torch.utils.data as data
torch.manual_seed(42)
input = [[1, 0, 0], [0, 1, 0]], [[1, 0, 0], [0, 0, 1]], [[0, 1, 0], [0, 1, 0]], [[0, 0, 1], [1, 0, 0]]
input = torch.tensor(input, dtype=torch.float32)
result = [[1, 0], [0, 1], [1, 1], [1, 0]]
result = torch.tensor(result, dtype=torch.float32)
class LinearRegression(nn.Module):
def __init__(self, num_inputs, num_outputs):
super().__init__()
self.linear = nn.Linear(num_inputs, num_outputs)
self.act_fn = nn.Sigmoid()
def forward(self, x):
x = self.linear(x)
x = self.act_fn(x)
return x
model = LinearRegression(num_inputs=3, num_outputs=2)
print(model)
# Training loop
for name, param in model.named_parameters():
print(f"Parameter {name}, shape {param.shape}")
for x in input:
print(model(x))
print(model(input))
print('####################')
model.train()
optimizer = torch.optim.SGD(model.parameters(), lr=0.3)
lossfunc = nn.MSELoss()
# Training loop
for _ in range(1000):
res = model(input)
res = res.squeeze(dim=1)
loss = lossfunc(res, result)
# print(loss)
## Backpropagation
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(model(input))
1条答案
按热度按时间mfuanj7w1#
您会遇到以下问题:您希望模型将player 1的剪刀/布/石头和player 2的剪刀/布/石头作为输入。由于您使用了one-hot编码,因此您希望将6个值输入到神经网络中。player 1为3个,player 2为3个。但您试图
嘿,一个密集/前馈神经网络只能接受一个向量作为输入。但是你试图传递两个大小为3
[[1, 0, 0], [0, 1, 0]]
的向量。你可以/应该做的是将这两个向量连接起来。这意味着前3个值是player 1的one-hot编码结果,后3个值是player 2的one-hot编码结果。如下所示:[1, 0, 0, 0, 1, 0]
.因此,只需将输入数据更改为:
和模型来实现:
而且它起作用了!