一、Lenet5
Lenet5由七层网络组成,三个卷积层和两个下采样层以及两个全连接层所组成,各个层的结构分别如下:
conv1:输入32x32大小的图片,六个5x5大小的卷积核,填充为0,步长为1,最后输出28*28*6大小的图片。
pool1:6个2x2大小的卷积核最后输出大小为14*14*6的图片。
conv2:16个5x5大小的卷积核,填充为0,步长为1,最后输出大小为10x10x16。
pool2:16个2x2大小的卷积核做最大池化,得到5x5x16的大小。
conv3:120个大小为5x5的卷积核,填充为0,步长为5,输出大小为120。
fc1:输入120,输出84。
fc2:输入84,输出10。
pytorch版本的网络具体实现如下:
class LeNet_5(nn.Module):
def __init__(self):
super(LeNet_5,self).__init__()
self.conv1 = nn.Conv2d(3,6,5)
self.pool1 = nn.MaxPool2d(2,2)
self.conv2 = nn.Conv2d(6,16,5)
self.pool2 = nn.MaxPool2d(2,2)
self.conv3 = nn.Conv2d(16,120,5)
self.fc1 = nn.Linear(120,84)
self.fc2 = nn.Linear(84,10)
def forward(self,x):
x = F.relu(self.conv1(x))
x = F.relu(self.pool1(x))
x = F.relu(self.conv2(x))
x = F.relu(self.pool2(x))
x = F.relu(self.conv3(x))
x = x.reshape([-1,120])
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
return x
二、AlexNet
AlexNet网络有八层组成,分别有5个卷积层和3个全连接层,网络结构如下:
conv1:由两个GPU分别进行,一共是96个大小为11x11大小的卷积核,填充为0,步长为4,使用3x3大小的池化窗口,步长为2,输出大小为27x27x96。
conv2:用256大小的卷积核,步长为1,分在两块GPU上进行训练,池化窗口为3x3,步长为2,输出大小为13x13x256。
conv3:这一层不加池化层,用384个3x3大小的卷积核,填充为0,步长为1,最后输出大小为13x13x384。
conv4:这一层也不加池化层,结构与conv3相同。
conv5:采用256个3x3大小的卷积核,填充为0,步长为1,池化窗口为3x3,步长为2,最后输出大小为6x6x256。
fc1:输入6x6x256,输出4096个神经元,并使用dropout。
fc2:与fc1结构相同。
fc3:使用softmax得到1000个类别数。
总的来说,第三、四个卷积层不使用池化,池化窗口都是3x3,步长都是2。只有第一层的卷积步长是4,其它都为1,而且都没有填充。除了最后一个全连接层使用softmax以外,其余层的**函数都使用relu,卷积核大小分别为11,5,3,3,5。
最后再附上一张各个层的祥图:
下面给出pytorch版本的代码:
class AlexNet(nn.Module):
def __init__(self, classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, classes),
)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), 256 * 6 * 6)
x = self.classifier(x)
return x
三、ZF-Net
ZF-Net在AlexNet的基础之上,将第一层的卷积核从11x11变成了7x7的大小,步长从4变成了2,将两块GPU变成了在一块GPU上训练。