深度学习-图像分类篇一:基础理论

news2024/11/26 17:25:10

开头言

  • 学东西前总是爱问,这个学了有什么用,会用就行了么。能够回答你这个问题的人,都是学过的(只有学过才有资格告诉你有没有用),然而知识往往就是这样,学的人越多越没有用,我可以做的是学会后,在这个基础上创新,这个创新有没有用,也要等你创完了才知道,所以学习本身是有巨大的风险,要仔细的评估学习的价值,以及自己创新的能力,不要轻易付出时间白忙一场。

常见问题

  • 1.Pytorch每一步梯度更新都不会清除梯度,这在tensorflow中没有,这种特性可以让我们用很小的显存实现较大batchsize的训练只要把积累的梯度取均值就可以在反向传播中参数:https://www.zhihu.com/question/303070254

    • 但是batchsize太小对于BN层就没有效果了
  • 2.为什么预测的时候要eval():https://zhuanlan.zhihu.com/p/356500543

  • 3.混淆矩阵
    在这里插入图片描述

AlexNet进入卷积神经网络爆发时代

在这里插入图片描述

import torch
import torch.nn as nn

class AlexNet(nn.Module):
    def __init__(self,num_classes=1000,init_weights=False):
        super(AlexNet, self).__init__()
        self.features=nn.Sequential(
            nn.Conv2d(3,48,kernel_size=11,stride=4,padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,padding=2),
            nn.Conv2d(48,128,kernel_size=5,padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3,padding=2),
            nn.Conv2d(128, 192, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 192, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 128, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, padding=2)
        )

        self.features = nn.Sequential(
            nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2),  # input[3, 224, 224]  output[48, 55, 55]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),  # output[48, 27, 27]
            nn.Conv2d(48, 128, kernel_size=5, padding=2),  # output[128, 27, 27]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),  # output[128, 13, 13]
            nn.Conv2d(128, 192, kernel_size=3, padding=1),  # output[192, 13, 13]
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 192, kernel_size=3, padding=1),  # output[192, 13, 13]
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 128, kernel_size=3, padding=1),  # output[128, 13, 13]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),  # output[128, 6, 6]
        )

        self.classifier=nn.Sequential(
            nn.Dropout(p=0.5),
            nn.Linear(128*6*6,2048),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(2048, 2048),
            nn.ReLU(inplace=True),
            nn.Linear(2048, num_classes)
        )

        if init_weights:
            self._initialize_weights()

    def forward(self,x):
        x=self.features(x)
        x=torch.flatten(x,start_dim=1)
        x=self.classifier(x)
        return x

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m,nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.normal_(m.weight, 0, 0.01)
                nn.init.constant_(m.bias, 0)

if __name__ == '__main__':
    a=torch.rand(32,3,224,224)
    net=AlexNet(10,False)
    b=net(a)
    pass

VGG

  • 提出堆叠33的卷积核代替55(2个) 、7*7(3个)减少计算的同时获得相同的视野
    • 感受野计算公式理解
      • 如果上一层的感受野是1,那么下一层的感受野就是核心大小
      • 如果上一层的感受野大于1,那么1的部分是核心大小,其他部分是步距大小
    • 在这里插入图片描述
    • 结构在这里插入图片描述

GoogleNet

  • 首次出现拼接结果的并行结构(之前的都是串行)

在这里插入图片描述

  • inception结构
    • 输入的宽高相同在C出拼接
      在这里插入图片描述
  • 1*1的卷积核降维
    在这里插入图片描述
  • 网络详解

在这里插入图片描述

ResNet

在这里插入图片描述

  • 创新解决梯度消失 and 爆炸
  • 退化问题(残差)
    在这里插入图片描述
  • 残差结构要求chw都一样,值相加,从而爆炸梯度大于1
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • BN层,两个参数调整的分别是方差和均值,不调整就是均值为0方差为1
    • https://blog.csdn.net/qq_37541097/article/details/104434557
      在这里插入图片描述

    • (1)训练时要将traning参数设置为True,在验证时将trainning参数设置为False。在pytorch中可通过创建模型的model.train()和model.eval()方法控制。

    • (2)batch size尽可能设置大点,设置小后表现可能很糟糕,设置的越大求的均值和方差越接近整个训练集的均值和方差。

    • (3)建议将bn层放在卷积层(Conv)和激活层(例如Relu)之间,且卷积层不要使用偏置bias,因为没有用,参考下图推理,即使使用了偏置bias求出的结果也是一样的

  • 迁移学习
    在这里插入图片描述

ResNeXt

在这里插入图片描述

  • 组卷积
    在这里插入图片描述
  • 等价替换
    在这里插入图片描述
    在这里插入图片描述

MobileNetV1

  • DW卷积
    • 减少参数
    • 缺点:训练完后很多参数失效(为0),在V2中改进
      在这里插入图片描述
      在这里插入图片描述
  • PW卷积
    • 注意计算量和参数量不一样
      在这里插入图片描述
      在这里插入图片描述

MobileNetV2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 搭建网络倒残差结构
    在这里插入图片描述
class InvertedResidual(nn.Module):
    def __init__(self, in_channel, out_channel, stride, expand_ratio):
        super(InvertedResidual, self).__init__()
        hidden_channel = in_channel * expand_ratio
        self.use_shortcut = stride == 1 and in_channel == out_channel#1保证大小相等,保证通道相等

        layers = []
        if expand_ratio != 1:
            # 1x1 pointwise conv
            layers.append(ConvBNReLU(in_channel, hidden_channel, kernel_size=1))
        layers.extend([
            # 3x3 depthwise conv
            ConvBNReLU(hidden_channel, hidden_channel, stride=stride, groups=hidden_channel),
            # 1x1 pointwise conv(linear)
            nn.Conv2d(hidden_channel, out_channel, kernel_size=1, bias=False),
            nn.BatchNorm2d(out_channel),
        ])

        self.conv = nn.Sequential(*layers)

    def forward(self, x):
        if self.use_shortcut:
            return x + self.conv(x)
        else:
            return self.conv(x)

MobileNetv3

在这里插入图片描述

  • 通道注意力
    • QKV原理:https://www.bilibili.com/video/BV1nL4y1j7hA/?spm_id_from=333.337.search-card.all.click&vd_source=ce61818c8667e3f2de36a179a3c6e3af
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  • 结构
    在这里插入图片描述

ShuffleNet v1

  • 解决组卷积每组信息隔离不能互通的问题
  • 将pw卷积改成group卷积减少计算量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • shuffle的过程
    在这里插入图片描述
def channel_shuffle(x: Tensor, groups: int) -> Tensor:

    batch_size, num_channels, height, width = x.size()
    channels_per_group = num_channels // groups

    # reshape
    # [batch_size, num_channels, height, width] -> [batch_size, groups, channels_per_group, height, width]
    x = x.view(batch_size, groups, channels_per_group, height, width)

    x = torch.transpose(x, 1, 2).contiguous()

    # flatten
    x = x.view(batch_size, -1, height, width)

    return x

ShuffleNet v2

在这里插入图片描述
在这里插入图片描述

  • 设计高效的网络
    在这里插入图片描述
  • 针对1*1的pw卷积
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 结构
    在这里插入图片描述

EfficientNet V1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 不同的网络输入图片的尺寸是不一样的
    在这里插入图片描述

EfficientNet V2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • Dropout:https://www.bilibili.com/video/BV1Fb4112722/?spm_id_from=333.337.search-card.all.click&vd_source=6bcccf10adf3fa505b41acbe0da77a56
    • 训练的时候以p的概率丢弃输入x,所以输入的期望是px,输出是wpx。
    • 推理的时候为了和训练呼应,又不能使得推理是一个可以变化的值,那么把p放在w上,输出是pwx
    • 输入层丢弃少一点0.9,隐藏层0.5左右
    • 原理:因为不确定每次神经元的个数,所以只能学习非常稳定内容,使得单个神经元变得很强大,不好学习误差信息
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Google 的 zx 库编写切换微信小程序环境的脚本

背景 微信小程序目前为止还没有提供API或者具体的配置方式,给我们设置环境变量,所以还得自己想办法。 创建一个 shell 脚本——一个由诸如 Bash 或 zsh 之类的 shell 执行的脚本——可以是自动化重复任务的好方法。Node.js 似乎是编写 shell 脚本的理想…

Apache Calcite 简介

这张图上列的,是直接使用 Apache Calcite 或者至少相关联的项目。大家肯定能在里面找到很多自己熟悉的项目。 那 Apache Calcite 究竟是干嘛的,又为什么能这么流行呢? 首先,摆一个应该没多少人会反对的共识:SQL 是编程领域最流行的语言。 有 MySQL、Oracle 之类使用 SQL…

Linux---函数库和Makefile

Linux---函数库和Makefile 函数库动态库静态库例 Linux项目自动化构建工具-make/Makefile背景实例代码原理项目清理 函数库 方法实现就是在库当中,库其实就是把源文件经过一定的翻译,然后打包,只给你提供一个文件计科,不用给你提…

Spring -- Bean的生命周期

BeanDefinition Spring容器在进行实例化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefinition对象&#xff0c;Spring根据BeanDefinition来创建Bean对象&#xff0c;里面有很多的属性用来描述Bean BeanDefinition 中几个重要方法如下 beanClassName&#…

阿里云——云服务器基础运维与管理

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 学习目标&#xff1a; 一.3个理由拥抱云服务器 1.什么是云服务器 2.使用…

人物百科词条创建教程分享,人物创建百科有什么要求

人物百科词条的创建是一个相对复杂的过程&#xff0c;需要遵循一定的规范和要求。以下是一个人物百科词条创建教程的分享&#xff0c;包括创建要求、步骤和注意事项&#xff0c;接下来伯乐网络传媒就来给大家好好讲一讲。 一、人物百科词条创建要求 1. 真实性&#xff1a;创建…

ELK-日志服务【filebeat-安装使用】

目录 【1】安装Filebeat 【2】配置-测试 【3】配置使用Filebeat 【4】filebeat-收集系统文件日志 【5】配置filebeat&#xff0c;将/var/log/all.log日志采集到es集群中 【6】定制索引名称 【7】收集多个web节点的日志&#xff0c;输出到相同的索引中 【8】filebeat-收…

【并查集+组合计数】ABC226 E

E - Just one (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 首先有个条件&#xff1a;每个点只有一个出边 如果没有直接看出结论&#xff0c;可以画几个链和树等特殊的图&#xff0c;可以发现&#xff0c;树是不满足条件的&#xff0c;环是满足条件的&#xff0c;因此可…

管理类联考——数学——记忆篇——数字编码

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程 javaweb开发环境的配置也是比较繁琐的一件事情&#xff0c;虽然理论上使用记事本&#xff0c;完全可以写出一个Javaweb工程&#xff0c; 但是在团队大型开发的Javaweb过程中&#xff0c;你必须配置好Eclipse、SV…

【算法集训之线性表篇】Day 08

文章目录 题目基本设计思想思路一思路二 代码实现效果 题目 已知一个整数数列A{a0,a1,a2,…,an-1}&#xff0c;其中0<ai<n(0<i<n)。若存在ap1ap2ap3…apmx且m>n/2(0<pk<n,1<k<m)&#xff0c;则成x为A的主元素。例如A{0,5,5,3,5,7,5,5}&#xff0c;…

Python模拟MQTT v3.1.1服务器

示例代码 import logging import asyncio from hbmqtt.broker import Broker# 设置日志级别为DEBUG logging.basicConfig(levellogging.DEBUG)# 创建MQTT服务器 broker Broker()# 启动MQTT服务器 async def start_broker():await broker.start()# 停止MQTT服务器 async def s…

好用到哭!后悔没有早点看到这个微信多账号管理工具!

作为一款及时通讯软件&#xff0c;微信是许多企业进行客户运营的选择工具。企业的员工利用微信与客户进行沟通&#xff0c;并且许多客单也都在微信上如数完成。然而&#xff0c;微信本身并不具备运营需要的很多功能&#xff0c;所以需要借助第三方工具来实现。 安全吗&#xf…

day20 数组指针

int main(void) {char *name[5] {"hello","china","beijing","project","Competer"};int i;for(i0;i<5;i){printf("%s\n",name[i]);//结果打印五个字符串}return 0; }数组指针&#xff0c;存了5个指针&#x…

串行FLASH文件系统FatFs-实际应用

目录 串行FLASH文件系统FatFs-实际应用 功能展示 程序代码 程序过程分析 串行FLASH文件系统FatFs-实际应用 功能展示 实验主要使用我们移植好的FatFs的FLASH文件系统实现三个功能&#xff1a;设备信息获取、文件定位写入功能测试和文件信息获取测试功能。 最终串口输出结…

4.带你入门matlab排序最值标准差标差(matlab程序)

%% 学习目标&#xff1a;排序&#xff0c;最值&#xff0c;标准差&#xff0c;方差 代码及结果 %% 排序 clear all; X[1 3 4;8 3 5;2 7 4] y1sort(X) %按列由小到大排序 y2sort(X,2) %按行由小到大排序 y3sort(X,1,descend) %按列由大…

自定义程序包不存在的解决方法

方案一&#xff1a; 在pom文件中加入以下代码 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.4.2</version><configuration><skipTests>true</sk…

数据驱动的决策优化,半导体CMS系统在企业管理中的应用

在当今信息时代&#xff0c;数据的重要性在企业管理中愈发凸显。半导体制造业作为一个高度自动化和数据密集的行业&#xff0c;利用数据进行决策优化对于企业的成功至关重要。在这方面&#xff0c;PreMaint CMS系统扮演着关键的角色&#xff0c;为企业管理提供了数据驱动的决策…

Git Commit的规范及高级使用方法

git commit是日常工作中使用率极高的一个命令&#xff0c;但是根据我从业5年的经验来看&#xff0c;大多数人在用git commit命令时都很粗糙&#xff0c;比如git commit -m 后跟的message是五花八门&#xff0c;有用中文的&#xff0c;有用英文的&#xff0c;甚至还有直接跟111的…

小程序搭建教程

小程序搭建流程 随着移动互联网的发展&#xff0c;小程序成为了营销和服务的重要渠道之一。在本文中&#xff0c;我们将介绍如何搭建一个小程序的详细流程&#xff0c;包括公众号申请、支付微信认证费、复用资质申请小程序、开通微信支付、绑定第三方开发平台、添加商品服务内…