Pytorch CIFAR-10分类(AlexNet)

4.定义网络(AlexNet)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ggMczuOs-1587022068848)(attachment:image.png)]

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章