当前位置: 首页 > news >正文

leetcode/含并行连结的网络,GoogLeNet

Inception块

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l

# GoogLeNet的v1版本的inception块
class Inception(nn.Module):
    def __init__(self, in_channels, c1, c2, c3, c4, **kwargs):
        '''
        inception块层从左往右
        :param in_channels p1,p2,p3,p4的输入通道数
        '''
        super(Inception, self).__init__(**kwargs)
        # 第1个卷积层,1x1的卷积层
        self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)
        # 第2_1个卷积层,1x1卷积层
        # 放到3x3卷积层之前的目的是3x3卷积计算慢,减少输出通道
        self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)
        # 第2_2个卷积层,3x3卷积层
        self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)
        # 第3_1个卷积层,1x1卷积层
        self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)
        # 第3_2个卷积层,5x5卷积层
        self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_size=5, padding=2)
        # 第4_1个卷积层,3x3最大池化层
        self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
        # 第4_2个卷积层,1x1卷积层
        self.p4_2 = nn.Conv2d(in_channels, c4, kernel_size=1)

    def forward(self, x):
        '''
        前向传播组合成inception块
        '''
        p1 = F.relu(self.p1_1(x))
        p2 = F.relu(self.p2_2(F.relu(self.p2_1(x))))
        p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))
        p4 = F.relu(self.p4_2(self.p4_1(x)))
        # cat增加第1维度,增加了通道维
        # stack不会增加维度
        return torch.cat((p1, p2, p3, p4), dim=1)

GoogLeNet模型

# GoogLeNet模型共有5个阶段
# stage1
b1 = nn.Sequential(
    # 1个输入通道,64个输出通道,(96+3+3-7+2)/2=48
    # 3x3的卷积,提取信息多,计算量小,在信息提取和计算量上比较平衡
    # stride=2,输出shape减半
    nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
    # 非线性单元
    # 简单线性函数模拟复杂非线性函数的根本
    # ReLU数值稳定性好,避免梯度消失或爆炸
    nn.ReLU(),
    # (48+1+1-3+2)/2=24
    # 最大池化层,避免卷积层对位置的敏感性
    # 最大池化层,不改变通道数
    # stride=2,输出shape减半
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

# stage2
b2 = nn.Sequential(
    # 输入通道64,输出通道64,(24+0+0-1+1)/1=24
    # 1x1的卷积,看不到空间信息,能看到通道信息,只抽取通道信息
    nn.Conv2d(64, 64, kernel_size=1),
    nn.ReLU(),
    # 输入通道64,输出通道192,(24+1+1-3+1)/1=24
    nn.Conv2d(64, 192, kernel_size=3, padding=1),
    nn.ReLU(),
    # (24+1+1-3+2)/2=12
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

# stage3
b3 = nn.Sequential(
    # p1_1,1x1卷积层,输入通道192,输出通道64,(12+0+0-1+1)/1=12
    # p2_1,1x1卷积层,输入通道192,输出通道96,(12+0+0-1+1)/1=12
    # p2_2,3x3卷积层,输入通道96,输出通道128,(12+1+1-3+1)/1=12
    # p3_1,1x1卷积层,输入通道192,输出通道16,(12+0+0-1+1)/1=12
    # p3_2,5x5卷积层,输入通道16,输出通道32,(12+2+2-5+1)/1=12
    # p4_1,3x3最大池化层,(12+1+1-3+1)/1=12
    # p4_2,1x1卷积层,输入通道192,输出通道32,(12+0+0-1+1)/1=12
    # forward()融合了p1,p2,p3,p4的输出,增加了通道维,64+128+32+32=256
    Inception(192, 64, (96, 128), (16, 32), 32),
    # p1_1,1x1卷积层,输入通道256,输出通道128,(12+0+0-1+1)/1=12
    # p2_1,1x1卷积层,输入通道256,输出通道128,(12+0+0-1+1)/1=12
    # p2_2,3x3卷积层,输入通道128,输出通道192,(12+1+1-3+1)/1=12
    # p3_1,1x1卷积层,输入通道256,输出通道32,(12+0+0-1+1)/1=12
    # p3_2,5x5卷积层,输入通道32,输出通道96,(12+2+2-5+1)/1=12
    # p4_1,3x3最大池化层,(12+1+1-3+1)/1=12
    # p4_2,1x1卷积层,输入通道256,输出通道64,(12+0+0-1+1)/1=12
    # forward()融合了p1,p2,p3,p4的输出,增加了通道维,128+192+96+64=480
    Inception(256, 128, (128, 192), (32, 96), 64),
    # (12+1+1-3+2)/2=6
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

# stage4
b4 = nn.Sequential(
    # inception块,不改变宽高,改变通道数量
    # 输入通道480,输出通道=192+208+48+64=512,6x6
    Inception(480, 192, (96, 208), (16, 48), 64),
    # 输入通道512,输出通道=160+224+64+64=512,6x6
    Inception(512, 160, (112, 224), (24, 64), 64),
    # 输入通道512,输出通道5126x6
    Inception(512, 128, (128, 256), (24, 64), 64),
    # 输入通道512,输出通道5286x6
    Inception(512, 112, (144, 288), (32, 64), 64),
    # 输入通道528,输出通道256+320+128+128=832,6x6
    Inception(528, 256, (160, 320), (32, 128), 128),
    # (6+1+1-3+2)/2=3
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1))

# stage5
b5 = nn.Sequential(
    # inception块,不改变宽高,改变通道数量
    # 输入通道832,输出通道=832,3x3
    Inception(832, 256, (160, 320), (32, 128), 128),
    # 输入通道832,输出通道=1024,3x3
    Inception(832, 384, (192, 384), (48, 128), 128),
    # !全局池化层,计算快,收敛慢,泛化能力增强
    # !kernel_size=3x3 (3+0+0-3+1)/1=1
    # AdaptiveAvgPool2d 全局平均池化层,1x1的宽高图片
    nn.AdaptiveAvgPool2d((1,1)),
    # 展平层
    nn.Flatten())

net = nn.Sequential(
    b1, 
    b2, 
    b3, 
    b4, 
    # 输出 1x1024
    b5, 
    # 全连接层,输出1x10
    nn.Linear(1024, 10))
# GoogLeNet比较慢,Fashion-MNIST上的训练,输入的高和宽96
X = torch.rand(size=(1, 1, 96, 96))
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape:\t', X.shape)
Sequential output shape:	 torch.Size([1, 64, 24, 24])
Sequential output shape:	 torch.Size([1, 192, 12, 12])
Sequential output shape:	 torch.Size([1, 480, 6, 6])
Sequential output shape:	 torch.Size([1, 832, 3, 3])
Sequential output shape:	 torch.Size([1, 1024])
Linear output shape:	 torch.Size([1, 10])
# 训练模型
lr, num_epochs, batch_size = 0.1, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
# softmax和权重初始化都在这个方法内部
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.246, train acc 0.905, test acc 0.895
3063.8 examples/sec on cuda:0

在这里插入图片描述

GoogLeNet总结

  • 学习分阶段,每个阶段做每个阶段的事情
  • 每个阶段以多种方式进行学习,多种学习方式并行
  • 一般,inception块,不改变宽高,改变通道数量

1x1卷积层作用:

  • 放到3x3卷积层之前的目的是3x3卷积计算慢,减少输出通道,降低计算量
  • 1x1的卷积,看不到空间信息,能看到通道信息,只抽取通道信息

池化层作用:

  • 池化层,避免卷积层对位置的敏感性
  • 池化层,不改变通道数

全局平均池化层作用:

  • 对前一层输出的整张图片做平均池化
  • 全局池化层,计算快,收敛慢,泛化能力增强

通道

  • 卷积核学习的模式或特征
  • 通道数量增加对计算量的影响不大
  • 输出多种学习记录(对话,笔记等不同输出取到)

网络深度

  • 计算量相比宽度小
  • 学习就是不停的基于前面成果的向上抽象

query

先用别人的网络

  • 答:不是懂的话,不要细调整。可以调整通道数全部减小2倍4倍等,输入resize缩小一些

最强是resnest系列

  • 答:在imageNet上很强,擅长迁移学习

超参数调节

  • 答:找数据集子集减少样本,修改输入输出shape,多个网络架构结果,对比

通道数

  • 答:100万张图片,1000类别,最多1024个通道就够了。10万类别输出,可能最多2048个通道

inception内部不同学习方式的并行

  • 答:pytorch不会帮做并行

相关文章:

  • 乡村调研笔记----乡村振兴,实现城乡融合发展新局面
  • 【C语言】结构体进阶详解
  • MySQL夺命连环15问,你能坚持到第几问?
  • 中庸之道主要三个原则
  • 【mitmproxy】一、简介与快速上手
  • 15天深度复习JavaWeb的详细笔记(六)——HTTP、Tomcat、Servlet
  • MySQL5.7主从同步
  • 2022软件测试3大发展趋势,看看你都知道吗?
  • 大度型人格分析,性格大度的优劣势及职业规划
  • Java实现PDF读取
  • 2022派卧底去阿里、京东、美团、滴滴带回来的面试题及答案
  • 【软件测试】软件测试基础理论
  • 一文读懂 Python 装饰器
  • 基于Django+Vue开发的社区疫情管理系统(附源码)
  • 怎样在应用中实现自助报表功能
  • 【Amaple教程】5. 插件
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【译】理解JavaScript:new 关键字
  • C++类中的特殊成员函数
  • cookie和session
  • CSS魔法堂:Absolute Positioning就这个样
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Sublime text 3 3103 注册码
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • webpack入门学习手记(二)
  • 安装python包到指定虚拟环境
  • 从零开始学习部署
  • 分布式任务队列Celery
  • 回流、重绘及其优化
  • 基于组件的设计工作流与界面抽象
  • 聊聊sentinel的DegradeSlot
  • 区块链分支循环
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 学习Vue.js的五个小例子
  • 异常机制详解
  • linux 淘宝开源监控工具tsar
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #### go map 底层结构 ####
  • #HarmonyOS:基础语法
  • #Z0458. 树的中心2
  • (26)4.7 字符函数和字符串函数
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)ABI是什么
  • (转载)从 Java 代码到 Java 堆
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!