I had a couple problems with a NN I took from (https://gist.github.com/johnolafenwa/96b3322aabb61d4d36fd870a77f02aa3)
First I had a problem with output sizes and input batch sizes as described here (How do I modify this PyTorch convolutional neural network to accept a 64 x 64 image and properly output predictions?)
I think now the input batch_size matches the target batch_size, but a new problem accured and I do not have the answer to why this error occurs. Any help would be helpful.
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)
And this is the Error-Message:
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
Any kind of help, hint or reference would be helpful.
Thanks in advance.
question from:
https://stackoverflow.com/questions/65897753/pytorch-error-mat1-dim-1-must-match-mat2-dim-0-in-cnn