首页 > 其他分享 >深度学习计算

深度学习计算

时间:2024-07-28 17:55:30浏览次数:12  
标签:weight nn torch 学习 init 计算 深度 net data

一.参数访问

我们以多层感知机为例

import torch
from torch import nn

net = 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())

结果:

就是把参数名称和参数的值都列出来了

1.1提取参数

print(type(net[2].bias))
print(net[2].bias)
print(net[2].bias.data)

bias代表偏置

想只提取数值就用.data

net.state_dict()['2.bias'].data

也可以指定名字来去提取参数

1.2一次性提取全部参数

print(*[(name, param.shape) for name, param in net[0].named_parameters()])
print(*[(name, param.shape) for name, param in net.named_parameters()])

我们发现这个提取的时候也可以指定第几层

上面的是无*的,下面是有*的

解包操作:解包(unpacking)是指将一个可迭代对象(如列表、元组、字典等)中的元素赋值给多个变量的过程

*   迭代器解包操作,也称之为序列拆分操作符

** 字典解包操作,也称之为映射拆分操作。作为关键字参数传递给函数。

使用 *和 ** 的解包的好处是能节省代码量,使得代码看起来更优雅

在字典中*

只会返回key

**会返回value

1.3嵌套快提取参数

def block1():
    return nn.Sequential(nn.Linear(4, 8), nn.ReLU(),
                         nn.Linear(8, 4), nn.ReLU())

def block2():
    net = nn.Sequential()
    for i in range(4):
        # 在这里嵌套
        net.add_module(f'block {i}', block1())
    return net

rgnet = nn.Sequential(block2(), nn.Linear(4, 1))
rgnet(X)
print(rgnet)

第一大块就是block2(),我们访问第一大快第一小块第一层的偏置值

二.参数初始化

2.1内置初始化

def init_normal(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, mean=0, std=0.01)
        nn.init.zeros_(m.bias)
net.apply(init_normal)
net[0].weight.data[0], net[0].bias.data[0]

就像我们之前学的normal一样

可以体会一下

然后是指定参数

def init_constant(m):
    if type(m) == nn.Linear:
        nn.init.constant_(m.weight, 1)
        nn.init.zeros_(m.bias)
net.apply(init_constant)
net[0].weight.data[0], net[0].bias.data[0]

此时weight就为1了

当然我们也可以不同的神经层应用不同的初始化

def init_xavier(m):
    if type(m) == nn.Linear:
        nn.init.xavier_uniform_(m.weight)
def init_42(m):
    if type(m) == nn.Linear:
        nn.init.constant_(m.weight, 42)

net[0].apply(init_xavier)
net[2].apply(init_42)
print(net[0].weight.data[0])
print(net[2].weight.data)

第一层用的xavier初始化,第三层用的指定w

2.2自定义初始化

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的都归零

net.apply(my_init)
net[0].weight[:2]

2.3参数绑定

# 我们需要给共享层一个名称,以便可以引用它的参数
shared = nn.Linear(8, 8)
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(),
                    shared, nn.ReLU(),
                    shared, nn.ReLU(),
                    nn.Linear(8, 1))
net(X)
# 检查参数是否相同
print(net[2].weight.data[0] == net[4].weight.data[0])
net[2].weight.data[0, 0] = 100
# 确保它们实际上是同一个对象,而不只是有相同的值
print(net[2].weight.data[0] == net[4].weight.data[0])

由于模型参数包含梯度,因此在反向传播期间第二个隐藏层 (即第三个神经网络层)和第三个隐藏层(即第五个神经网络层)的梯度会加在一起。

 主要包括

自定义层,读写文件和GPU

三.自定义层

不含参数

import torch
import torch.nn.functional as F
from torch import nn


class CenteredLayer(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, X):
        return X - X.mean()
layer = CenteredLayer()
layer(torch.FloatTensor([1, 2, 3, 4, 5]))
net = nn.Sequential(nn.Linear(8, 128), CenteredLayer())
Y = net(torch.rand(4, 8))
Y.mean()

含参数

class MyLinear(nn.Module):
    def __init__(self, in_units, units):
        super().__init__()
        self.weight = nn.Parameter(torch.randn(in_units, units))
        self.bias = nn.Parameter(torch.randn(units,))
    def forward(self, X):
        linear = torch.matmul(X, self.weight.data) + self.bias.data
        return F.relu(linear)
linear = MyLinear(5, 3)
linear.weight
linear(torch.rand(2, 5))
net = nn.Sequential(MyLinear(64, 8), MyLinear(8, 1))
net(torch.rand(2, 64))

含参数的在init初始化的时候用Parameter

在PyTorch中,nn.Parameter 是一个特殊的类,用于封装Tensor,以便将其注册为模块(Module)的参数。当一个Tensor被封装为 nn.Parameter 后,它会自动被添加到模块的参数列表中(即,模块的 .parameters() 方法会返回这个Tensor),这样PyTorch的自动求导系统(Autograd)和优化器(Optimizer)就可以跟踪并更新这个Tensor的值了

四.读写文件

为什么要保存?

我们希望保存训练的模型, 以备将来在各种环境中使用(比如在部署中进行预测)。 此外,当运行一个耗时较长的训练过程时, 最佳的做法是定期保存中间结果, 以确保在服务器电源被不小心断掉时,我们不会损失几天的计算结果。 因此,现在是时候学习如何加载和存储权重向量和整个模型了

加载和保存张量

用到的主要函数

torch.save 是 PyTorch 中的一个函数,用于保存模型或张量(Tensor)到磁盘上。这个函数非常灵活,可以保存几乎任何 Python 对象,但最常用于保存 PyTorch 的模型、张量、字典等。保存的对象可以随后通过 torch.load 函数加载回来

import torch
from torch import nn
from torch.nn import functional as F

x = torch.arange(4)
torch.save(x, 'x-file')

x2 = torch.load('x-file')
x2
y = torch.zeros(4)
torch.save([x, y],'x-files')
x2, y2 = torch.load('x-files')
(x2, y2)

mydict = {'x': x, 'y': y}
torch.save(mydict, 'mydict')
mydict2 = torch.load('mydict')
mydict2

单个元素,列表和字典都可以用sava读取到磁盘中,load再回到内存中

加载和保存模型参数

class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.hidden = nn.Linear(20, 256)
        self.output = nn.Linear(256, 10)

    def forward(self, x):
        return self.output(F.relu(self.hidden(x)))

net = MLP()
X = torch.randn(size=(2, 20))
Y = net(X)

torch.save(net.state_dict(), 'mlp.params')

clone = MLP()
clone.load_state_dict(torch.load('mlp.params'))
clone.eval()

Y_clone = clone(X)
Y_clone == Y

我们会发现用state_dict来展示全部信息

torch.load只是把数据加载了,而load_state_dict是按照字典的模式去读取到模型里

五.GPU

GPU存储张量

X = torch.ones(2, 3, device=try_gpu())

然后就是在第二个gpu上进行创建张量

Y = torch.rand(2, 3, device=try_gpu(1))

这个时候x与y不在同一个GPU里面

所以实现x+y时先复制到同一个gpu里面

Z = X.cuda(1)

然后再Z+Y

net = nn.Sequential(nn.Linear(3, 1))
net = net.to(device=try_gpu())

net[0].weight.data.device

上面的代码就是指定参数存放在gpu里面

标签:weight,nn,torch,学习,init,计算,深度,net,data
From: https://blog.csdn.net/Q268191051011/article/details/140747527

相关文章

  • django学习入门系列之第五点《javascript的条件语句和函数》
    文章目录5.6条件语句5.7函数往期回顾5.6条件语句if(){}elseif(){}5.7函数#python中函数定义的格式deffunc{函数的内容}#使用函数func()//javascript函数中的内容functionfunc(){函数的内容}//使用函数func()往......
  • ssy暑假集训暴力算法学习笔记
    7.28集训第六天今天t大学的学长peop1e来给我们讲课啦!人好帅呀嘿嘿嘿....内容如下模拟退火:定义模拟退火可以分成两个部分,一个是"模拟",一个是"退火",先介绍什么叫退火,贴一张百度百科的图吧:\(\\\)那这"退火"的定义有啥用吗?模拟退火就是用来模拟整个退火的过程(其实没啥相似......
  • 加州大学伯克利分校等发表的RouteLLM:利用偏好数据学习路由大语言模型
    加州大学伯克利分校等发表的RouteLLM:利用偏好数据学习路由大语言模型原创 无影寺 AI帝国 2024年07月18日08:03 广东一、结论写在前面论文标题:RouteLLM:LearningtoRouteLLMswithPreferenceData论文链接:https://arxiv.org/pdf/2406.18665v2LLM在广泛的任务中......
  • PV、UV、VV、IP含义及计算方式
    什么是PV?PV即PageView,网站浏览量,指页面浏览的次数,用以衡量网站用户访问的网页数量。用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计。一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者通过不断的刷新页面,也可以制造出非......
  • 计算机视觉 yolo
    我们如何构建一个消耗很少资源在移动设备上运行的对象识别模型?我使用了Moodle,但它没有提供很好的准确性我尝试过yolo算法,但速度很慢我还想在RaspberryPi上运行这个模型,并且我希望它也能识别远处的物体,而不仅仅是附近的物体说对了,要在资源有限的设备(如手机和树莓......
  • AI智能名片小程序在预测性产品管理与营销中的深度应用探索
    摘要:本文深入探讨了AI智能名片小程序在预测性产品管理与营销中的广泛应用及其带来的深远影响。通过详细分析该技术在数据收集、市场分析、用户画像构建、个性化推荐、客户关系管理以及风险预测等方面的具体实践,本文揭示了AI智能名片小程序如何助力企业实现精准决策、优化资源配......
  • 去中心化交易所DEX学习路径
    学习使用Uniswap及其他类似的去中心化交易所(DEX)可以分为几个阶段,从基础知识到高级应用。以下是一个详细的学习路径和一些资源,帮助你深入了解Uniswap和DEX。1.基础知识学习区块链和智能合约区块链基础:了解区块链的工作原理,如区块、链、共识算法等。推荐资源:Blockch......
  • Fiddler学习】Fiddler教程,比较经典全面(转)
    https://github.com/gabrielxvx/zh-fiddler  简介Fiddler(中文名称:小提琴)是一个HTTP的调试代理,以代理服务器的方式,监听系统的Http网络数据流动,Fiddler可以也可以让你检查所有的HTTP通讯,设置断点,以及Fiddle所有的“进出”的数据(我一般用来抓包),Fiddler还包含一个简单却功能强......
  • 【学习笔记】Matlab和python双语言的学习(熵权法)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、熵权法的基本概念二、熵权法的基本步骤1、构建决策矩阵2、数据标准化3、计算指标的比重4、计算信息熵5、计算权重6、计算综合得分三、代码实现----Matlab四、代码实现----python总结......
  • 数据结构基础的学习
    数据结构:相互之间存在一种或多种特定关系的数据元素的集合。逻辑结构:集合:所有数据在同一个集合中,关系平等。线性:数据和数据之间是一对一的关系树:一对多图:多对多物理结构(在内存当中的存储关系):顺序存储:数据存放在连续的存储单位中。逻辑关系和物理关系一致链式,数据存......