实验步骤
搭建resnet18网络
数据集加载
模型训练和改进
分析评估
Kaggle提交
网络构建
实验初期拟采用torchvision中实现的resnet18作为网络结构,为了方便修改网络结构,于是重新实现了resnet18网络
resnet18由一个7x7的降采样卷积,一个max pooling层,8个basicblock,一个全局池化层,最后接一个全连接层组成,如下图


tensorboard网络结构可视化,左图为torchvision中的resnet实现,右图为自定义实现
代码如下
定义残差块
class IdentityBlock(nn.Module):def __init__(self, in_channels, out_channels, down_sampling=False):super().__init__()self.down_sampling = down_samplingself.in_channels = in_channelsself.out_channels = out_channelsself.conv1 = nn.Sequential(OrderedDict([('conv1', nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=3,stride=(1 if in_channels == out_channels else 2), padding=1,bias=False)),('bn1', nn.BatchNorm2d(out_channels)),('relu1', nn.ReLU())]))self.shortcut = nn.Sequential(OrderedDict([('conv',nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=2, bias=False)),('bn', nn.BatchNorm2d(out_channels))])) if in_channels != out_channels else nn.Sequential()self.conv2 = nn.Sequential(OrderedDict([('conv2', nn.Conv2d(in_channels=out_channels, out_channels=out_channels, kernel_size=3, stride=1, padding=1,bias=False)),('bn2', nn.BatchNorm2d(out_channels))]))self.relu2 = nn.ReLU()def forward(self, x):fx = self.conv1(x)fx = self.conv2(fx)x = self.shortcut(x)hx = fx + xhx = self.relu2(hx)return hx
定义模型网络
class Resnet18(nn.Module):def __init__(self, num_classes):super(Resnet18, self).__init__()self.conv1 = nn.Sequential(OrderedDict([('conv', nn.Conv2d(in_channels=3, out_channels=64, kernel_size=7, stride=2, padding=3, bias=False)),('bn', nn.BatchNorm2d(64)),('relu', nn.ReLU()),]))self.max_pool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)self.layer1 = self.make_layer(64
















