文章来源 | 恒源云社区
原文地址 | 数据集实战
原文作者 | Mathor
实不相瞒,小编我对平台社区内的大佬Mathor很崇拜!这不,今天又来给大家分享大佬论文笔记了,赶紧看看接下来的内容是否有你们需要的知识点吧!
##正文开始:
如果不了解ResNet的同学可以先看我的这篇博客ResNet论文阅读
首先实现一个Residual Block
import torch
from torch import nn
from torch.nn import functional as F
class ResBlk(nn.Module):
def __init__(self, ch_in, ch_out, stride=1):
super(ResBlk, self).__init__()
self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=stride, padding=1)
self.bn1 = nn.BatchNorm2d(ch_out)
self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)
self.bn2 = nn.BatchNorm2d(ch_out)
if ch_out == ch_in:
self.extra = nn.Sequential()
else:
self.extra = nn.Sequential(
# 1×1的卷积作用是修改输入x的channel
# [b, ch_in, h, w] => [b, ch_out, h, w]
nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=stride),
nn.BatchNorm2d(ch_out),
)
def forward(self, x):
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
# short cut
out = self.extra(x) + out
out = F.relu(out)
return out
Block中进行了正则化处理,以使train过程更快更稳定。同时要考虑,如果两元素的ch_in和ch_out不匹配,进行加法时会报错,因此需要判断一下,如果不想等,就用1×1的卷积调整一下
测试一下
blk = ResBlk(64, 128, stride=2)
tmp = torch.randn(2, 64, 32, 32)
out = blk(tmp)
print(out.shape)
输出的shape大小是torch.Size([2, 128, 16,