pytorch实现深度神经网络DNN与卷积神经网络CNN

DNN概述

深度神经网络DNN来自人脑神经元工作的原理,通过在计算机中逻辑抽象出多个节点,接收处理并向后传递信息,实现计算机的自我学习,类比结构见下图:
DNN网络结构与神经元
该方法通过预测输出与实际值的差异不断调整节点参数,从而一步步调整整体预测效果,节点预测输出的过程称为前向传播,根据差异调整参数的过程称为反向传播,而又因为节点计算公式y=wx+b为线性的,如果每个节点都向后传递该值,那最终的输出也可以表示为wx+b,故要体现每个节点的特殊性,需要引入非线性处理,即激活函数,根据在该过程中对学习率步长的设置调整、更新参数依靠样本的选择等区别,产生了多种不同的优化算法

一般的机器学习流程如下图:
机器学习流程图

DNN网络训练

首先导入一般需要的包

import torch.nn as nn
import torch
import pandas as pd
import numpy as np

所有参数和模型的文档都可以在官网查看,查找前记得在选项中选择自己使用pytorch的版本:
选择pytorch版本

数据集导入

大致流程为:
1,使用pandas从文件中读取数据
2,将带标签的数据退化为数组,并转换类型
3,将数组转换为张量
4,数据搬到显卡上进行加速

代码分别如下:

df=pd.read_csv("文件路径")
arr=df.values.astype(np.float32)
ts=torch.tensor(arr)
ts=ts.to('cuda')

划分训练集与测试集

首先根据比例划分训练集与测试集大小,为了避免数据前后关联,最好打乱样本的顺序,然后分别按行读取样本到数据集集合中,代码如下:

tran_size=int(len(ts)*0.8) # 训练集大小,0.8为比例系数
test_size=len(ts)-tran_size # 测试集大小
ts=ts[torch.randperm(ts.size(0)),:] # 打乱数据
train_data=ts[:tran_size] # 训练集数据
test_data=ts[tran_size:] # 测试集数据

搭建网络

根据输入和输出特征搭建网络,需注意相邻网络的输入输出需对应,网络需继承nn.Module模块,继承后重写网络模型到初始化函数中,定义向前传播forward调用网络并返回预测,示例代码如下:

class DNN(nn.Module):def __init__(self):super(DNN, self).__init__() # 初始化父类self.network = nn.Sequential(nn.Linear(28*28, 512), # 第一层线性层nn.ReLU(), # 第一层激活函数nn.Linear(512, 1024), # 第二层线性层nn.Sigmoid(), # 第二层激活函数)def forward(self, x):x = self.network(x) # 第三层无激活函数return xDNN=DNN() # 创建网络对象实例

优化器算法

首先定义损失函数loss_fn,具体的选项见官方文档,然后设置学习速率learning_rateoptimizer优化器,通过torch.optim设置优化算法,示例代码如下:

loss_fn=nn.MSELoss()
learning_rate=0.001
optimizer=torch.optim.Adam(DNN.parameters(), lr=learning_rate)

训练网络

网络的训练往往要经过多次循环,所以通常先设置一个epochs循环次数,为了将学习成果可视化,一般也设置一个列表用于存储损失函数的变化过程,然后对数据的输入输出特征进行划分,将数据除最后一列的值作为输入,最后一列的值升级为二维作为输出,代码如下:

epochs=100
loss_list=[]x=train_data[: , : -1] # 取出所有行,除最后一列的所有列
y=train_data[: , -1].reshape((-1,1))   # 取出所有行,最后一列,升级为二维

最后在循环中计算前向传播预测值,使用损失函数计算损失,反向传播计算梯度,优化模型参数,最后清空梯度,示例代码如下:

for epoch in range(epochs):y_pred=DNN(x)loss=loss_fn(y_pred, y)loss.backward()         # 反向传播optimizer.step()        # 更新参数optimizer.zero_grad()   # 清空梯度缓存print(f"Epoch: {epoch}, Loss:{loss}")   # 打印当前epoch和损失值loss_list.append(loss.item())           # 将损失值添加到列表中

测试方法为:首先声明关闭梯度计算功能,将预测值与真实值进行比较,统计正确信息,示例代码如下:

with torch.no_grad(): # 关闭自动求导功能test_x=test_data[: , : -1]test_y=test_data[: , -1].reshape((-1,1))pred_y=DNN(test_x)

制作数据集DataSet

前面我们使用的是批量梯度下降,每次参数更新使用所有样本,为了提高训练效率,我们在实践中多使用小批量梯度下降,这要求我们分批加载数据,加上我们为了复用代码和更好地管理数据,数据集应该也使用框架管理起来,该功能可以借助DataSet实现。

我们的数据集必须继承DataSet类,同时要重写__init__加载数据集、__getitem__获取数据索引和__len__获取数总量方法,示例代码如下:

from torch.utils.data import Dataset, DataLoaderclass Data(Dataset):def __init__(self,filename):	# 根据文件路径加载数据集super(Data, self).__init__()df = pd.read_csv(filename)arr = df.values.astype(np.float32)ts = torch.tensor(arr)ts = ts.to('cuda')tran_size=int(len(ts)*0.8)ts=ts[torch.randperm(ts.size(0)),:]self.x=ts[:tran_size,:-1]self.y=ts[:tran_size,-1].reshape((-1,1))self.xlength=len(self.x)self.ylength=len(self.y)def __getitem__(self, index):return self.x[index], self.y[index]def __len__(self):return self.xlength,self.ylength

加载数据集时使用Data=Data("路径")创建数据集对象,train_size,test_size= len(dataset)读取文件长度,使用train_loader=DataLoader(dataset,batch_size=100,shuffle=True)test_loader=DataLoader(dataset,batch_size=100,shuffle=False)分别读取训练集和测试集,shuffle表示是否洗牌,训练集可用,测试集无需洗牌。

使用该方法加载数据集,训练测试时直接可用for (x,y) in train_loader循环,因为其中已经包含了两个元素,代码更简洁。

CNN卷积神经网络

该网络顺应机器学习的图像处理潮流而生,传统神经网络需要将图像展为一列,该方式会忽略图像原本二维排布时的关系,更不必说如今的彩色图像可能有多个通道,传统方法更无法处理,基于保留临近位置像素点关系的想法,产生了卷积神经网络。

卷积核

该方法本质上是神经网络的变形,只是其表现形式有所区别,原本的权重w变成了卷积核,图像像素与卷积核逐位相乘求和,再进行偏置计算,原本的激活函数此时变成了池化层pool,直观展示如下:
卷积神经网络
构建网络时使用nn.Conv2d(输入通道数,输出通道,卷积核大小,填充,步长)来添加卷积层,由于卷积核的数值也是训练的一部分,故无需手动设置,由随机初始化完成,使用示例如下:

model = nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),nn.ReLU())

其他卷积层见官方文档。

池化层

该层功能与激活函数类似,用于获取特征,比如选出最大值,求平均等操作,如nn.MaxPool1d(),详见官方文档,可惜是英文的,而且信息量太大,每个函数都值得学一会。

输出尺寸计算

此外为了使图像与卷积核大小相符,增加了填充padding,和卷积核的移动步长stride,现在整合所有参数,输入图像尺寸(H,W),卷积核大小(FH,FW),填充p,步幅s,输出图像大小(OH,OW)的计算方法如下:
行计算
列计算方法

滤波器

彩色图像等多通道时使用相应通道数的卷积核即可,但此时卷积核又有了新的名字——滤波器Filter,即输入数据与滤波器通道设置为相同的值时,输出仍为一维,输出时再使用滤波器,即可实现升维。

经典网络

LeNet-5
AlexNet
GoogLeNet
ResNet

答疑—清空梯度

上次模型构建我们讨论了反向传播的具体作用,这次我又对清空梯度这步有了疑问,每个epoch梯度清空,那是否i多次实验彼此独立,又如何收敛呢?经过查询得出如下结论。

首先重申,清空的是梯度,而非模型参数,pytorch默认使用的是梯度累加的方法,即多次训练的梯度累加计算,并允许手动清零,该方式允许硬件条件不允许的项目使用小的batch_size,多次循环累加梯度可以实现较好的效果,而我们手动清零后可以避免多个数据集对模型参数优化的影响,实现全新的二次训练。

总结

本次算是初学pytorch的第二次实践,对于一些方法和原理有了更进一步的理解:
清空梯度避免干扰,小批量时可不清空;
继承方法建立模型和数据集;
卷积核用于保存图像空间上的相邻关系,池化层选特征;
多通道用滤波器降维,学习后再升维。

至此觉得可以算是入门了,但仍然路漫漫,学习网络模型结构的搭建,各种优化算法和损失函数,池化操作,步长卷积核大小的设置,这些的工作才是大头,此外将深度学习与什么相结合,这更是关键。

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

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

相关文章

私域流量圈层在新消费时代的机遇与挑战:兼论开源 AI 智能名片、2 + 1 链动模式、S2B2C 商城小程序的应用

摘要:本文剖析了私域流量圈层在新消费时代呈现出的独特温度与信任优势,阐述了从传统销售到新消费转型中用户心理的变化。同时,强调了内容对于私域流量的关键作用,并分析开源 AI 智能名片、2 1 链动模式、S2B2C 商城小程序在私域流…

1.4 配置 Android 构建系统

Android 构建系统会编译应用资源和源代码,然后将它们打包成 APK 或 Android App Bundle 文件,供您测试、部署、签名和分发。 创建自定义 build 配置需要您对一个或多个 build 配置文件做出更改。这些纯文本文件使用领域特定语言 (DSL) 通过 Kotlin 脚本&…

containerd配置私有仓库registry

机器ip端口regtisry192.168.0.725000k8s-*-------k8s集群 1、镜像上传 rootadmin:~# docker push 192.168.0.72:5000/nginx:1.26.1-alpine The push refers to repository [192.168.0.72:5000/nginx] 6961f0b8531c: Pushed 3112cd521249: Pushed d3f50ce9b5b5: Pushed 9efaf2eb…

ABAP:SET CURSOR FIELD设置鼠标焦点

SET CURSOR FIELD <字段名>&#xff1a;设置鼠标焦点到该字段 SET CURSOR 设置到鼠标焦点列还是行 SET CURSOR LINE 设置鼠标焦点到行 GET CURSOR field <字段名> &#xff1a;这个相对应的获取鼠标焦点得到的字段

PHP和Python脚本的性能监测方案

目录 1. 说明 2. PHP脚本性能监测方案 2.1 安装xdebug 2.2 配置xdebug.ini 2.3 命令行与VS Code中使用 - 命令行 - VS Code 2.4 QCacheGrind 浏览 3. Python脚本性能监测方案 3.1 命令行 4. 工具 5.参考 1. 说明 获取我们的脚本程序运行时的指标&#xff0c;对分析…

VS code 远程连接到docker容器

1.需要在vscode中下载remote 、docker、dev container插件。 如下图&#xff1a; 有小鲸鱼标志&#xff0c;说明已经成功。 右键可以运行或者停止容器运行

阿里1688 阿里滑块 231滑块 x5sec分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

Spring Validation数据校检

文章目录 Spring Validation1 关于Spring Validation2 使用流程3 快速入门4 运行异常处理4.1 说明4.2 处理异常4.3 明确提示消息 5 常用注解5.1 NotNull注解5.2 NotEmpty 注解5.3 NotBlank 注解5.4 Size 注解5.5 Range 注解 6 非POJO参数校验6.1 使用流程6.2 使用示例 Spring V…

‌STAR法则

一&#xff1a;STAR法则 STAR法则是一种简单而实用的表现技巧&#xff0c;常被用于求职过程中的个人经历描述&#xff0c;富有条理性&#xff0c;可以帮助你在职场中脱颖而出。“STAR”分别对应的是situation-task-action-result&#xff0c;通过情境、目标、行动和结果四个方面…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…

国标GB28181设备管理软件EasyGBS国标GB28181视频平台:GB/T28181中的流类型

在当今的视频监控领域&#xff0c;GB/T28181协议作为中国国家标准委员会发布的重要技术规范&#xff0c;发挥着举足轻重的作用。这一标准不仅为视频监控系统的设备接入、视频流传输、设备控制等功能提供了明确的技术指导&#xff0c;还极大地促进了不同厂家设备之间的兼容性和互…

使用pip安装项目时,遇到以下错误的解决方案:error: [Errno 13] Permission denied

我是在虚拟环境下出现了这个错误 出现这种情况大概率是conda环境没有下载用户路径下的python解释器&#xff0c;你可以使用下面命令来检查 which python3这里如果出现的路径不是你用户目录下的&#xff0c;就是这个原因&#xff0c;你的conda环境在用户目录下&#xff0c;但是…

无人车之定位技术篇

无人车的定位技术是指确定无人车在世界坐标系&#xff08;一般指二维环境&#xff09;中的位置及其本身的姿态的技术。随着技术的不断发展&#xff0c;无人车的定位技术已经实现了多种方法的融合与创新。 一、主要定位技术 GPS定位 原理&#xff1a;基于全球定位系统&#x…

微观经济学速成笔记

需求的收入弹性 需求的收入弹性表示在一定的时期内消费者对某种商品的需求量的变动对于消费者收入量变动的反应程度,供给的收入弹性公式为: 永非证可eM或w-此公-可 根据商品的需求和收入弹性公式&#xff0c;可以将商品分类: em < 0的商品为劣等品(也称低档品)&#xff0c;因…

泷羽sec学习打卡-Windows基础命令2总结篇

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于windows的那些事儿-Base2 一、Windows-Base2常见的协议和端口常用的cmd命令渗透写入文件的思路&…

面经—科大讯飞

1extern c 修饰才能使用c在c中 new delete 可以自动判断分配多少空间 形成多态的两个条件&#xff0c;1.继承关系

软考教材重点内容 信息安全工程师 第1章 网络信息安全概述

第 1 章 网络信息安全概述 1.1.1 网络信息安全相关概念 狭义上的网络信息安全特指网络信息系统的各组成要素符合安全属性的要求&#xff0c;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

【51单片机】I2C总线详解 + AT24C02

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 AT24C02介绍存储器 I2C总线介绍I2C时序结构数据帧AT24C02数据帧 编程实例 —— 按键控制数据大小&存储器写入读出 AT24C02介绍 …

全球海工供应链,中国建造!第十一届全球FPSOFLNGFSRU大会在上海隆重召开

10月30日-31日&#xff0c;全球海洋工程与高端装备领域的年度国际交流盛会——第十一届全球FPSO&FLNG&FSRU大会暨海上能源全产业链博览会在上海隆重召开&#xff0c;同期举办第七届亚洲海洋风能大会。本次大会暨博览会由上海船舶工业行业协会、上海市工业合作协会、决策…

Linux网络编程——网络字节序和IP地址详解

一、网络字节序 1、大端模式和小端模式 字节序是指多字节数据的存储顺序&#xff0c;在设计计算机系统的时候&#xff0c;有两种处理内存中数据的方法&#xff1a;大端格式、小端格式。 小端格式(Little-Endian)&#xff1a;将低位字节数据存储在低地址&#xff1b; 大端格式(…