pytorch_5.6 AlexNet
深度卷积神经网络 AlexNet
- 网络层数 8层 5个卷积层 3个全连接层
C1 卷积层 (卷积 -> Relu -> 池化 )
-
卷积
- input 227x227x3 这里的输入应该是227x227
- kernel size 11x11x3
- 卷积核种类 96
- stride = 4
- feature map 54x54x96
- padding = 0
$\color{red}{【如何计算输出大小】}$
- wide = (227 + 2 * padding - kernel_size) / stride + 1 = 55
- height = (227 + 2 * padding - kernel_size) / stride + 1 = 55
-
Relu 将卷积层输出的FeatureMap输入到ReLU函数中
-
Pool
- pool size = 3x3
- stride = 2
- feature map 27x27x96
$\color{red}{【计算方式】}$ (55−3)/2+1=27
C2 卷积层 (卷积 -> Relu -> 池化 )
-
卷积
- input 27x27x48 x 2 2是代表两组
- kernel size 5x5x48
- 卷积核种类 128
- stride = 1
- feature map 27x27x128 x 2
- padding = 2
$\color{red}{【如何计算输出大小】}$
- wide = height = (27+2∗2−5)/1+1=27
-
Relu 将卷积层输出的FeatureMap输入到ReLU函数中
-
Pool
- pool size = 3x3
- stride = 2
- feature map 13x13x256
$\color{red}{【计算方式】}$ (27−3)/2+1=13
C3 卷积层 (卷积 -> Relu)
-
卷积
- input 13x13x256
- kernel size 3x3x256
- 卷积核种类 384
- stride = 1
- feature map 13x13x384
- padding = 1
-
Relu 将卷积层输出的FeatureMap输入到ReLU函数中
C4 卷积层 (卷积 -> Relu)
-
卷积
- input 13x13x384
- kernel size 3x3x384
- 卷积核种类 384
- stride = 1
- feature map 13x13x384
- padding = 1
-
Relu 将卷积层输出的FeatureMap输入到ReLU函数中
C5 卷积层 (卷积 -> Relu -> 池化)
-
卷积
- input 13x13x384
- kernel size 3x3x256
- 卷积核种类 256
- stride = 1
- feature map 13x13x256
- padding = 1
-
Relu 将卷积层输出的FeatureMap输入到ReLU函数中
-
Pool
- pool size = 3x3
- stride = 2
- feature map 6x6x256
FC6 全连接层 [(卷积)全连接 -->ReLU -->Dropout]
- 卷积->全连接
- input 6x6x256
- kernel 6x6x256
- 卷积核种类 4096
- stride = 1
- feature map 4096×1×1
- Relu 4096个神经元
- Dropout 抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元
FC7 全连接层 (全连接 -->ReLU -->Dropout)
- 全连接 input 4096 个向量
- Relu 4096个神经元
- Dropout 抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元
输出层
- 第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出1000个float型的值,这就是预测结果
AlexNet参数数量
卷积层的参数 = 卷积核的数量 * 卷积核 + 偏置
- C1: 96个11×11×3的卷积核,96×11×11×3+96=34848
- C2: 2组,每组128个5×5×48的卷积核,(128×5×5×48+128)×2=307456
- C3: 384个3×3×256的卷积核,3×3×256×384+384=885120
- C4: 2组,每组192个3×3×192的卷积核,(3×3×192×192+192)×2=663936
- C5: 2组,每组128个3×3×192的卷积核,(3×3×192×128+128)×2=442624
- FC6: 4096个6×6×256的卷积核,6×6×256×4096+4096=37752832
- FC7: 4096∗4096+4096=16781312
- output: 4096∗1000=4096000
利用pytorch 构建简单的AlexNet
import time
import torch
from torch import nn, optim
import torchvision
import pytorch_deep as pyd
device = torch.device('cuda' if torch.cuda.is_available() else'cpu')
class AlexNet(nn.Module):
def __init__(self):
super(AlexNet, self).__init__()
self.conv = nn.Sequential(
nn.Conv2d(1, 96, 11, 4), # in_channels, out_channels,kernel_size, stride, padding
nn.ReLU(),
nn.MaxPool2d(3, 2), # kernel_size, stride
# 减⼩卷积窗⼝,使⽤填充为2来使得输⼊与输出的⾼和宽⼀致,且增⼤输出通道数
nn.Conv2d(96, 256, 5, 1, 2),
nn.ReLU(),
nn.MaxPool2d(3, 2),
# 连续3个卷积层,且使⽤更⼩的卷积窗⼝。除了最后的卷积层外,进⼀步增⼤了输出通道数。
# 前两个卷积层后不使⽤池化层来减⼩输⼊的⾼和宽
nn.Conv2d(256, 384, 3, 1, 1),
nn.ReLU(),
nn.Conv2d(384, 384, 3, 1, 1),
nn.ReLU(),
nn.Conv2d(384, 256, 3, 1, 1),
nn.ReLU(),
nn.MaxPool2d(3, 2)
)
# 这⾥全连接层的输出个数⽐LeNet中的⼤数倍。使⽤丢弃层来缓解过拟合
self.fc = nn.Sequential(
nn.Linear(256*5*5, 4096),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(),
nn.Dropout(0.5),
# 输出层。由于这⾥使⽤Fashion-MNIST,所以⽤类别数为10,⽽⾮论⽂中的1000
nn.Linear(4096, 10),
)
def forward(self, img):
feature = self.conv(img)
output = self.fc(feature.view(img.shape[0], -1))
return output
net = AlexNet()
print(net)
AlexNet(
(conv): Sequential(
(0): Conv2d(1, 96, kernel_size=(11, 11), stride=(4, 4))
(1): ReLU()
(2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(3): Conv2d(96, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
(4): ReLU()
(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(6): Conv2d(256, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(7): ReLU()
(8): Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(9): ReLU()
(10): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(11): ReLU()
(12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(fc): Sequential(
(0): Linear(in_features=6400, out_features=4096, bias=True)
(1): ReLU()
(2): Dropout(p=0.5)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU()
(5): Dropout(p=0.5)
(6): Linear(in_features=4096, out_features=10, bias=True)
)
)
加载数据
def load_data_fashion_mnist(batch_size = 256,resize=None,num_workers = 0):
trans = []
if resize:
trans.append(torchvision.transforms.Resize(size=resize))
trans.append(torchvision.transforms.ToTensor())
transform = torchvision.transforms.Compose(trans)
mnist_train = torchvision.datasets.FashionMNIST(root='./MNIST', train=True, download=True,
transform=transform)
mnist_test = torchvision.datasets.FashionMNIST(root='./MNIST', train=False, download=True,
transform=transform)
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)
test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)
return train_iter,test_iter
batch_size = 128
# 如出现“out of memory”的报错信息,可减⼩batch_size或resize
train_iter, test_iter = load_data_fashion_mnist(batch_size,resize=224)
训练模型
lr, num_epochs = 0.001, 5
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
pyd.train_ch5(net, train_iter, test_iter, batch_size, optimizer,device, num_epochs)
training on cuda
epoch 1, loss 0.6022, train acc 0.773, test acc 0.858,time 60.7 sec
epoch 2, loss 0.1640, train acc 0.879, test acc 0.888,time 63.6 sec
epoch 3, loss 0.0958, train acc 0.893, test acc 0.895,time 63.5 sec
epoch 4, loss 0.0645, train acc 0.904, test acc 0.904,time 63.5 sec
epoch 5, loss 0.0470, train acc 0.912, test acc 0.906,time 63.9 sec
AlexNet 学习完毕
- 网络搭建
- 训练和测试
分类:
Pytorch
posted on 2020-07-17 15:44 wangxiaobei2019 阅读(199) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界