pytorch(九)卷积神经网络

文章目录

  • 卷积神经网络
    • 全连接神经网络与卷积神经网络的区别
    • 概念性知识
    • mnist数据集(卷积神经网络)
  • GoogLeNet
    • Inception
  • 残差网络ResNet
    • 残差块结构
  • 稠密连接网络
    • 网络结构

卷积神经网络

全连接神经网络与卷积神经网络的区别

全连接神经网络是一种最为基础的前馈神经网络,他的每一个神经元都与前一层的所有神经元进行连接,这种连接方式可以使得全连接神经网络能够学习到更加全局的特征。

  • 全连接:在全连接层中,每一个神经元都与前一层的所有神经元相连接,这以为这每一个神经元都收到来自前一层的所有输入的影响
  • 权重独立:全连接神经网络的权重参数不共享,每一个连接都有自己的权重,这就导致需要更新大量的参数,而且可能导致过拟合
  • 输出为以为向量:全连接的输出通常是一维向量

全连接神经网络需要更新的参数数量多,并且在全连接层的输入中,如果是对图像进行处理,比如mnist数据集案例,输入的是(通道1,高28,宽28像素)的图像,但是在全连接层中会被拉成(x=x.view(-1,784))784的数据进行输入,这种输入可能会导致图像丢失重要的空间信息,比如相邻的像素比较相似等。

卷积神经网络CNN更适合用在图像识别、语音识别等各种场合

卷积神经网络最大的特点是它的卷积层,可以通过共享权重和偏置项,实现对输入数据的局部区域进行操作

  • 局部连接:卷积神经网络采用局部连接的方式,它的每一个神经元仅与输入数据的局部区域相连接
  • 权重共享:卷积层的每一个神经元在整个输入数据上共享相同的权重参数,这就降低了模型参数的数量,也意味着卷积层可以学习到特定的特征,而不会受到位置的影响
  • 特征映射:卷积神经网络的卷积层的输出是二维数组

概念性知识

  • 卷积核的通道数量与输入的通道数量相同
  • 卷积核的数量与输出的通道数量相同

一个卷积核的计算

在这里插入图片描述

m个卷积核的计算

在这里插入图片描述

mnist数据集(卷积神经网络)

在这里插入图片描述

# 使用卷积神经网络import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optimbatch_size=64
# 对图像进行处理,对原来图像从{0,255}-归一化->{0,1},把图像的维度变成c*w*h的 
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)class Model(torch.nn.Module):def __init__(self):super(Model,self).__init__()self.conv1=torch.nn.Conv2d(1,10,kernel_size=5)self.pooling=torch.nn.MaxPool2d(2)self.conv2=torch.nn.Conv2d(10,20,kernel_size=5)self.fc=torch.nn.Linear(320,10)def forward(self,x):# 这里需要重新获取batch_size,因为划分小数据块的时候不一定是整除的,不然可能会出错batch_size=x.size(0)x=F.relu(self.pooling(self.conv1(x)))# print(x.shape)x=F.relu(self.pooling(self.conv2(x)))# print(x.shape)x=x.view(batch_size,-1)# print(x.shape)x=self.fc(x)return xmodel=Model()
criterion=torch.nn.CrossEntropyLoss()
# 带冲量为0.5
optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)# device=torch.device('cudo:0' if torch.cudo.is.available() else 'cpu')
# model.to(device)# 模型迁移到显卡中def train(epoch):running_loss=0.0for batch_idx,data in enumerate(train_loader,0):inputs,targets=data# inputs,targets=inputs.to(device),targets.to(device)# forwardy_pred=model(inputs)loss=criterion(y_pred,targets)# backwardoptimizer.zero_grad()loss.backward()# updateoptimizer.step()running_loss+=loss.item()# print('batch_idx:',batch_idx)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=0# 不需要计算梯度with torch.no_grad():for data in test_loader:images,labels=data# inputs,labels=inputs.to(device),labels.to(device)outputs=model(images)# 取最大值的下标 dim表示维度_,predicted=torch.max(outputs.data,dim=1)total+=labels.size(0)correct+=(predicted==labels).sum().item()print('Accuracy on test set:%d %%'%(100*correct/total))if __name__=='__main__':for epoch in range(10):train(epoch)test()

在这里插入图片描述

GoogLeNet

Inception

在这里插入图片描述

在这里插入图片描述

# GooLeNetimport torch.nn as nn
import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optimbatch_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)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)class 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)self.incep1=InceptionA(in_channels=10)self.incep2=InceptionA(in_channels=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()
criterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)def train(epoch):running_loss=0.0for batch_idx,data in enumerate(train_loader,0):inputs,targets=datay_pred=model(inputs)loss=criterion(y_pred,targets)optimizer.zero_grad()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=0# 不需要计算梯度with torch.no_grad():for data in test_loader:images,labels=data# inputs,labels=inputs.to(device),labels.to(device)outputs=model(images)# 取最大值的下标 dim表示维度_,predicted=torch.max(outputs.data,dim=1)total+=labels.size(0)correct+=(predicted==labels).sum().item()print('Accuracy on test set:%d %%'%(100*correct/total))if __name__=='__main__':for epoch in range(10):train(epoch)test()

在这里插入图片描述

残差网络ResNet

残差网络要解决的事深度神经网络中的“退化”问题和网络层数不够深的问题。残差网络最深可以达到158层。

网络退化:在增加网络层数的过程中,training accuracy (精度)逐渐趋于饱和,继续增加层数,training accuracy 就会出现下降的现象,而这种下降不是由过拟合造成的。实际上较深模型后面添加的不是恒等映射,而是一些非线性层。

残差块结构

在这里插入图片描述

# 残差网络
import torch.nn as nn
import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optimclass ResidualBlock(nn.Module):def __init__(self,channels):super(ResidualBlock,self).__init__()self.channels=channels# 输入与输出的通道数相同self.conv1=nn.Conv2d(channels,channels,kernel_size=3,padding=1)self.conv2=nn.Conv2d(channels,channels,kernel_size=3,padding=1)def forward(self,x):y=F.relu(self.conv1(x))y=self.conv2(y)return F.relu(x+y)class Net(nn.Module):def __init__(self):super(Net,self).__init__()self.conv1=nn.Conv2d(1,16,kernel_size=5)self.conv2=nn.Conv2d(16,32,kernel_size=5)self.mp=nn.MaxPool2d(2)self.rblock1=ResidualBlock(16)self.rblock2=ResidualBlock(32)self.fc=nn.Linear(512,10)def forward(self,x):in_size=x.size(0)x=self.mp(F.relu(self.conv1(x)))x=self.rblock1(x)x=self.mp(F.relu(self.conv2(x)))x=self.rblock2(x)x=x.view(in_size,-1)x=self.fc(x)return xmodel=Net()
criterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)def train(epoch):running_loss=0.0for batch_idx,data in enumerate(train_loader,0):inputs,targets=datay_pred=model(inputs)loss=criterion(y_pred,targets)optimizer.zero_grad()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=0# 不需要计算梯度with torch.no_grad():for data in test_loader:images,labels=data# inputs,labels=inputs.to(device),labels.to(device)outputs=model(images)# 取最大值的下标 dim表示维度_,predicted=torch.max(outputs.data,dim=1)total+=labels.size(0)correct+=(predicted==labels).sum().item()print('Accuracy on test set:%d %%'%(100*correct/total))if __name__=='__main__':for epoch in range(10):train(epoch)test()

在这里插入图片描述

稠密连接网络

残差网络主要思想是在网络中引入跨层连接,使得网络可以刚好地利用浅层特征信息,从而提高网络的性能。但是,残差连接还是UC你在一些问题,比如梯度消失和梯度爆炸。

稠密连接网络某一种程度上是ResNet的逻辑扩展,稠密连接网络引入的是密集连接,也就是每一层都与前面的所有层相连,使得网络可以更好地利用浅层特征信息,同时缓解了梯度消失和梯度爆炸等问题。

网络结构

稠密网络主要由两个部分组成:

  • 稠密块:定义如何连接输入和输出,稠密层将所有的前面特征作为输入;
  • 过滤层:控制通道数量,使其不会太复杂。

https://blog.csdn.net/qq_38473254/article/details/134210444

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

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

相关文章

ChatGPT Prompt 的原理总结

ChatGPT Prompt 的原理总结 ChatGPT Prompt 是 OpenAI 开发的大型语言模型 ChatGPT 的一种使用方式。通过 Prompt,用户可以引导 ChatGPT 生成特定内容,例如回答问题、写故事、写代码等等。 Prompt 的原理 Prompt 本质上是一段文本,它告诉 C…

处理json异常问题,由于发送kafka消息是一个字符串,等到消费时json字符串会有多个““引号,故需要先处理json再转对象

发送一个正确的json对象 发送kafka消息也是一个json传,也没问题 等到消费kafka时,也能接收到一个json字符串但是会多一个 " 引号, 就会导致json转对象失败所以需要先去除 开通和结尾的 " 引号 去除后的json 就是一个正常的json&…

河北专升本(C语言编程题)

一:基础算法原理 1. 冒泡排序 原理:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序为例,第一轮比较后,所有数中最大的…

Linux进程概念(2)

一、进程状态 Linux的进程状态实际上就是 struct task_struct 结构体中的一个变量 1.1状态汇总 其中,Linux 状态是用数组储存的,如下: static const char * const task_state_array[] { "R (running)", // 0 …

【Web世界探险家】打开Web世界的大门

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ &…

唯众物联网+地理科学交付云南师范大学地理学部教学实验室项目

近日,云南师范大学地理学部教学实验室建设项目顺利交付。该项目的成功落地,标志着物联网技术与地理科学教育的深度融合,为云南师范大学的地理教学提供了全新的教学平台与资源。该项目以物联网技术为核心,结合地理科学的特点&#…

蓝桥杯算法错题记录-基础篇

文章目录 本文还在跟新,最新跟新时间3/11!!! 格式一定要符合要求,(输入,输出格式)1. nextInt () next() nextLine() 的注意事项2 .数的幂 a^2等3.得到最大长度(最大...&a…

卡尔曼滤波器笔记——最详细

笔记来源— 卡尔曼滤波算法原理及代码实现!https://www.bilibili.com/video/BV1WZ4y1F7VN/?spm_id_from333.337.search-card.all.click&vd_source8d55784dc9c7530bc9e3fa220380be56 简单介绍一下 现在我们就是不知道是距离多少,就需要用到这个卡尔…

如何将应用一键部署至多个环境?丨Walrus教程

在 Walrus 平台上,运维团队在资源定义(Resource Definition)中声明提供的资源类型,通过设置匹配规则,将不同的资源部署模板应用到不同类型的环境、项目等。与此同时,研发人员无需关注底层具体实现方式&…

CSS元素显示模式

CSS元素显示模式 定义&#xff1a;元素显示模式是指元素&#xff08;即标签&#xff09;以什么方式进行显示。 HTML元素分为块元素和行内元素 块元素 常见块元素 &#xff08;下列仅举出部分&#xff09; <h1>~<h6>、<p>、<div>、<ul>、<…

【数据分享】2008-2022年全国范围逐月NO2栅格数据(免费获取)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2022年全国范围逐月的PM2.5栅格数据、2013-2022年全国范围逐月SO2栅格数据、2013-2022年全国范围逐月CO栅格数据和2000-2022年全国范围逐月PM10栅格数据&#xff08;可查看之前的文章获悉详…

properties文件和yml文件的区别以及文件优先级

properties文件和yml文件的区别 yml是按照缩进关系&#xff0c;而properties用"."来表示关系springboot默认生成的是properties文件当properties文件和yml文件都存在时&#xff0c;properties文件的优先级更高。 properties文件的样式 yml文件的样式 文件优先级 r…

Shell常用脚本:hadoop集群启动、停止、重启脚本

脚本内容以我搭建的hadoop集群为例&#xff0c;你们自用的时候自行根据你们的情况进行修改即可 hadoop-cluster-manager.sh #!/bin/bash # 1. 调用此脚本前&#xff0c;请使用ssh-keygen -t rsa、ssh-copy-id -f 目标机器这两个命令使得目标机器是免密登录的 # 2. ssh远程执行…

第五篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas在教育数据和研究数据处理领域的应用

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas 在教育和学术研究中的常见应用介绍二、数据清洗和预处理示例代码三、数据分析和统计示例代码四、数据可视化示例代码五、时间序列分析示例代码六、数据导入和导出示例代码七、数…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的障碍物检测系统(深度学习代码+UI界面+训练数据集)

摘要&#xff1a;开发障碍物检测系统对于道路安全性具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个障碍物检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型间的性能…

JavaParser的快速介绍

开发的工作主要是写代码&#xff0c; 有考虑过使用代码写代码&#xff0c; 使用代码分析和改进代码吗&#xff1f; JavaParser 就可以帮你用来处理Java 代码的这些功能。 Java Parser 的介绍 Java Parser是一个用于解析和分析Java源代码的开源工具。它提供了一个API接口&…

Tomcat Nginx的动静分离

1.单机反向代理&#xff1a; 实验&#xff1a;7-3 做客户机&#xff0c;7-2做代理服务器&#xff0c;7-1 tomcat 服务器 数据传输从7-3到7-2到7-1 配置&#xff1a; 7-1为之前的虚拟机配置 7-2做代理服务器配置&#xff1a; 7-3客户机配置&#xff1a; 测试&#xff1a; 2…

3.自定义工程目录配置CMakeLists

问题背景 熟悉stm32keil开发的都知道&#xff0c;我们在编写不同的外设时&#xff0c;通常都会单独编写一个app文件夹或者是user文件夹之类的来存放不同外设功能的源文件和头文件。 在前面一节2.构建第一个工程并烧录到ESP32开发板-CSDN博客中&#xff0c;我们是使用了一个乐鑫…

elementui el-table表格自动循环滚动【超详细图解】

效果如图 1. 当表格内容超出时&#xff0c;自动滚动&#xff0c;滚动到最后一条之后在从头滚动。 2. 鼠标移入表格中&#xff0c;停止滚动&#xff1b;移出后&#xff0c;继续滚动。 直接贴代码 <template><div><div class"app-container"><e…

AI智能分析网关V4将HTTP消息推送至安防监控视频汇聚EasyCVR平台的操作步骤

TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常…