问题描述
我从 (https://gist.github.com/johnolafenwa/96b3322aabb61d4d36fd870a77f02aa3) 获取的 NN 遇到了一些问题 首先,我在此处描述的输出大小和输入批量大小方面遇到了问题 (How do I modify this PyTorch convolutional neural network to accept a 64 x 64 image and properly output predictions?)
我认为现在输入的batch_size 与目标batch_size 匹配,但是出现了一个新问题,我不知道为什么会发生此错误。任何帮助都会有所帮助。
def get_dls(bs,size):
dblock = DataBlock(blocks=(ImageBlock,CategoryBlock),get_items=get_image_files,get_y=parent_label,splitter = GrandparentSplitter(train_name='train',valid_name='test'),item_tfms=Resize(460),batch_tfms=[*aug_transforms(size=size,min_scale=0.75,do_flip=False,mult=2,pad_mode='zeros'),normalize.from_stats(*own_stats)])
return dblock.DataLoaders(path,bs=bs)
dls = get_dls(32,64)
class Unit(nn.Module):
def __init__(self,in_channels,out_channels):
super(Unit,self).__init__()
self.conv = nn.Conv2d(in_channels=in_channels,kernel_size=3,out_channels=out_channels,stride=1,padding=1)
self.bn = nn.Batchnorm2d(num_features=out_channels)
self.relu = nn.ReLU()
def forward(self,input):
output = self.conv(input)
output = self.bn(output)
output = self.relu(output)
return output
class SimpleNet(nn.Module):
def __init__(self,num_classes=7):
super(SimpleNet,self).__init__()
#Create 14 layers of the unit with max pooling in between
self.unit1 = Unit(in_channels=3,out_channels=32)
self.unit2 = Unit(in_channels=32,out_channels=32)
self.unit3 = Unit(in_channels=32,out_channels=32)
self.pool1 = nn.MaxPool2d(kernel_size=2)
self.unit4 = Unit(in_channels=32,out_channels=64)
self.unit5 = Unit(in_channels=64,out_channels=64)
self.unit6 = Unit(in_channels=64,out_channels=64)
self.unit7 = Unit(in_channels=64,out_channels=64)
self.pool2 = nn.MaxPool2d(kernel_size=2)
self.unit8 = Unit(in_channels=64,out_channels=128)
self.unit9 = Unit(in_channels=128,out_channels=128)
self.unit10 = Unit(in_channels=128,out_channels=128)
self.unit11 = Unit(in_channels=128,out_channels=128)
self.pool3 = nn.MaxPool2d(kernel_size=2)
self.unit12 = Unit(in_channels=128,out_channels=128)
self.unit13 = Unit(in_channels=128,out_channels=128)
self.unit14 = Unit(in_channels=128,out_channels=128)
self.avgpool = nn.AvgPool2d(kernel_size=4)
#Add all the units into the Sequential layer in exact order
self.net = nn.Sequential(self.unit1,self.unit2,self.unit3,self.pool1,self.unit4,self.unit5,self.unit6,self.unit7,self.pool2,self.unit8,self.unit9,self.unit10,self.unit11,self.pool3,self.unit12,self.unit13,self.unit14,self.avgpool)
self.fc = nn.Linear(in_features=128,out_features=num_classes)
def forward(self,input):
output = self.net(input)
print(output.shape)
output = output.view(-1,128*2*2)
print(output.shape)
#output = output.view(output.size(0),-1)
print(output.shape)
output = self.fc(output)
return output
model = SimpleNet(num_classes=7)
learn = Learner(dls,model,loss_func=CrossEntropyLossFlat(),metrics=accuracy)
learn.fit_one_cycle(1,3e-3)
这是错误信息:
RuntimeError Traceback (most recent call last)
<ipython-input-50-db5d2a1287cb> in <module>()
----> 1 learn.fit_one_cycle(1,3e-3)
18 frames
/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in linear(input,weight,bias)
1688 if input.dim() == 2 and bias is not None:
1689 # fused op is marginally faster
-> 1690 ret = torch.addmm(bias,input,weight.t())
1691 else:
1692 output = input.matmul(weight.t())
RuntimeError: mat1 dim 1 must match mat2 dim 0
任何形式的帮助、提示或参考都会有所帮助。 提前致谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)