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

5.13学习日志

Pytorch 神经网络基础

1.模型构造

1》层和块

块可以描述单个层,由多个层组成的组件或者模型本身

块由类表示,类的任何子类都必须定义一个将其输入转换为输出的前向传播函数。为了计算梯度,块必须具有反向传播函数

自定义块:

顺序块:

import  torch
from torch import nn#输入
X=torch.rand(2,20)#顺序块
class MySequential(nn.Module):def __init__(self,*args):#*args是收集参数,相当于把若干个参数打包成一个来传入super().__init__()#调用父类的__init__函数for idx, block in enumerate(args):#遍历传入的神经网络层,并将它们以字符串索引作为键存储在 MySequential 实例的 _modules 属性中self._modules[str(idx)] = block#在模型参数初始化过程中,系统直到在_modules字典中查找需要初始化参数的子块def forward(self,X):for block in self._modules.values():#遍历 _modules 中的每个神经网络层X = block(X)#将当前层的输出作为下一层输入return Xnet=MySequential(nn.Linear(20,256),nn.ReLU(),nn.Linear(256,10))
a=net(X)print(a)

在前向传播函数中执行代码

当sequential函数过于简单没法满足需求,可以在init和forward函数里进行自定义运算,继承nn.Module比继承Sequential更灵活的定义参数,和进行前向运算

import  torch
from torch import nn
from torch.nn import functional as FX=torch.rand(2,20)class FixedHiddenMLP(nn.Module):def __init__(self):super().__init__()self.rand_weight = torch.rand((20,20),requires_grad=False)#随机生成一组权重常数,不参与反向传播梯度更新self.linear=nn.Linear(20,20)def forward(self,X):X = self.linear(X)X = F.relu(torch.mm(X,self.rand_weight)+1)#将输入X与权重相乘X = self.linear(X)while X.abs().sum()>1:#取绝对值之和X /= 2#使用 while 循环,如果输出张量的绝对值之和大于 1,则将输出张量除以 2,直到满足条件为止。这个操作可以视为一种归一化或缩放操作,以控制输出的数值范围return X.sum()net = FixedHiddenMLP()
a = net(X)
print(a)

嵌套使用Module 的子类

嵌套体现在两个方面:

  1. NestMLP 类内部的 self.net 和 self.linear 形成了一个嵌套的子模块结构。

chimera 模块通过组合 NestMLP、线性层和 FixedHiddenMLP,形成了一个嵌套的计算流程。

import  torch
from torch import nn
from torch.nn import functional as FX=torch.rand(2,20)class FixedHiddenMLP(nn.Module):def __init__(self):super().__init__()self.rand_weight = torch.rand((20,20),requires_grad=False)#随机生成一组权重常数,不参与反向传播梯度更新self.linear=nn.Linear(20,20)def forward(self,X):X = self.linear(X)X = F.relu(torch.mm(X,self.rand_weight)+1)#将输入X与权重相乘X = self.linear(X)while X.abs().sum()>1:#取绝对值之和X /= 2#使用 while 循环,如果输出张量的绝对值之和大于 1,则将输出张量除以 2,直到满足条件为止。这个操作可以视为一种归一化或缩放操作,以控制输出的数值范围return X.sum()class NestMLP(nn.Module):def __init__(self):super().__init__()self.net = nn.Sequential(nn.Linear(20,64),nn.ReLU(),nn.Linear(64,32),nn.ReLU())self.linear = nn.Linear(32,16)def forward(self,X):return self.linear(self.net(X))chimera = nn.Sequential(NestMLP(),nn.Linear(16,20),FixedHiddenMLP())
chimera(X)

2.参数管理

参数访问:
import torch
from torch import nn
from torch.nn import functional as Fnet = nn.Sequential(nn.Linear(4,8),nn.ReLU(),nn.Linear(8,1))
X = torch.rand(size=(2,4))
net(X)print(net[2].state_dict())#检查第二个全连接层即Linear(8,1)的参数
#OrderedDict([('weight', tensor([[ 0.2360,  0.1646,  0.0861,  0.0126, -0.0548,  0.1074,  0.0612, -0.1232]])), ('bias', tensor([-0.1082]))])
访问目标参数
print(type(net[2].bias))#访问第二个全连接层的偏移的类型
print(net[2].bias)#访问第二个全连接层的偏移
print(net[2].bias.data)#访问第二个全连接层的偏移的数值
'''<class 'torch.nn.parameter.Parameter'>
Parameter containing:
tensor([0.3516], requires_grad=True)
tensor([0.3516])'''print(net[2].weight.grad == None)#访问参数梯度,由于还没有开始反向传播,因此参数的梯度处于初始状态
#True
一次性访问所有参数
print(*[(name,param.shape)for name, param in net[0].named_parameters()])
#('weight', torch.Size([8, 4])) ('bias', torch.Size([8]))
print(*[(name,param.shape)for name, param in net.named_parameters()])
#('0.weight', torch.Size([8, 4])) ('0.bias', torch.Size([8])) ('2.weight', torch.Size([1, 8])) ('2.bias', torch.Size([1]))
从嵌套块收集参数
import torch
from torch import nn
from torch.nn import functional as FX=torch.rand(2,4)def block1():return nn.Sequential(nn.Linear(4,8),nn.ReLU(),nn.Linear(8,4),nn.ReLU())def block2():net = nn.Sequential()#创建一个空的 nn.Sequential 容器,用于按顺序组合多个 block1 模块for i in range(4):#嵌套net.add_module(f'block{i}',block1())#将四个block1()组合起来,用add_module的好处是可以传一个字符串的名字return(net)rgnet = nn.Sequential(block2(),nn.Linear(4,1))
output = rgnet(X)
print(output)
print(rgnet)

显示嵌套结构

Sequential((0): Sequential((block0): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block1): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block2): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block3): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU()))(1): Linear(in_features=4, out_features=1, bias=True)
)

按照以上结构,可以分层访问特定参数

print(rgnet[0][1][0].bias.data)#表示第二个 block1 模块中的第一个子模块,即第一个线性层的偏置参数
#tensor([-0.1861, -0.0683,  0.3388, -0.4251, -0.3339,  0.2232, -0.1247,  0.0476])
参数初始化:
内置初始化
def init_normal(m):if type(m) == nn.Linear:#检查传入的模块 m 的类型是否为全连接层nn.init.normal_(m.weight,mean=0,std=0.01)#权重参数初始化为均值为0,标准差为0.01的正态分布#或者初始化为1#nn.init.constant_(m.weight,1)nn.init.zeros_(m.bias)#偏置参数初始化为0net.apply(init_normal)#递归地遍历 net 的每个子模块,对于每个子模块,调用 init_normal 函数。

同样可以对不同的神经网络层使用不同的初始化方法:

net[0].apply()

net[2].apply()

自定义初始化
def my_init(m):if type(m) == nn.Linear:print("Init",*[(name,param.shape) for name,param in m.named_parameters()][0])nn.init.uniform_(m.weight,-10,10)#将该层的权重参数初始化为均匀分布,范围为 [-10, 10]m.weight.data *= m.weight.data.abs()>=5#将权重参数中绝对值小于 5 的元素设置为 0
net.apply(my_init)#将 my_init 函数应用于网络 net 的每个子模块
net[0].weight[:2]#[:2] 表示对权重参数进行切片操作,选取前两行
可以直接设置参数
net[0].weight.data[:]+=1
net[0].weight.data[0,0] = 42
net[0].weight.data[0]
 参数绑定:

多个层间共享参数

shared = nn.Linear(8,8)
net = nn.Sequential(nn.Linear(4,8),nn.ReLU(),shared,nn.ReLU(),shared,nn.ReLU(),nn.Linear())
#第二个层和第四个层是相同的

3.自定义层

和自定义块相似,只需要继承层类并实现前向传播功能

不带参数的层:
import torch
from torch import nn
from torch.nn import functional as FX=torch.FloatTensor([1,2,3,4,5])
class CenteredLayer(nn.Module):def __init__(self):super().__init__()def forward(self,X):return X-X.mean()#输入减均值,将均值变为0layer = CenteredLayer()
a=layer(X)
print(a)
#tensor([-2., -1.,  0.,  1.,  2.])
#将自定义层作为组件合并到网络中
net = nn.Sequential(nn.Linear(8,128),CenteredLayer())
带参数的层:
class MyLinear(nn.Module):def __init__(self,in_units,units):#in_units是输入,units是输出super().__init__()self.weight = nn.Parameter(torch.randn(in_units,units))# torch.randn 函数生成一个服从标准正态分布的随机张量,形状为(in_units, units)self.bias = nn.Parameter(torch.randn(units,))#生成一个服从标准正态分布的随机向量,形状为(units,)def forward(self,X):linear = torch.matmul(X,self.weight.data)+self.bias.data#使用 torch.matmul对输入 X 和权重参数 self.weight.data 进行矩阵乘法运算#.data 属性访问权重参数的原始数据return F.relu(linear)#将线性输出传递给 ReLU 激活函数 F.reludense = MyLinear(5,3)
print(dense.weight)
'''tensor([[ 0.1203,  1.2635, -0.7978],[-1.4768,  1.0113, -0.8263],[-0.1474,  0.9414, -1.6847],[-1.4617,  0.7734, -1.3046],[-0.7199, -0.7151,  0.8831]], requires_grad=True)'''

4.读写文件

加载和保存张量:

对于单个张量,直接调用load和save函数分别读写

x=torch.arange(4)

torch.save(x,'x-file')

torch.load('x-file')

可以存储一个张量列表,把它们读回内存

x=torch.arange(4)
y= torch.zeros(4)
torch.save([x,y],'x-files')
x2,y2=torch.load('x-files')
print(x2,y2)#tensor([0, 1, 2, 3]) tensor([0., 0., 0., 0.])

将x,y存入字典,写入读取

x=torch.arange(4)
y= torch.zeros(4)
mydict={'x':x,'y':y}torch.save(mydict,'mydict')
mydict2=torch.load('mydict')
print(mydict2)
#{'x': tensor([0, 1, 2, 3]), 'y': tensor([0., 0., 0., 0.])}
加载和保存模型参数:
torch.save(net.state_dict(),'mil.params')
#为了恢复模型,先实例化原始模型,直接读取文件中存储的模型参数
clone=MLP()
clone.load_state_dict(torch.load('mlp.params'))
#开启评估模式clone.eval()

相关文章:

5.13学习日志

Pytorch 神经网络基础 1.模型构造 1》层和块 块可以描述单个层&#xff0c;由多个层组成的组件或者模型本身 块由类表示&#xff0c;类的任何子类都必须定义一个将其输入转换为输出的前向传播函数。为了计算梯度&#xff0c;块必须具有反向传播函数 自定义块&#xff1a; …...

8种常见的CMD命令

1.怎么打开CMD窗口 步骤1&#xff1a;winr 步骤2&#xff1a;在弹出的窗口输入cmd&#xff0c;然后点击确认&#xff0c;就会出现一个cmd的窗口 2.CMD的8种常见命令 2.1盘符名称冒号 说明&#xff1a;切换盘的路径 打开CMD窗口这里默认的是C盘的Users的27823路径底下&#xf…...

版本控制工具之Git的基础使用教程

Git Git是一个分布式版本控制系统&#xff0c;由Linux之父Linus Torvalds 开发。它既可以用来管理和追踪计算机文件的变化&#xff0c;也是开发者协作编写代码的工具。 本文将介绍 Git 的基础原理、用法、操作等内容。 一、基础概念 1.1 版本控制系统 版本控制系统&#x…...

五子棋对战(网页版)

目录 一、项目背景 用户模块 匹配模块 对战模块 二、核心技术 三、相关知识 WebSocket 原理 报文格式 代码 服务器代码 客户端代码 四、项目创建 4.1、实现用户模块 编写数据库代码 数据库设计 配置MyBatis 创建实体类 创建UserMapper 创建UserMapper接口 实现UserMapper.xml 前…...

在 Ubuntu系统中,可以使用以下几种方法查看网络速率

1 使用终端命令&#xff1a;可以使用ifconfig命令查看网络接口的信息&#xff0c;包括网络接口名称、IP地址、子网掩码等。也可以使用nload命令查看网络流量和传输速率。 2 使用网络监控工具&#xff1a;例如nethogs&#xff0c;可以更加直观地查看网络吞吐量。 3 使用网络测…...

这是摆脱困境的最好方法

20多年前&#xff0c;我开始涉足创业&#xff0c;经历过的那种停滞感我都记不清了。这是这条职业道路上最常见的挣扎之一&#xff0c;而且很难摆脱。 卡住的城市是一个地方&#xff0c;任何有创造力的&#xff0c;自由职业者和好奇的人经常去。这是一个很难逃离的地方。 被困…...

OceanBase 中的ROWID与Oracle的差异与如何迁移

1. ROWID 1.1 OB和Oracle中rowid的区别 正如大家所知道的&#xff0c;OceanBase兼容Oracle的rowid特性&#xff0c;但在其生成规则上却存在不同&#xff0c;具体表现如下&#xff1a; OceanBase ● 定义&#xff1a;OceanBase&#xff08;简称 OB&#xff09;的rowid是通过…...

秋招后端开发面试题 - JVM运行时数据区

目录 运行时数据区前言面试题JVM 内存区域 / 运行时数据区&#xff1f;说一下 JDK1.6、1.7、1.8 内存区域的变化&#xff1f;为什么使用元空间替代永久代作为方法区的实现&#xff1f;Java 堆的内存分区了解吗&#xff1f;运行时常量池&#xff1f;字符串常量池了解吗&#xff…...

【YOLOv8改进[Backbone]】使用SCINet改进YOLOv8在黑暗环境的目标检测效果

目录 一 SCINet 1 本文方法 ① 权重共享的照明学习 ② 自校准模块 ③ 无监督训练损失 二 使用SCINet助力YOLOv8在黑暗环境的目标检测效果 1 整体修改 2 配置文件 3 训练 其他 一 SCINet 官方论文地址&#xff1a;https://arxiv.org/pdf/2204.10137 官方代码地址&…...

ASE docker related research

ASE 2022 Understanding and Predicting Docker Build Duration: An Empirical Study of Containerized Workflow of OSS Projects 理解和预测 Docker 构建持续时间&#xff1a;OSS 项目容器化工作流程的实证研究 Docker 构建是容器化工作流程的关键组成部分&#xff0c;它…...

maven .lastUpdated文件作用

现象 有时候我在用maven管理项目时会发现有些依赖报错&#xff0c;这时你可以看一下本地仓库中是否有.lastUpdated文件&#xff0c;也许与它有关。 原因 有这个文件就表示依赖下载过程中发生了错误导致依赖没成功下载&#xff0c;可能是网络原因&#xff0c;也有可能是远程…...

gtest的编译与使用

文章目录 gtest的编译与使用概述笔记CMake参数官方文档测试程序测试效果END gtest的编译与使用 概述 gTest是 googletest的缩写&#xff0c;如果直接找gTest项目&#xff0c;是找不到的。 库地址 https://github.com/google/googletest.git 迁出到本地后&#xff0c;切到最新…...

【 npm详解:从入门到精通】

文章目录 npm详解&#xff1a;从入门到精通1. [npm](https://www.npmjs.com/)的安装2. npm的基础用法2.1 初始化项目2.2 安装依赖2.3 卸载依赖2.4 更新依赖 3. npm的高级用法3.1 运行脚本3.2 使用npm scope3.3 使用npm link 4. npm资源5. 使用npm进行依赖树分析和可视化6. npm进…...

【Web后端】实现文件上传

表单必须使用post提交 ,enctype 必须是multipart/form-data在Servlet上填加注解 MultipartConfiglocation &#xff1a;默认情况下将存储文件的目录&#xff0c;默认值为“”。maxFileSize &#xff1a;允许上传文件的最大大小&#xff0c;其值以字节为单位。 默认值为-1L表示无…...

react 逻辑 AND 运算符 ()

在 React 组件中&#xff0c;当你想在条件为 true 时渲染一些 JSX 时&#xff0c;它经常会出现&#xff0c;或者什么都不渲染。使用 &#xff0c;只有在以下情况下才能有条件地呈现复选标记&#xff1a;&&isPackedtrue return (<li className"item">{…...

Redis详解(二)

事务 什么是事务&#xff1f; 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作&#xff1a;事务中的命令要么全部被执行&#xff0c;要么全部都…...

嵌入式:基于STM32的智能家居照明控制系统

在智能家居系统中&#xff0c;自动照明控制不仅提高了居住舒适度&#xff0c;还有助于节能减排。本教程旨在引导读者通过使用STM32微控制器来开发一个智能照明控制系统。该系统能够根据环境光线自动调整室内照明的亮度&#xff0c;并支持通过简单的用户界面手动控制光线。 一、…...

三种基本排序-冒泡,选择,二分

闲话不多说&#xff0c;直接上代码&#xff0c;简明易懂&#xff0c;条理清晰&#xff0c;交互性强&#xff0c;尽善尽美 码住&#xff0c;建议copy下来&#xff1a; 先上二分法吧&#xff0c;稍复杂点的&#xff0c;代码多一些&#xff0c;用了函数调用 二分排序&#xff1…...

windows查找重复的物理地址

单独查询所有物理&#xff08;mac&#xff09;地址&#xff08;cmd执行&#xff09;&#xff1a;arp -a 查找同一局域网下重复的mac&#xff0c;打开power shell执行以下命令&#xff1a; Get-NetNeighbor | Where-Object { $_.State -eq "Reachable" } | Select-O…...

linux进阶高级配置,你需要知道的有哪些(8)-shell脚本应用(三)

1、for循环语句的结构&#xff1a; for 变量名 in 取值列表 do 命令序列 done 2、while循环语句结构&#xff1a; while 条件测试 do 命令序列 done 3、for和while的区别 for:控制循环来自于取值列表 while&#xff1a;控制循环来自于条件测试 4、case语句的…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起&#xff0c;为了跨网段推流&#xff0c;千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...

codeforces C. Cool Partition

目录 题目简述&#xff1a; 思路&#xff1a; 总代码&#xff1a; https://codeforces.com/contest/2117/problem/C 题目简述&#xff1a; 给定一个整数数组&#xff0c;现要求你对数组进行分割&#xff0c;但需满足条件&#xff1a;前一个子数组中的值必须在后一个子数组中…...