TypeError: avg_pool2d(): argument 'input' (position 1) must be Tensor, not MaxPool2d

-- coding: utf-8 --

‘’‘ResNet in PyTorch.
For Pre-activation ResNet, see ‘preact_resnet.py’.
Reference:
[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun
Deep Residual Learning for Image Recognition. arXiv:1512.03385
‘’’
import torch
import torch.nn as nn
import torch.nn.functional as F

class BasicBlock(nn.Module):
expansion = 1

def __init__(self, in_planes, planes, stride=1):
    super(BasicBlock, self).__init__()
    self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
    self.bn1 = nn.BatchNorm2d(planes)
    self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False)
    self.bn2 = nn.BatchNorm2d(planes)

    self.shortcut = nn.Sequential()
    if stride != 1 or in_planes != self.expansion*planes:
        self.shortcut = nn.Sequential(
            nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),
            nn.BatchNorm2d(self.expansion*planes)
        )

def forward(self, x):
    out = F.relu(self.bn1(self.conv1(x)))
    out = self.bn2(self.conv2(out))
    out += self.shortcut(x)
    out = F.relu(out)
    return out

class Bottleneck(nn.Module):
expansion = 4

def __init__(self, in_planes, planes, stride=1):
    super(Bottleneck, self).__init__()
    self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=1, bias=False)
    self.bn1 = nn.BatchNorm2d(planes)
    self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
    self.bn2 = nn.BatchNorm2d(planes)
    self.conv3 = nn.Conv2d(planes, self.expansion*planes, kernel_size=1, bias=False)
    self.bn3 = nn.BatchNorm2d(self.expansion*planes)

    self.shortcut = nn.Sequential()
    if stride != 1 or in_planes != self.expansion*planes:
        self.shortcut = nn.Sequential(
            nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),
            nn.BatchNorm2d(self.expansion*planes)
        )

def forward(self, x):
    out = F.relu(self.bn1(self.conv1(x)))
    out = F.relu(self.bn2(self.conv2(out)))
    out = self.bn3(self.conv3(out))
    out += self.shortcut(x)
    out = F.relu(out)
    return out

class ResNet(nn.Module):
def init(self, block, num_blocks, num_classes=15):
super(ResNet, self).init()
self.in_planes = 64

    self.conv1 = nn.Conv2d(3, 64, kernel_size=5, stride=2, padding=2, bias=False)
    self.bn1 = nn.BatchNorm2d(64)
    self.MaxPool2d = nn.MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=1)
    self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2)
    self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2)
    self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2)
    self.linear = nn.Linear(512*block.expansion, num_classes)

def _make_layer(self, block, planes, num_blocks, stride):
    strides = [stride] + [1]*(num_blocks-1)
    layers = []
    for stride in strides:
        layers.append(block(self.in_planes, planes, stride))
        self.in_planes = planes * block.expansion
    return nn.Sequential(*layers)

def forward(self, x):
    out = F.relu(self.bn1(self.conv1(x)))#32x32
    out = self.MaxPool2d(out)#16x16
    out = self.layer1(out)
    out = self.layer2(out)
    out = self.layer3(out)
    out = self.layer4(out)
    out = F.avg_pool2d(out, 8)
    out = self.linear(out)
    return out

in train_model(model, criterion, optimizer, optimizer_name, learning_rate, num_epochs)
33 with torch.set_grad_enabled(True):
34 # print(input1.dtype, input2.dtype)
—> 35 outputs = model(input1, input2)
36 # dummy_img = outputs
37 _, preds = torch.max(outputs, 1)

~/anaconda3/envs/pytorch1/lib/python3.6/site-packages/torch/nn/modules/module.py in call(self, *input, **kwargs)
475 result = self._slow_forward(*input, **kwargs)
476 else:
–> 477 result = self.forward(*input, **kwargs)
478 for hook in self._forward_hooks.values():
479 hook_result = hook(self, input, result)

in forward(self, x1, x2)
27 def forward(self,x1,x2):
28 print(x1.shape, x2.shape)
—> 29 feat1 = self.pretrain_place.forward(x1)
30 # print(‘feat1’, feat1.shape)
31 x2 = self.branch1(x2)

~/Research/128size_modelpy/ResNet64.py in forward(self, x)
95 out = self.layer4(out)
96 out = F.avg_pool2d(out, 8)
—> 97 out = self.linear(out)
98 return out
99

TypeError: avg_pool2d(): argument ‘input’ (position 1) must be Tensor, not MaxPool2d

Could you print out before passing it to the last linear layer?
It seems the max pooling layer was somehow assigned to it, but I can’t find it currently.