实施问题:用于模式识别的深度卷积网络
Implementation Issue: Deep ConvNet for Pattern Recognition
我正在尝试使用全卷积网络实现模式识别模型(https://www.sciencedirect.com/science/article/pii/S0031320318304370 中的图 1,我无需登录或其他任何方式即可获得全文,但如果有问题我可以也附上一张照片!)但是当我从最后的 Conv2D 层移动到第一个 fc_layer 时出现尺寸错误。
这是我的错误信息:
RuntimeError: size mismatch, m1: [4 x 1024], m2: [4 x 1024] at /pytorch/aten/src/THC/generic/THCTensorMathBlas.cu:283
原来如图,我的第一个线性层是:
nn.Linear(4*4*512, 1024)
但在发现大小不匹配后,我将其更改为:
nn.Linear(4,1024)
现在,我收到一条奇怪的错误消息,如上所述。
供参考(如果有帮助),这是我的代码:
import torch.nn as nn
import torch.utils.model_zoo as model_zoo
class convnet(nn.Module):
def __init__(self, num_classes=1000):
super(convnet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 64, kernel_size=3, stride=2, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.MaxPool2d(kernel_size=1),
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(128, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2),# stride=2),
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2), #stride=2),
nn.Conv2d(256, 512, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, padding=1),
nn.ReLU(inplace=True), #nn.Dropout(p=0.5)
)
self.classifier = nn.Sequential(
nn.Linear(4, 1024),
nn.Dropout(p=0.5),
nn.ReLU(inplace=True),
#nn.Dropout(p=0.5),
nn.Linear(1024, 1024),
nn.ReLU(inplace=True),
nn.Linear(1024, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x,1)
x = self.classifier(x)
return x
我怀疑这是填充和步幅的问题。
谢谢!
错误来自矩阵乘法,其中 m1
应该是 m x n 矩阵,m2
应该是 n x p 矩阵,结果将是 m x p 矩阵。在您的情况下,它是 4 x 1024 和 4 x 1024,但这在 1024 != 4
.
之后不起作用
这意味着您对第一个线性层的输入大小为 [4, 1024](4 是批量大小),因此第一个线性层的输入特征应该是1024.
self.classifier = nn.Sequential(
nn.Linear(1024, 1024),
nn.Dropout(p=0.5),
nn.ReLU(inplace=True),
#nn.Dropout(p=0.5),
nn.Linear(1024, 1024),
nn.ReLU(inplace=True),
nn.Linear(1024, num_classes),
)
如果您不确定您的输入有多少特征,您可以在层之前打印出它的大小:
x = self.features(x)
x = torch.flatten(x,1)
print(x.size()) # => torch.Size([4, 1024])
x = self.classifier(x)
我正在尝试使用全卷积网络实现模式识别模型(https://www.sciencedirect.com/science/article/pii/S0031320318304370 中的图 1,我无需登录或其他任何方式即可获得全文,但如果有问题我可以也附上一张照片!)但是当我从最后的 Conv2D 层移动到第一个 fc_layer 时出现尺寸错误。
这是我的错误信息:
RuntimeError: size mismatch, m1: [4 x 1024], m2: [4 x 1024] at /pytorch/aten/src/THC/generic/THCTensorMathBlas.cu:283
原来如图,我的第一个线性层是:
nn.Linear(4*4*512, 1024)
但在发现大小不匹配后,我将其更改为:
nn.Linear(4,1024)
现在,我收到一条奇怪的错误消息,如上所述。
供参考(如果有帮助),这是我的代码:
import torch.nn as nn
import torch.utils.model_zoo as model_zoo
class convnet(nn.Module):
def __init__(self, num_classes=1000):
super(convnet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 64, kernel_size=3, stride=2, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, padding=1),
nn.MaxPool2d(kernel_size=1),
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(128, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2),# stride=2),
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2), #stride=2),
nn.Conv2d(256, 512, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, padding=1),
nn.ReLU(inplace=True), #nn.Dropout(p=0.5)
)
self.classifier = nn.Sequential(
nn.Linear(4, 1024),
nn.Dropout(p=0.5),
nn.ReLU(inplace=True),
#nn.Dropout(p=0.5),
nn.Linear(1024, 1024),
nn.ReLU(inplace=True),
nn.Linear(1024, num_classes),
)
def forward(self, x):
x = self.features(x)
x = torch.flatten(x,1)
x = self.classifier(x)
return x
我怀疑这是填充和步幅的问题。 谢谢!
错误来自矩阵乘法,其中 m1
应该是 m x n 矩阵,m2
应该是 n x p 矩阵,结果将是 m x p 矩阵。在您的情况下,它是 4 x 1024 和 4 x 1024,但这在 1024 != 4
.
这意味着您对第一个线性层的输入大小为 [4, 1024](4 是批量大小),因此第一个线性层的输入特征应该是1024.
self.classifier = nn.Sequential(
nn.Linear(1024, 1024),
nn.Dropout(p=0.5),
nn.ReLU(inplace=True),
#nn.Dropout(p=0.5),
nn.Linear(1024, 1024),
nn.ReLU(inplace=True),
nn.Linear(1024, num_classes),
)
如果您不确定您的输入有多少特征,您可以在层之前打印出它的大小:
x = self.features(x)
x = torch.flatten(x,1)
print(x.size()) # => torch.Size([4, 1024])
x = self.classifier(x)