PyTorch 深度学习实践-卷积神经网络高级篇

视频指路
参考博客笔记
参考笔记二

文章目录

  • 上课笔记
    • 10.1GoogleNet(Inception 层)
    • 代码实现
    • 10.2 Residual Net
    • 代码实现

上课笔记

可以设置padding=‘same’ 使输入输出大小一致

10.1GoogleNet(Inception 层)

说明:Inception Moudel

1、卷积核超参数选择困难(提供四条变换路线输出要保证宽高一致,把结果concatenate到一起,效率高的权重大),自动找到卷积的最佳组合。

2、1x1卷积核,不同通道的信息融合。使用1x1卷积核虽然参数量增加了,但是能够显著的降低计算量(operations)

3、Inception Moudel由4个分支组成,要分清哪些是在Init里定义,哪些是在forward里调用。4个分支在dim=1(channels)上进行concatenate。24+16+24+24 = 88

4、GoogleNet的Inception(Pytorch实现)

在这里插入图片描述

下面是1*1卷积核计算过程

在这里插入图片描述

在5 *5 的卷积之前先进行一个1 * 1的卷积能有效降低运算量

比如:192 * 28 * 28经过一个5 * 5的卷积得到 32 * 28 * 28的输出运算为:

5^2 * 28 ^2 * 192 * 32=120422400

而中间先经过一个1 * 1的卷积再经过一个5 * 5的卷积得到 32 * 28 * 28的输出运算为:1^2 * 28^2 * 192 * 16 + 5^2 + 28^2 * 16 * 32 = 12433648

少了十倍

1*1卷积的主要作用有以下几点:

1、降维。比如,一张500 * 500且厚度depth为100 的图片在20个filter上做11的卷积,那么结果的大小为500500*20。

2、加入非线性。卷积层之后经过激励层,1*1的卷积在前一层的学习表示上添加了非线性激励,提升网络的表达能力;

3、增加模型深度。可以减少网络模型参数,增加网络层深度,一定程度上提升模型的表征能力。

在这里插入图片描述

self.branch1x1 = nn.Conv2d(in_channels, 16, kernel_size=1)self.branch5x5_1 = nn.Conv2d(in_channels, 16, kernel_size=1)self.branch5x5_2 = nn.Conv2d(16, 24, kernel_size=5, padding=2)self.branch3x3_1 = nn.Conv2d(in_channels, 16, kernel_size=1)self.branch3x3_2 = nn.Conv2d(16, 24, kernel_size=3, padding=1)self.branch3x3_3 = nn.Conv2d(24, 24, kernel_size=3, padding=1)self.branch_pool = nn.Conv2d(in_channels, 24, kernel_size=1)

把上面四个卷积出的通道聚合(Concatenate),输出

outputs = [branch1*1, branch5*5, branch3*3, branch_pool]`
return torch.cat(outputs, dim=1)#沿着通道c拼接起来 维度=1

张量的维度是(b, c, h, w) batch, channel, width, height

在这里插入图片描述

代码实现

import torch
import torch.nn as nn
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim# prepare datasetbatch_size = 64
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])  # 归一化,均值和方差train_dataset = datasets.MNIST(root='../dataset/mnist/', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist/', train=False, download=True, transform=transform)
test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)# design model using class
class InceptionA(nn.Module):def __init__(self, in_channels):super(InceptionA, self).__init__()self.branch1x1 = nn.Conv2d(in_channels, 16, kernel_size=1)self.branch5x5_1 = nn.Conv2d(in_channels, 16, kernel_size=1)self.branch5x5_2 = nn.Conv2d(16, 24, kernel_size=5, padding=2)self.branch3x3_1 = nn.Conv2d(in_channels, 16, kernel_size=1)self.branch3x3_2 = nn.Conv2d(16, 24, kernel_size=3, padding=1)self.branch3x3_3 = nn.Conv2d(24, 24, kernel_size=3, padding=1)self.branch_pool = nn.Conv2d(in_channels, 24, kernel_size=1)def forward(self, x):branch1x1 = self.branch1x1(x)branch5x5 = self.branch5x5_1(x)branch5x5 = self.branch5x5_2(branch5x5)branch3x3 = self.branch3x3_1(x)branch3x3 = self.branch3x3_2(branch3x3)branch3x3 = self.branch3x3_3(branch3x3)branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)branch_pool = self.branch_pool(branch_pool)outputs = [branch1x1, branch5x5, branch3x3, branch_pool]return torch.cat(outputs, dim=1)  # b,c,w,h  c对应的是dim=1class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 10, kernel_size=5)self.conv2 = nn.Conv2d(88, 20, kernel_size=5)  # 88 = 24x3 + 16self.incep1 = InceptionA(in_channels=10)  # 与conv1 中的10对应self.incep2 = InceptionA(in_channels=20)  # 与conv2 中的20对应self.mp = nn.MaxPool2d(2)self.fc = nn.Linear(1408, 10)def forward(self, x):in_size = x.size(0)x = F.relu(self.mp(self.conv1(x)))x = self.incep1(x)x = F.relu(self.mp(self.conv2(x)))x = self.incep2(x)x = x.view(in_size, -1)x = self.fc(x)return xmodel = Net()# construct loss and optimizer
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)# training cycle forward, backward, updatedef train(epoch):running_loss = 0.0for batch_idx, data in enumerate(train_loader, 0):inputs, target = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, target)loss.backward()optimizer.step()running_loss += loss.item()if batch_idx % 300 == 299:print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))running_loss = 0.0def test():correct = 0total = 0with torch.no_grad():for data in test_loader:images, labels = dataoutputs = model(images)_, predicted = torch.max(outputs.data, dim=1)total += labels.size(0)correct += (predicted == labels).sum().item()print('accuracy on test set: %。3f %% ' % (100 * correct / total))if __name__ == '__main__':for epoch in range(10):train(epoch)test()

10.2 Residual Net

知识点:残差层定义

问题描述:卷积核层数不是越深越好,可能存在梯度消失

主要思路:引入残差连接,拼接后再激活,计算梯度的时候就能有所保留,要求输入输出大小相同

代码实现:定义残差块类,指定输入通道数,跳转拼接后再激活。模型构建时再定义相关层

跳连接:将H(x)的输入再加一个x,求导的时候x`=1,那么就算梯度很小也是将近于1,多个这样的数相乘梯度还是不为0,能解决梯度消失的情况,其中F(x)和x应该尺寸相同。
在这里插入图片描述

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

class ResidualBlock(torch.nn.Module):def __init__(self, channels):super(ResidualBlock,self).__init__()self.channels = channels  # 过残差连接输入输出通道不变self.conv1 = torch.nn.Conv2d(channels, channels, 3,padding=1)#padding=1使得F(x)和x应该尺寸相同self.conv2 = torch.nn.Conv2d(channels, channels, 3,padding=1)def forward(self, x):y = F.relu(self.conv1(x))y = self.conv2(y)return F.relu(x + y)  # 先求和再激活

在这里插入图片描述

在这里插入图片描述

1.看一些深度学习理论方面的书比如花书

2.阅读pytorch文档,至少通读一遍

3.复现经典工作:先读代码,训练架构,测试架构,数据读取架构,损失函数怎么构建的,根据论文讲的东西自己去写

4.选一个特定领域阅读大量论文,看一下大家在设计网络的时候都用了什么技巧,想创新点

代码实现

import torch
from torchvision import datasets
from torch.utils.data import DataLoader
from torchvision import transforms
import torch.nn.functional as F# 1.数据集准备
batch_size = 64
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_dataset = datasets.MNIST(root='../dataset/minist', train = True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size, num_workers=2)
test_dataset = datasets.MNIST(root='../dataset/minist', train = False, download=True, transform=transform)
test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size, num_workers=2)# 2.模型构建
class ResidualBlock(torch.nn.Module):def __init__(self, channels):super(ResidualBlock,self).__init__()self.channels = channels  # 过残差连接输入输出通道不变self.conv1 = torch.nn.Conv2d(channels, channels, 3,padding=1)self.conv2 = torch.nn.Conv2d(channels, channels, 3,padding=1)def forward(self, x):y = F.relu(self.conv1(x))y = self.conv2(y)return F.relu(x + y)  # 先求和再激活class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.c1 = torch.nn.Conv2d(1, 16, 5)self.c2 = torch.nn.Conv2d(16, 32, 5)self.rblock1 = ResidualBlock(16)  # 与conv1 中的16对应self.rblock2 = ResidualBlock(32)  # 与conv2 中的32对应self.mp = torch.nn.MaxPool2d(2)  # 图像缩小一半 12  (不要改步长啊)self.l = torch.nn.Linear(512, 10)def forward(self, x):batch = x.size(0)x = torch.relu(self.mp(self.c1(x)))  # b*10*12*12x = self.rblock1(x)x = torch.relu(self.mp(self.c2(x)))  # b*20*4*4x = self.rblock2(x)x = x.view(batch, -1)# print(x.shape)return self.l(x)device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Net().to(device)
# # 创建一个示例图像查看模型输出shape(好给全连接层赋值)----->输出:torch.Size([1, 1408])
# sample_image = torch.randn(1, 1, 28, 28)  # 1张图像,1个通道,28x28大小的图像
# output = model(sample_image)# 3.损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 4.训练
def train(epoch):running_loss = 0.0for batch_idex, (x, y) in enumerate(train_loader):x, y = x.to(device), y.to(device)y_pred = model(x)optimizer.zero_grad()loss = criterion(y_pred, y)running_loss += loss.item()loss.backward()optimizer.step()if batch_idex % 300 == 299:print(f'epoch{epoch+1}--------batch{batch_idex+1}-------loss={round(running_loss/300, 3)}')running_loss = 0.0def test():total = 0acc = 0with torch.no_grad():for (x, y) in test_loader:x, y = x.to(device), y.to(device)y_pred = model(x)total += y_pred.size(0)_, predicted = torch.max(y_pred, dim=1)acc += (predicted == y).sum().item()print('test= %.3f %%' % (100 * acc/total))if __name__ == '__main__':for epoch in range(10):train(epoch)test()

练习:阅读Identity Mappings in Deep Residual Networks,Densely Connected Convolutional Networks,实现相关网络用minist数据集测试

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

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

相关文章

【Node.js】初识 Node.js

Node.js 概念 Node.js 是一个开源与跨平台的 JavaScript运行时环境 ,在浏览器外运行 V8 JavaScript 引擎(Google Chrome的内核),利用事件驱动、非阻塞和异步输入输出 等技术提高性能。 可以理解为 Node.js就是一个服务器端的、非阻塞式 l/O 的、事件驱…

Mac 安装MySQL 配置环境变量 修改密码

文章目录 1 下载与安装2 配置环境变量3 数据库常用命令3.1 Mac使用设置管理mysql服务启停 4 数据库修改root密码4.1 知道当前密码4.2 忘记当前密码4.3 问题 参考 1 下载与安装 官网:https://www.mysql.com/ 找到开源下载方式 下载社区版 2 配置环境变量 对于Mac…

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…

观测云对接 Fluentd 采集业务日志最佳实践

概述 Fluentd 是一个开源数据收集器,专为简化日志管理和使日志数据更加易于访问、使用而设计。作为一个高度可扩展的工具,它能够统一数据收集和消费过程,使得构建实时分析的日志系统变得更加高效。 观测云目前已集成 Fluentd ,可…

milvus的collection操作

milvus的collection操作 创建collection import uuidfrom pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )collection_name "hello_milvus" host "192.168.230.71" port 19530 username "" password…

VSCode中通过launch.json文件打断点DeBug调试代码(详细图文教程)

先吐槽 IDE编译工具调试代码是非常重要的,之前使用Pycharm很方便,直接在Configuration中配置参数就行,见下。使用VSCode进行有命令代码调试时相对麻烦一些,看其它教程没撤清楚,这里做个总结,学者耐心学习。…

01 MySQL

学习资料:B站视频-黑马程序员JavaWeb基础教程 文章目录 JavaWeb整体介绍 MySQL1、数据库相关概念2、MySQL3、SQL概述4、DDL:数据库操作5、DDL:表操作6、DML7、DQL8、约束9、数据库设计10、多表查询11、事务 JavaWeb整体介绍 JavaWeb Web:全球广域网&…

网络准入控制设备是什么?有哪些?网络准入设备臻品优选

小李:“小张,最近公司网络频繁遭遇外部攻击,我们得加强一下网络安全了。” 小张:“是啊,我听说实施网络准入控制是个不错的选择。但具体什么是网络准入控制设备?我们有哪些选择呢?” 小李微笑…

基于 MelosBoom ,捕获 DePIN 赛道发展红利

Melos是一个Web3音乐领域的先驱性生态,其允许任何人通过其工具创作音乐,生成的内容可以保存为NFT并进入流通,同时支持该音乐资产支持开放再创作。最为最具影响力以及发展潜力的Web3音乐生态,其不仅获得了来自于头部VC Binance Lab…

分布式缓存-Redis持久化

使用缓存的时候,我们经常需要对内存中的数据进行持久化(将内存中的数据写入到硬盘中)。 原因:重用数据(比如重启机器、机器故障之后恢复数据),做数据同步(比如 Redis 集群的主从节点…

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

文章目录 一.概要二.DHT11主要性能参数三.DHT11温度传感器内部框图四.DTH11模块原理图五.DHT11模块跟单片机板子接线和通讯时序1.单片机跟DHT11模块连接示意图2.单片机跟DHT11模块通讯流程与时序 六.STM32单片机DHT11温度传感器实验七.CubeMX工程源代码下载八.小结 一.概要 DH…

超声波清洗机买哪款?口碑炸裂的眼镜清洗机推荐

各位时尚潮人们、眼镜党们注意啦!现在超声波清洗机火得一塌糊涂,各种品牌各种款式功能五花八门,但你知道吗?不是每一款都能名副其实,特别是那些便宜货,宣传得天花乱坠,拆开却发现内部只有一个破…

MySQL运维实战之Clone插件(10.2)Clone插件原理

作者:俊达 clone插件实现 clone操作主要分为几个阶段: 1、初始阶段。 初始阶段,会开启页面跟踪(Page Tracking)。开启页面跟踪后,修改过的页面的编号会被记录下来。页面的修改可分为两个阶段&#xff1a…

【Unity学习笔记】第二十 · 物理引擎脉络梳理(数值积分、碰撞检测、约束解决)

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/139808452 作者:CSDN|Ringleader| 物理引擎综述 物理引擎是利用物理规则模拟物体运动和碰撞的模块,以在重力、弹力、摩擦力等各种力作用下做出真实运动表现,并对碰…

澳大利亚药品数据库-40000+药品

众所周知,澳大利亚是一个药品管理极其严格的国家,拥有完善的药品监管体系。对于需要了解澳大利亚药品信息的人来说,了解其药品查询方法是必备基础。本文将详细介绍不同人群对澳大利亚药品信息查询的3种方法。 一、先了解一下澳大利亚药品监管…

《驾驭AI浪潮:伦理挑战与应对策略》

AI发展下的伦理挑战,应当如何应对? 人工智能飞速发展的同时,也逐渐暴露出侵犯数据隐私、制造“信息茧房”等种种伦理风险。随着AI技术在社会各个领域的广泛应用,关于AI伦理和隐私保护问题日趋凸显。尽管国外已出台系列法规来规范…

Linux--网络基础

计算机网络背景 计算机网络背景是一个复杂而丰富的领域,涵盖了从计算机单机模式到网络互联的演变过程,以及网络技术的不断发展和创新。 计算机单机模式和独立发展 在早期,计算机主要以单机模式存在,即每台计算机都是独立的&…

STL—string类—模拟实现

STL—string类—模拟实现 熟悉了string的结构和各自接口的使用之后,现在就要尝试去模拟实现string类 这个string类为了避免和我们库里的string类冲突,因此我们需要定义一个自己的命名空间 namespace wzf {class string{public://成员函数private://成…

json将列表字典等转字符串,然后解析又转回来

在 Python 中使用 json 模块来方便地在数据和 JSON 格式字符串之间进行转换,以便进行数据的存储、传输或与其他支持 JSON 格式的系统进行交互。 JSON 字符串通过 json.loads() 函数转换为 Python 对象。 pthon对象通过json.dumps()转为字符串 import jsonstr_list…

前端JS特效第44集:JS动态波浪文字动画显示特效

JS动态波浪文字动画显示特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compat…