Pytorch实现GoogLeNet的方法

GoogLeNet也叫InceptionNet,在2014年被提出,如今已到V4版本。GoogleNet比VGGNet具有更深的网络结构,一共有22层,但是参数比AlexNet要少12倍,但是计算量是AlexNet的4倍,原因就是它采用很有效的Inception模块,并且没有全连接层。

最重要的创新点就在于使用inception模块,通过使用不同维度的卷积提取不同尺度的特征图。左图是最初的Inception模块,右图是使用的1×1得卷积对左图的改进,降低了输入的特征图维度,同时降低了网络的参数量和计算复杂度,称为inception V1。

GoogleNet在架构设计上为保持低层为传统卷积方式不变,只在较高的层开始用Inception模块。

inception V2中将5x5的卷积改为2个3x3的卷积,扩大了感受野,原来是5x5,现在是6x6。Pytorch实现GoogLeNet(inception V2):

'''GoogLeNet with PyTorch.'''
import torch
import torch.nn as nn
import torch.nn.functional as F

# 编写卷积+bn+relu模块
class BasicConv2d(nn.Module):
  def __init__(self, in_channels, out_channals, **kwargs):
    super(BasicConv2d, self).__init__()
    self.conv = nn.Conv2d(in_channels, out_channals, **kwargs)
    self.bn = nn.BatchNorm2d(out_channals)

  def forward(self, x):
    x = self.conv(x)
    x = self.bn(x)
    return F.relu(x)

# 编写Inception模块
class Inception(nn.Module):
  def __init__(self, in_planes,
         n1x1, n3x3red, n3x3, n5x5red, n5x5, pool_planes):
    super(Inception, self).__init__()
    # 1x1 conv branch
    self.b1 = BasicConv2d(in_planes, n1x1, kernel_size=1)

    # 1x1 conv -> 3x3 conv branch
    self.b2_1x1_a = BasicConv2d(in_planes, n3x3red,
                  kernel_size=1)
    self.b2_3x3_b = BasicConv2d(n3x3red, n3x3,
                  kernel_size=3, padding=1)

    # 1x1 conv -> 3x3 conv -> 3x3 conv branch
    self.b3_1x1_a = BasicConv2d(in_planes, n5x5red,
                  kernel_size=1)
    self.b3_3x3_b = BasicConv2d(n5x5red, n5x5,
                  kernel_size=3, padding=1)
    self.b3_3x3_c = BasicConv2d(n5x5, n5x5,
                  kernel_size=3, padding=1)

    # 3x3 pool -> 1x1 conv branch
    self.b4_pool = nn.MaxPool2d(3, stride=1, padding=1)
    self.b4_1x1 = BasicConv2d(in_planes, pool_planes,
                 kernel_size=1)

  def forward(self, x):
    y1 = self.b1(x)
    y2 = self.b2_3x3_b(self.b2_1x1_a(x))
    y3 = self.b3_3x3_c(self.b3_3x3_b(self.b3_1x1_a(x)))
    y4 = self.b4_1x1(self.b4_pool(x))
    # y的维度为[batch_size, out_channels, C_out,L_out]
    # 合并不同卷积下的特征图
    return torch.cat([y1, y2, y3, y4], 1)

class GoogLeNet(nn.Module):
  def __init__(self):
    super(GoogLeNet, self).__init__()
    self.pre_layers = BasicConv2d(3, 192,
                   kernel_size=3, padding=1)

    self.a3 = Inception(192, 64, 96, 128, 16, 32, 32)
    self.b3 = Inception(256, 128, 128, 192, 32, 96, 64)

    self.maxpool = nn.MaxPool2d(3, stride=2, padding=1)

    self.a4 = Inception(480, 192, 96, 208, 16, 48, 64)
    self.b4 = Inception(512, 160, 112, 224, 24, 64, 64)
    self.c4 = Inception(512, 128, 128, 256, 24, 64, 64)
    self.d4 = Inception(512, 112, 144, 288, 32, 64, 64)
    self.e4 = Inception(528, 256, 160, 320, 32, 128, 128)

    self.a5 = Inception(832, 256, 160, 320, 32, 128, 128)
    self.b5 = Inception(832, 384, 192, 384, 48, 128, 128)

    self.avgpool = nn.AvgPool2d(8, stride=1)
    self.linear = nn.Linear(1024, 10)

  def forward(self, x):
    out = self.pre_layers(x)
    out = self.a3(out)
    out = self.b3(out)
    out = self.maxpool(out)
    out = self.a4(out)
    out = self.b4(out)
    out = self.c4(out)
    out = self.d4(out)
    out = self.e4(out)
    out = self.maxpool(out)
    out = self.a5(out)
    out = self.b5(out)
    out = self.avgpool(out)
    out = out.view(out.size(0), -1)
    out = self.linear(out)
    return out

def test():
  net = GoogLeNet()
  x = torch.randn(1,3,32,32)
  y = net(x)
  print(y.size())

test()

以上这篇Pytorch实现GoogLeNet的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • PyTorch上搭建简单神经网络实现回归和分类的示例

    本文介绍了PyTorch上搭建简单神经网络实现回归和分类的示例,分享给大家,具体如下: 一.PyTorch入门 1. 安装方法 登录PyTorch官网,http://pytorch.org,可以看到以下界面: 按上图的选项选择后即可得到Linux下conda指令: conda install pytorch torchvision -c soumith 目前PyTorch仅支持MacOS和Linux,暂不支持Windows.安装 PyTorch 会安装两个模块,一个是torch,一个 torch

  • Pytorch实现GoogLeNet的方法

    GoogLeNet也叫InceptionNet,在2014年被提出,如今已到V4版本.GoogleNet比VGGNet具有更深的网络结构,一共有22层,但是参数比AlexNet要少12倍,但是计算量是AlexNet的4倍,原因就是它采用很有效的Inception模块,并且没有全连接层. 最重要的创新点就在于使用inception模块,通过使用不同维度的卷积提取不同尺度的特征图.左图是最初的Inception模块,右图是使用的1×1得卷积对左图的改进,降低了输入的特征图维度,同时降低了网络的参数量

  • pytorch 数据集图片显示方法

    图片显示 pytorch 载入的数据集是元组tuple 形式,里面包括了数据及标签(train_data,label),其中的train_data数据可以转换为torch.Tensor形式,方便后面计算使用. 同样给一些刚入门的同学在使用载入的数据显示图片的时候带来一些难以理解的地方,这里主要是将Tensor与numpy转换的过程,理解了这些就可以就行转换了 CIAFA10数据集 首先载入数据集,这里做了一些数据处理,包括图片尺寸.数据归一化等 import torch from torch.a

  • 在Pytorch中计算卷积方法的区别详解(conv2d的区别)

    在二维矩阵间的运算: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True) 对由多个特征平面组成的输入信号进行2D的卷积操作.详解 torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

  • 彻底解决pip下载pytorch慢的问题方法

    前言   在使用pip install下载package的时候,换成国内的镜像源可解决速度慢的问题,但pytorch还是很慢,这几天尝试了一种新方法,可以彻底解决这个问题.先附上国内的一些镜像源吧: https://pypi.douban.com/simple/ # 使用豆瓣源 http://mirrors.aliyun.com/pypi/simple/ # 阿里云 https://pypi.mirrors.ustc.edu.cn/simple/ # 中国科技大学 http://pypi.dou

  • PyTorch两种安装方法

    本文安装的是pytorch1.4版本(cpu版本) 首先需要安装Anaconda 是否需要安装基于cuda的PyTorch版本呢? 对于普通笔记本来说即使有显卡性能也不高,跑不动层数较深的深度学习网络,所以就不用装cuda啦.实际应用时深度学习肯定离不开基于高性能GPU的cuda,作为一般的笔记本,基本都跑不动数据量较大的模型,所以安装CPU版的PyTorch即可.以后如果继续进行深度学习的研究或开发,都会基于高性能服务器,此时安装PyTorch版本肯定是选择有cuda的版本了. 然后进入PyT

  • Anaconda安装pytorch和paddle的方法步骤

    目录 NVIDIA驱动安装与更新 Anaconda 的安装 Pytorch环境安装 NVIDIA驱动安装与更新 首先查看电脑的显卡版本,步骤为:此电脑右击–>管理–>设备管理器–>显示适配器.就可以看到电脑显卡的版本了. 得知以上的信息以后我们就可以对应我们的显卡去英伟达官网上去找相对应的显卡驱动更新或者下载了. 显卡驱动的下载地址.显卡驱动 安装好了显卡驱动以后.我们按下win+R组合键,打开cmd命令窗口.输入如下的命令. nvidia-smi 得到如下图的信息图,可以看到驱动的版本

  • 教你用PyTorch部署模型的方法

    目录 导读 使用Docker安装 Handlers 导出你的模型 用模型进行服务 总结 导读 演示了使用PyTorch最近发布的新工具torchserve来进行PyTorch模型的部署. 最近,PyTorch推出了名为torchserve.的新生产框架来为模型提供服务.我们看一下今天的roadmap: 1.使用Docker安装 2.导出模型 3.定义handler 4.保存模型 为了展示torchserve,我们将提供一个经过全面训练的ResNet34进行图像分类的服务. 使用Docker安装

  • pytorch绘制曲线的方法

    本文实例为大家分享了pytorch绘制曲线的具体代码,供大家参考,具体内容如下 import torch import torch.nn.functional as F from torch.autograd import Variable import matplotlib.pyplot as plt # fake data x = torch.linspace(-5, 5, 200) # x data (tensor), shape=(100, 1) x = Variable(x) #创建

  • Pytorch实现张量的创建与使用方法

    目录 张量的创建及其基本类型 1.张量(Tensor)函数创建方法 2.张量的类型 3.张量类型的转化 张量的维度及形变 1.创建高维张量 2.张量的形变 2.1 flatten拉平: 将任意维度张量转化为一维张量 2.2 reshape方法: 任意变形 特殊张量的创建方法 1.特殊取值的张量的创建方法 2.创建指定形状的数组 张量和其他类型的转化方法 张量的深拷贝 张量的创建及其基本类型 1.张量(Tensor)函数创建方法 张量最基本的创建方法和Numpy中创建Array的格式一样,都是创建

  • 分享Pytorch获取中间层输出的3种方法

    目录 [1]方法一:获取nn.Sequential的中间层输出 [2]方法二:IntermediateLayerGetter [3]方法三:钩子 [1]方法一:获取nn.Sequential的中间层输出 import torch import torch.nn as nn model = nn.Sequential(             nn.Conv2d(3, 9, 1, 1, 0, bias=False),             nn.BatchNorm2d(9),          

随机推荐