http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf
Tensorflow中的padding操作和Pytorch中的padding操作:
参考博文:
https://blog.csdn.net/qq_37541097/article/details/114303828
参考博文:
https://www.cnblogs.com/hejunlin1992/p/12978988.html
因为AlexNet是放在两块GPU上进行训练的,所以你看到的上图是分为上下两部分,并且上部分和下部分是一样的,所以上部分看到的是不完整的。
但是下面我在讲解这个卷积过程的时候也只讨论在一块GPU上的卷积过程(包括图解)。
首先需要输入的图像大小为:227x227x3的彩色图像:(图解上面有问题)
filter:11x11x48,stride=4,padding=0
output_size=(input_size+2xpadding-kernel_size)/stride+1=(227+2x0-11)/4+1=55
输出:55x55x48
参数量:(11x11x3+1)x48x2=34944
计算量:34944x55x55=105705600
激活函数:ReLU.
池化:使用3x3,stride=2的池化单元进行最大池化操作(步长小于池化单元大小,采用重叠池化):
output_size=(input_size+2xpadding-pool_size)/stride+1=(55+2x0-3)/2+1=27.每一组的输出为27x27x48.
filter:5x5x128,stride=1,padding=2
output_size=(input_size+2xpadding-kernel_size)/stride+1=(27+2x2-5)/1+1=27
输出:27x27x128
参数量:(5x5x48+1)x128x2=307456
计算量:307456x27x27=224135424
激活函数:ReLU.
池化:使用3x3,stride=2的池化单元进行最大池化操作(步长小于池化单元大小,采用重叠池化):
output_size=(input_size+2xpadding-pool_size)/stride+1=(27+2x0-3)/2+1=13.每一组的输出为13x13x128.
filter:13x13x192,stride=1,padding=1
output_size=(input_size+2xpadding-kernel_size)/stride+1=(13+2x2-5)/1+1=13
输出:13x13x192
参数量:(3x3x256+1)x192x2=885120
计算量:885120x13x13=149585280
激活函数:ReLU.
filter:13x13x192,stride=1,padding=1
output_size=(input_size+2xpadding-kernel_size)/stride+1=(13+2x2-5)/1+1=13
输出:13x13x192
参数量:(3x3x192+1)x192x2=663936
计算量:663936x13x13=112205184
激活函数:ReLU.
filter:13x13x128,stride=1,padding=1
output_size=(input_size+2xpadding-kernel_size)/stride+1=(13+2x2-5)/1+1=13
输出:13x13x128
参数量:(3x3x192+1)x128x2=442624
计算量:442624x13x13=74803456
激活函数:ReLU.
池化:使用3x3,stride=2的池化单元进行最大池化操作(步长小于池化单元大小,采用重叠池化):
output_size=(input_size+2xpadding-pool_size)/stride+1=(13+2x0-3)/2+1=6.每一组的输出为6x6x128.
全连接:输入为6×6×256;
filter: 1x1x2048;
对6×6×256进行卷积,由于卷积核尺寸与输入的尺寸完全相同,即卷积核中的每个系数只与输入尺寸的一个像素值相乘一一对应,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(6+2*0-6)/1+1=1,得到输出是1x1x2048,即有2048个神经元。
激活函数:ReLU。
Dropout:随机的断开全连接层某些神经元的连接,通过不激活某些神经元的方式防止过拟合。4096个神经元也被均分到两块GPU上进行运算。
参数量:(6x6x256+1)x4096=37752832
计算量: 37752832
全连接:输入为2048;即有2048个神经元。
激活函数:ReLU。
Dropout:随机的断开全连接层某些神经元的连接,通过不激活某些神经元的方式防止过拟合。4096个神经元也被均分到两块GPU上进行运算。
参数量:(4096+1)x4096=16781312
计算量: 16781312
全连接:输入为4096个神经元,输出是1000个神经元。这1000个神经元即对应1000个检测类别。
Softmax:这1000个神经元的运算结果通过Softmax函数中,输出1000个类别对应的预测概率值。
参数量: 1000x4096=4096000
计算量:4096000
所有层总的参数量:
34944 + 307456 + 885120 + 663936 + 442624 + 37752832 + 16781312 + 4096000 = 60964224
import os
import torch
from torchvision import models
from torchsummary import summary
model_AlexNet=torch.nn.Sequential(
torch.nn.Conv2d(in_channels=3,out_channels=48,kernel_size=(11,11),stride=(4,4),padding=0),
torch.nn.ReLU(inplace=True),
torch.nn.BatchNorm2d(num_features=48),
torch.nn.MaxPool2d(kernel_size=(3,3),stride=(2,2)),
torch.nn.Conv2d(in_channels=48,out_channels=128,kernel_size=(5,5),stride=(1,1),padding=2),
torch.nn.ReLU(inplace=True),
torch.nn.BatchNorm2d(num_features=128),
torch.nn.MaxPool2d(kernel_size=(3,3),stride=(2,2)),
torch.nn.Conv2d(in_channels=128,out_channels=192,kernel_size=(3,3),stride=(1,1),padding=1),
torch.nn.ReLU(inplace=True),
torch.nn.BatchNorm2d(num_features=192),
torch.nn.Conv2d(in_channels=192,out_channels=192,kernel_size=(3,3),stride=(1,1),padding=1),
torch.nn.ReLU(inplace=True),
torch.nn.BatchNorm2d(num_features=192),
torch.nn.Conv2d(in_channels=192,out_channels=128,kernel_size=(3,3),stride=(1,1),padding=1),
torch.nn.ReLU(inplace=True),
torch.nn.BatchNorm2d(num_features=128),
torch.nn.MaxPool2d(kernel_size=(3,3),stride=(2,2)),
torch.nn.ReLU(inplace=True),
torch.nn.Dropout(0.5),
torch.nn.Flatten(),
torch.nn.Linear(in_features=128*6*6,out_features=2048),
torch.nn.ReLU(inplace=True),
torch.nn.Dropout(0.5),
torch.nn.Linear(in_features=2048,out_features=1000),
torch.nn.Softmax()
)
model=summary(model_AlexNet,(3,227,227))