Pytorch 上的一维 CNN:mat1 和 mat2 形状不能相乘(10x3 和 10x2)
1D CNN on Pytorch: mat1 and mat2 shapes cannot be multiplied (10x3 and 10x2)
我有一个包含 500 个样本和 2 种标签的时间序列,我想构建一个带有 pytorch 的一维 CNN:
class Simple1DCNN(torch.nn.Module):
def __init__(self):
super(Simple1DCNN, self).__init__()
self.layer1 = torch.nn.Conv1d(in_channels=50,
out_channels=20,
kernel_size=5,
stride=2)
self.act1 = torch.nn.ReLU()
self.layer2 = torch.nn.Conv1d(in_channels=20,
out_channels=10,
kernel_size=1)
self.fc1 = nn.Linear(10* 1 * 1, 2)
def forward(self, x):
x = x.view(1, 50,-1)
x = self.layer1(x)
x = self.act1(x)
x = self.layer2(x)
x = self.fc1(x)
return x
model = Simple1DCNN()
model(torch.tensor(np.random.uniform(-10, 10, 500)).float())
但收到此错误消息:
Traceback (most recent call last):
File "so_pytorch.py", line 28, in <module>
model(torch.tensor(np.random.uniform(-10, 10, 500)).float())
File "/Users/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "so_pytorch.py", line 23, in forward
x = self.fc1(x)
File "/Users/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/Users/lib/python3.8/site-packages/torch/nn/modules/linear.py", line 93, in forward
return F.linear(input, self.weight, self.bias)
File "/Users/lib/python3.8/site-packages/torch/nn/functional.py", line 1692, in linear
output = input.matmul(weight.t())
RuntimeError: mat1 and mat2 shapes cannot be multiplied (10x3 and 10x2)
我做错了什么?
行x = self.layer2(x)
(也是下一行x = self.fc1(x)
的输入)的输出形状为torch.Size([1, 10, 3])
.
现在根据 self.fc1
的定义,它期望输入的最后一个维度为 10 * 1 * 1
,即 10
,而您的输入有 3
,因此出现错误.
我不知道你想做什么,但假设你想做的是;
- 将整个
500
大小序列标记为两个标签之一,您可以这样做。
# replace self.fc1 = nn.Linear(10* 1 * 1, 2) with
self.fc1 = nn.Linear(10 * 3, 2)
# replace x = self.fc1(x) with
x = x.view(1, -1)
x = self.fc1(x)
- label
10
timesteps 每个到两个标签之一,然后你这样做。
# replace self.fc1 = nn.Linear(10* 1 * 1, 2) with
self.fc1 = nn.Linear(2, 2)
1 的输出形状为(批量大小,2),2 的输出形状为(批量大小,10, 2).
我有一个包含 500 个样本和 2 种标签的时间序列,我想构建一个带有 pytorch 的一维 CNN:
class Simple1DCNN(torch.nn.Module):
def __init__(self):
super(Simple1DCNN, self).__init__()
self.layer1 = torch.nn.Conv1d(in_channels=50,
out_channels=20,
kernel_size=5,
stride=2)
self.act1 = torch.nn.ReLU()
self.layer2 = torch.nn.Conv1d(in_channels=20,
out_channels=10,
kernel_size=1)
self.fc1 = nn.Linear(10* 1 * 1, 2)
def forward(self, x):
x = x.view(1, 50,-1)
x = self.layer1(x)
x = self.act1(x)
x = self.layer2(x)
x = self.fc1(x)
return x
model = Simple1DCNN()
model(torch.tensor(np.random.uniform(-10, 10, 500)).float())
但收到此错误消息:
Traceback (most recent call last):
File "so_pytorch.py", line 28, in <module>
model(torch.tensor(np.random.uniform(-10, 10, 500)).float())
File "/Users/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "so_pytorch.py", line 23, in forward
x = self.fc1(x)
File "/Users/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/Users/lib/python3.8/site-packages/torch/nn/modules/linear.py", line 93, in forward
return F.linear(input, self.weight, self.bias)
File "/Users/lib/python3.8/site-packages/torch/nn/functional.py", line 1692, in linear
output = input.matmul(weight.t())
RuntimeError: mat1 and mat2 shapes cannot be multiplied (10x3 and 10x2)
我做错了什么?
行x = self.layer2(x)
(也是下一行x = self.fc1(x)
的输入)的输出形状为torch.Size([1, 10, 3])
.
现在根据 self.fc1
的定义,它期望输入的最后一个维度为 10 * 1 * 1
,即 10
,而您的输入有 3
,因此出现错误.
我不知道你想做什么,但假设你想做的是;
- 将整个
500
大小序列标记为两个标签之一,您可以这样做。
# replace self.fc1 = nn.Linear(10* 1 * 1, 2) with
self.fc1 = nn.Linear(10 * 3, 2)
# replace x = self.fc1(x) with
x = x.view(1, -1)
x = self.fc1(x)
- label
10
timesteps 每个到两个标签之一,然后你这样做。
# replace self.fc1 = nn.Linear(10* 1 * 1, 2) with
self.fc1 = nn.Linear(2, 2)
1 的输出形状为(批量大小,2),2 的输出形状为(批量大小,10, 2).