【问题标题】:t() expects a tensor with <= 2 dimensions, but self is 3Dt() 需要一个 <= 2 维的张量,但 self 是 3D
【发布时间】:2023-01-29 21:58:07
【问题描述】:

我是 pytorch 的新手,写了一个简单的代码如下来对一些输入进行分类。模型输入有 8*2,批量大小为 2,模型中的输入层有 2 个节点。我不知道怎么了!

X1=np.array([[2,1],[3,2],[-4,-1],[-1,-3],[2,-1],[3,-3],[-2,1],[-4,-2]])
Y1=np.array([0,0,0,0,1,1,1,1])
X=torch.tensor(X1)
Y=torch.tensor(Y1)

BATCH_SIZE=2
trainset= torch.utils.data.TensorDataset(X, Y)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=BATCH_SIZE,
                                          shuffle=True, num_workers=1)  
from torch.nn.modules import flatten



learning_rate = 0.01
num_epochs = 20

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = MyModel()
model = model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)


## compute accuracy
def get_accuracy(logit, target, batch_size):
    ''' Obtain accuracy for training round '''
    corrects = (torch.max(logit, 1)[1].view(target.size()).data == target.data).sum()
    accuracy = 100.0 * corrects/batch_size
    return accuracy.item()

model = MyModel()

# Commented out IPython magic to ensure Python compatibility.

for epoch in range(num_epochs):
    train_running_loss = 0.0
    train_acc = 0.0

    ## training step
    for inputs, labels in trainloader:

        #inputs=torch.flatten(inputs)
        inputs,labels=inputs.to(device), labels.to(device)
        #inputs = inputs.to(device)
        #labels = labels.to(device)

        optimizer.zero_grad()

        ## forward + backprop + loss
        
        print(inputs)
        
        outputs = model.forward(inputs)
        loss = criterion(outputs, labels)
        
        loss.backward()

        ## update model params
        optimizer.step()

        train_running_loss += loss.detach().item()
        train_acc += get_accuracy(outputs, labels, BATCH_SIZE)
    
        #model.train()
    model.eval()
    print('Epoch: %d | Loss: %.4f | Train Accuracy: %.2f'%(epoch, train_running_loss / i, train_acc/i))

我的模型如下:

class MyModel(nn.Module):
        def __init__(self):
            super(MyModel, self).__init__()
    
            self.d1 = nn.Linear(2,3)
            self.d2 = nn.Linear(3,1)
            self.init_weights()
    
        def init_weights(self):
            k1=torch.tensor([0.1,-0.72,0.94,-0.29,0.12,0.44])
            k1=torch.unsqueeze(torch.unsqueeze(k1,0),0)
            self.d1.weight.data=k1
            k2=torch.tensor([1,-1.16,-0.26])
            k2=torch.unsqueeze(torch.unsqueeze(k2,0),0)
            self.d2.weight.data=k2
    
        def forward(self, x):
            x = self.d1(x)
            x = F.tanh(x)
            x = self.d2(x)
            out = F.sigmoid(x)
    
            return out

然后我得到一个错误:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-27-196d819d3ccd> in <module>
    101         print(inputs)
    102 
--> 103         outputs = model.forward(inputs)
    104         loss = criterion(outputs, labels)
    105 

2 frames
/usr/local/lib/python3.8/dist-packages/torch/nn/modules/linear.py in forward(self, input)
    112 
    113     def forward(self, input: Tensor) -> Tensor:
--> 114         return F.linear(input, self.weight, self.bias)
    115 
    116     def extra_repr(self) -> str:

RuntimeError: t() expects a tensor with <= 2 dimensions, but self is 3D

我将输入展平但没有任何改变。我应该怎么做才能解决它?

【问题讨论】:

    标签: machine-learning pytorch


    【解决方案1】:

    首先,您不需要通过model.forward(x)调用模型的前向传播;使用model(x) 很好。

    其次,您到底想通过 init_weights 方法实现什么目标?你解压 k1k2 两次,使它们成为 (1, 1, x) 的形状,这是 3D 的,这是错误告诉你的。 torch.nn.Linear 执行与 2D 矩阵的矩阵乘法,所以你不能使用 3D 矩阵。 torch.nn.Linear 已经通过 Kaiming initialization [1] 初始化了权重,所以我不确定你想在这里实现什么。

    init_weights 方法更改为:

    def init_weights(self):
        k1 = torch.tensor([0.1, -0.72, 0.94, -0.29, 0.12, 0.44])
        k1 = k1.reshape(self.d1.weight.shape)
        self.d1.weight.data = k1
                
        k2 = torch.tensor([1, -1.16, -0.26])
        k2 = k2.reshape(self.d2.weight.shape)
        self.d2.weight.data = k2
    

    inputs 的类型从 Long 更改为 Float(即 model(inputs.float()))应该可以解决您的问题。

    参考

    [1] https://github.com/pytorch/pytorch/blob/0dceaf07cd1236859953b6f85a61dc4411d10f87/torch/nn/modules/linear.py#L103

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2019-02-19
      • 1970-01-01
      • 2022-01-21
      • 2020-12-04
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多