目录
一.卷积神经网络
1.卷积
2.Down sample、Up sample
3.Relu
4.Batch-Norm
二.经典卷积神经网络
ResNet原理
ResNet实现
全连接层参数量非常大,提出局部相关性,权值共享的思想。
卷积操作的实现,最左边为一张图片的RGB,input x有b张图片,3个RGB通道,图片大小28*28;每一个卷积核[3,3,3],第一个3代表与输入RGB相同,后面是卷积核大小;一共有16个卷积核;即16个偏置;根据如图卷积运算,out为b个图片,每个图片16个卷积结果,大小为28*28。
nn.Conv2d
layer=nn.Conv2d(1,3,kernel_size=3,stride=1,padding=0)
x=torch.rand(1,1,28,28)
out=layer(x)
maxpooling,降维
layer=nn.MaxPool2d(2,stride=2)#第一个参数为窗的大小
卷积神经网络一个unit:Conv2d->Batch-Norm->Pool->Relu,后面三个顺序取决于用户。
特征缩放,更利于数据搜索最优解。把数据按通道缩放到N~(0,1)
advantages
x.shape
out:torch.Size([1,16,7,7])
layer=nn.BatchNorm2d(16)
1*1卷积核,保证图片大小不变的同时,利于卷积核降维。减少通道数、降低计算量[16,256,28,28]->[16,32,1,1]----[16,32,28,28]
加入短路层,最少不会比短路层之前层数的网络结构差。
class ResBlk(nn.Module):
def __init__(self,ch_in,ch_out):
self.conv1 = nn.Conv2d(ch_in,ch_out,kernel_size=3,stride=1,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)
self.extra = nn.Sequential()
#如果输入输出channel不一致
if ch_out != ch_in:
self.extra = nn.Sequential(
nn.Conv2d(ch_in,ch_out,kernel_size=1,stride=1),
nn.BatchNorm2d(ch_out)
)
def forward(self,x):
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out = self.extra(x) + out
return out