4.定义网络(AlexNet)
AlexNet 结构:
输入层:图像大小为 227×227×3,其中 3 表示输入图像的 channel 数(R,G,B)为 3。
卷积层:filter 大小 11×11,filter 个数 96,卷积步长 s=4。(filter 大小只列出了宽和高,filter矩阵的 channel 数和输入图片的 channel 数一样,在这里没有列出)
池化层:max pooling,filter 大小 3×3,步长 s=2。
卷积层:filter 大小 5×5,filter 个数 256,步长 s=1,padding 使用 same convolution,即使得卷积层输出图像和输入图像在宽和高上保持不变。
池化层:max pooling,filter 大小 3×3,步长 s=2。
卷积层:filter 大小 3×3,filter 个数 384,步长 s=1,padding 使用 same convolution。
卷积层:filter 大小 3×3,filter 个数 384,步长 s=1,padding 使用 same convolution。
卷积层:filter 大小 3×3,filter 个数 256,步长 s=1,padding 使用 same convolution。
池化层:max pooling,filter 大小 3×3,步长 s=2;池化操作结束后,将大小为 6×6×256 的输出矩阵 flatten 成一个 9216 维的向量。
全连接层:neuron 数量为 4096。
全连接层:neuron 数量为 4096。
全连接层,输出层:softmax 激活函数,neuron 数量为 1000,代表 1000 个类别。
AlexNet 一些性质:
大约 60million 个参数;
使用 ReLU 作为激活函数。
import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.optim as optim
# 定义神经网络
class AlexNet(nn.Module): # 训练 ALexNet
'''
三层卷积,三层全连接 (应该是5层卷积,由于图片是 32 * 32,且为了效率,这里设成了 3 层)
'''
def __init__(self):
super(AlexNet, self).__init__()
# 五个卷积层 输入 32 * 32 * 3
self.conv1 = nn.Sequential(
nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=1), # (32-3+2)/1+1 = 32
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2, padding=0) # (32-2)/2+1 = 16
)
self.conv2 = nn.Sequential( # 输入 16 * 16 * 6
nn.Conv2d(in_channels=6, out_channels=16, kernel_size=3, stride=1, padding=1), # (16-3+2)/1+1 = 16
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2, padding=0) # (16-2)/2+1 = 8
)
self.conv3 = nn.Sequential( # 输入 8 * 8 * 16
nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1), # (8-3+2)/1+1 = 8
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2, padding=0) # (8-2)/2+1 = 4
)
self.conv4 = nn.Sequential( # 输入 4 * 4 * 64
nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1), # (4-3+2)/1+1 = 4
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2, padding=0) # (4-2)/2+1 = 2
)
self.conv5 = nn.Sequential( # 输入 2 * 2 * 128
nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),# (2-3+2)/1+1 = 2
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2, padding=0) # (2-2)/2+1 = 1
) # 最后一层卷积层,输出 1 * 1 * 128
# 全连接层
self.dense = nn.Sequential(
nn.Linear(128, 120),
nn.ReLU(),
nn.Linear(120, 84),
nn.ReLU(),
nn.Linear(84, 10)
)
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = self.conv3(x)
x = self.conv4(x)
x = self.conv5(x)
x = x.view(x.size()[0],-1)
x = self.dense(x)
return x
net = AlexNet().cuda()
print(net)