博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用pytorch搭建AlexNet
阅读量:2117 次
发布时间:2019-04-29

本文共 5804 字,大约阅读时间需要 19 分钟。

深度学习

基础知识和各种网络结构实战 ...

使用pytorch搭建AlexNet

前言

使用pytorch搭建AlexNet

一、介绍

在这之前我们应当阅读一下这篇论文,了解一下AlexNet得框架结构。

我们可以指导它是由卷积5层+全连接3层组成的

二、框架搭载

2.1 导入库

import torchimport torch.nn as nnfrom torchsummary import summary

torchsummary 用来打印显示网络结构和参数

2.2 AlexNet类

前5层是卷积层,后三层是全连接层

已知:输入图像均为2242243
网络结构为8层,卷积5层+全连接3层
第1层:卷积层 卷积核为11113 步长为4 2块GPU共96个卷积核 激活函数为:ReLu 池化层为:MaxPooling
第2层:卷积层 输入为262696 激活函数为:ReLu 池化层为:MaxPooling
第3层:卷积层 激活函数为:ReLu 无池化
第4层:卷积层 激活函数为:ReLu 无池化
第5层:卷积层 激活函数为:ReLu 池化层为:MaxPooling
第6层:全连接层 输入4096
第7层:全连接层 输入4096
第8层:全连接层 输出为1000

class AlexNet(nn.Module):    def __init__(self,nums_classify):        super(AlexNet,self).__init__()        self.nums=nums_classify#分类数        #5层卷积层        self.conv=nn.Sequential(            #第一层:输入:224*224*3  输出:54*54*96            nn.Conv2d(in_channels=3,out_channels=96,kernel_size=11,stride=4,padding=0),            nn.ReLU(),            nn.MaxPool2d(kernel_size=3,stride=2),#最大池化  输入:54*54*96 输出:26*26*96            #第二层:输入26*26*96            nn.Conv2d(in_channels=96,out_channels=256,kernel_size=5,stride=1,padding=2),            nn.ReLU(),            nn.MaxPool2d(kernel_size=3,stride=2),#最大池化   输入:26*26*256  输出:12*12*256            #第三层:            nn.Conv2d(in_channels=256,out_channels=384,kernel_size=3,stride=1,padding=1),            #第四层:            nn.Conv2d(in_channels=384,out_channels=256,kernel_size=3,stride=1,padding=1),            nn.ReLU(),            #第五层:            nn.Conv2d(in_channels=256,out_channels=256,kernel_size=3,stride=1,padding=1),            nn.ReLU(),            # 池化层  输入:12*12*256    输出:5*5*256            nn.MaxPool2d(kernel_size=3, stride=2)        )        #定义池化层,规定输出size        self.avg_pool=nn.AdaptiveAvgPool2d((5,5))        #3层全连接层        self.fc=nn.Sequential(            #第6层:            #输入:5*5*256 -> 4096            nn.Linear(in_features=5 * 5 * 256, out_features=4096),            nn.ReLU(),            nn.Dropout(),            #第7层            nn.Linear(in_features=4096, out_features=4096),            nn.ReLU(),            nn.Dropout(),            #第8层 output            nn.Linear(in_features=4096, out_features=1000)        )    def forward(self, x):        x = self.conv(x)        x = self.avg_pool(x)        x = x.view(x.size(0), -1)        print(x.size())        x = self.fc(x)        return x
super(Net, self).__init__()

意思是首先找到Net的父类(比如是类NNet),然后把类Net的对象self转换为类NNet的对象,然后“被转换”的类NNet对象调用自己的init函数

三、测试数据

x = torch.rand((2, 3, 227, 227))alex = AlexNet(1000)print(alex)out = alex(x)print(out)device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')alex = alex.to(device)# 打印网络模型数据流程及参数信息summary(alex, (3, 227, 227))
得到:AlexNet(  (conv): Sequential(    (0): Conv2d(3, 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): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    (8): ReLU()    (9): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    (10): ReLU()    (11): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)  )  (avg_pool): AdaptiveAvgPool2d(output_size=(5, 5))  (fc): Sequential(    (0): Linear(in_features=6400, out_features=4096, bias=True)    (1): ReLU()    (2): Dropout(p=0.5, inplace=False)    (3): Linear(in_features=4096, out_features=4096, bias=True)    (4): ReLU()    (5): Dropout(p=0.5, inplace=False)    (6): Linear(in_features=4096, out_features=1000, bias=True)  ))torch.Size([2, 6400])tensor([[ 0.0230, -0.0033, -0.0077,  ..., -0.0096,  0.0007,  0.0089],        [ 0.0146,  0.0039, -0.0071,  ..., -0.0053,  0.0025,  0.0020]],       grad_fn=
)torch.Size([2, 6400])---------------------------------------------------------------- Layer (type) Output Shape Param #================================================================ Conv2d-1 [-1, 96, 55, 55] 34,944 ReLU-2 [-1, 96, 55, 55] 0 MaxPool2d-3 [-1, 96, 27, 27] 0 Conv2d-4 [-1, 256, 27, 27] 614,656 ReLU-5 [-1, 256, 27, 27] 0 MaxPool2d-6 [-1, 256, 13, 13] 0 Conv2d-7 [-1, 384, 13, 13] 885,120 Conv2d-8 [-1, 256, 13, 13] 884,992 ReLU-9 [-1, 256, 13, 13] 0 Conv2d-10 [-1, 256, 13, 13] 590,080 ReLU-11 [-1, 256, 13, 13] 0 MaxPool2d-12 [-1, 256, 6, 6] 0AdaptiveAvgPool2d-13 [-1, 256, 5, 5] 0 Linear-14 [-1, 4096] 26,218,496 ReLU-15 [-1, 4096] 0 Dropout-16 [-1, 4096] 0 Linear-17 [-1, 4096] 16,781,312 ReLU-18 [-1, 4096] 0 Dropout-19 [-1, 4096] 0 Linear-20 [-1, 1000] 4,097,000================================================================Total params: 50,106,600Trainable params: 50,106,600Non-trainable params: 0----------------------------------------------------------------Input size (MB): 0.59Forward/backward pass size (MB): 10.27Params size (MB): 191.14Estimated Total Size (MB): 202.00----------------------------------------------------------------

框架先打好,下一步我将完整复现AlexNet

总结

期待大家和我交流,留言或者私信,一起学习,一起进步!

转载地址:http://kplef.baihongyu.com/

你可能感兴趣的文章
云原生 第十一章 应用健康
查看>>
Leetcode C++ 《第202场周赛》
查看>>
云原生 第十二章 可观测性:监控与日志
查看>>
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>