![](/img/trans.png)
[英]Runtime Error: mat1 and mat2 shapes cannot be multiplied in pytorch
[英]Pytorch: mat1 and mat2 shapes cannot be multiplied
我為我的第一個 pytorch 模型設置了一個玩具示例:
x = torch.from_numpy(np.linspace(1,100,num=100))
y = torch.from_numpy(np.dot(2,x))
我已經建立了模型如下:
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.fc1 = nn.Linear(1,10)
self.fc2 = nn.Linear(10,20)
self.fc3 = nn.Linear(16,1)
def forward(self,inputs):
x = F.relu(self.fc1(inputs))
x = F.relu(self.fc2(x))
x = F.linear(self.fc3(x))
return x
但是,當我嘗試訓練時遇到了這個錯誤:
RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x20 and 1x10)
以下是完整代碼供參考:
import numpy as np # linear algebra
import torch
from torch.utils.data import Dataset
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
x = torch.from_numpy(np.linspace(1,100,num=100))
y = torch.from_numpy(np.dot(2,x))
class MyDataset(Dataset):
def __init__(self):
self.sequences = x
self.target = y
def __getitem__(self,i):
return self.sequences[i], self.target[i]
def __len__(self):
return len(self.sequences)
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.fc1 = nn.Linear(1,10)
self.fc2 = nn.Linear(10,20)
self.fc3 = nn.Linear(16,1)
def forward(self,inputs):
x = F.relu(self.fc1(inputs))
x = F.relu(self.fc2(x))
x = F.linear(self.fc3(x))
return x
model = Net().to('cpu')
# Generators
training_set = MyDataset()
loader = torch.utils.data.DataLoader(training_set, batch_size=20)
#criterion and optimizer
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.0001)
### Training
n_epochs = 12
for epoch in range(n_epochs):
for inputs,target in loader:
print(target)
optimizer.zero_grad()
output = model(inputs)
loss = criterion(output,target)
loss.backward()
optimizer.step()
以及完整的錯誤消息:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-107-d32fd01d3b41> in <module>
9 optimizer.zero_grad()
10
---> 11 output = model(inputs)
12
13 loss = criterion(output,target)
/opt/conda/lib/python3.7/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
725 result = self._slow_forward(*input, **kwargs)
726 else:
--> 727 result = self.forward(*input, **kwargs)
728 for hook in itertools.chain(
729 _global_forward_hooks.values(),
<ipython-input-103-aefe4823d2e8> in forward(self, inputs)
7
8 def forward(self,inputs):
----> 9 x = F.relu(self.fc1(inputs))
10 x = F.relu(self.fc2(x))
11 x = F.linear(self.fc3(x))
/opt/conda/lib/python3.7/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
725 result = self._slow_forward(*input, **kwargs)
726 else:
--> 727 result = self.forward(*input, **kwargs)
728 for hook in itertools.chain(
729 _global_forward_hooks.values(),
/opt/conda/lib/python3.7/site-packages/torch/nn/modules/linear.py in forward(self, input)
91
92 def forward(self, input: Tensor) -> Tensor:
---> 93 return F.linear(input, self.weight, self.bias)
94
95 def extra_repr(self) -> str:
/opt/conda/lib/python3.7/site-packages/torch/nn/functional.py in linear(input, weight, bias)
1690 ret = torch.addmm(bias, input, weight.t())
1691 else:
-> 1692 output = input.matmul(weight.t())
1693 if bias is not None:
1694 output += bias
RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x20 and 1x10)
任何建議將不勝感激。
這里有四個問題:
查看模型的第一層,我假設您的批次大小為 100。在這種情況下,正確的輸入形狀應該是(100, 1)
,而不是(100,)
。 要解決此問題,您可以使用unsqueeze(-1)
。
輸入應為D型浮動: x.float()
層self.fc3
的大小不正確。 以下內容對於self.fc2
相對於self.fc2
有效: nn.Linear(20,1)
。
最后F.linear
不是線性函數(即恆等函數)。 它實際上是一個線性變換(即x @ AT + b
)。 查看文檔以獲取更多詳細信息。 我不相信這就是你想要在你的情況下做的事情。
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(1, 10)
self.fc2 = nn.Linear(10, 20)
self.fc3 = nn.Linear(20, 1)
def forward(self,inputs):
x = F.relu(self.fc1(inputs))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
推理:
>>> x = torch.linspace(1, 100, 100).float().unsqueeze(-1)
>>> y_hat = Net()(x)
>>> y_hat.shape
torch.Size([100, 1])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.