Pytorch:运行时错误:Tensora(2)的大小必须与非单元素维度为1的TensorB(4)的大小相匹配

cbwuti44  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(167)

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))
mfuanj7w

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] .
因此,只需将输入数据更改为:

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]]

和模型来实现:

model = LinearRegression(num_inputs=6, num_outputs=2)

而且它起作用了!

相关问题