热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记录训练神经网络过程中常用的权值共享和不同层赋予不同学习率等方法

权值共享 import torchimport torch.nn as nnclass model(nn.Module):def __init__(self):super(model,self).__

权值共享

import torch
import torch.nn as nnclass model(nn.Module):def __init__(self):super(model,self).__init__()self.lstm = nn.LSTM(input_size = 10,hidden_size = 5)self.linear = nn.Linear(input_features = 5,out_features = 2)def forward(self,inputdata1,inputdata2):lstm_result1 = self.lstm (input_data1)lstm_result2 = self.lstm(inputdata2)output = self.linear(lstm_result1+lstm_result2)return output

注释:在神经网络的训练过程中经常用到两层网络共享权值,在上述代码片中,定义神经网络时定义一个lstm模型和一个全连接层,在前向计算中多次调用lstm层进行计算,相当于神经网络模型中有两个lstm层,即计算inputdata1和inputdata2的两个lstm共享权值。
参考:https://www.cnblogs.com/sdu20112013/p/12132786.html

某些层参数不更新

在查询此类资料时,在博客中看到模型层中添加了requires_grad = False后参数仍会训练的问题,博主并给出了相关解决方法,这里记录两个感觉使用方便的方法。
更多内容参考:https://blog.csdn.net/guotong1988/article/details/79739775

import torch
import torch.nn as nnclass model(nn.Module):def __init__(self):super(model,self).__init__()self.lstm = nn.LSTM(input_size = 10,hidden_size = 5)for p in self.parameters():p.requires_grad = Falseself.linear = nn.Linear(input_features = 5,out_features = 2)def forward(self,inputdata1,inputdata2):lstm_result1 = self.lstm (input_data1)lstm_result2 = self.lstm(inputdata2)output = self.linear(lstm_result1+lstm_result2)return output

注释:在不需要参数更新的层后边添加如下代码行:

for p in self.parameters():p.requires_grad = False

但是上述方法适用于模型中最初几层都不需训练,顶层需要训练的情况,如果出现需要训练和不需要训练的模型层交替出现的时候,上述方法就无法使用。博主给出了使用范围更广的方法:

import torch
import torch.nn as nn
from torch.nn import CrossEntropyLossclass model(nn.Module):def __init__(self):super(model,self).__init__()self.lstm1 = nn.LSTM(input_size = 10,hidden_size = 10,requires_grad = True)self.lstm2 = nn.LSTM(input_size = 10,hidden_size = 5,requires_grad = False)self.linear = nn.Linear(input_features = 5,out_features = 2,requires_grad = True)def forward(self,inputdata):lstm_result1 = self.lstm1(input_data)lstm_result2 = self.lstm(lstm_result1)output = self.linear(lstm_result1+lstm_result2)return output
model = model()
#人为构造输入和真实标签
input_data = torch.randn([1,10])#[1,10]代表输入一个样本,该样本的向量是10维,此处必须是二位数据
target = torch.tensor([1],dtype = torch.long)#输入一个样本时真实标签只有一个,如果输入是[5,10],则真实标签就应该为5,例如,torch.tensor([0,1,1,1,0])#模型计算,反向传播
result = model(input_data)
loss_fc = CrossEntropyLoss()
loss = loss_fc(input_data,target)
loss.backward()#优化函数优化
torch.optimizer.SGD(filter(lambda p:p.requires_grad = True,model.parameters(),lr = 0.01))

注释:上述代码片在优化函数部分对参数进行过滤,只选取requires_grad = True的参数进行优化更新。

为不同的层赋予不同的学习率

import torch
import torch.nn as nn
from torch.nn import CrossEntropyLossclass model(nn.Module):def __init__(self):super(model,self).__init__()self.lstm = nn.LSTM(input_size = 10,hidden_size = 10,requires_grad = True)self.linear = nn.Linear(input_features = 5,out_features = 2,requires_grad = True)def forward(self,inputdata):lstm_result = self.lstm(input_data)output = self.linear(lstm_result)return outputmodel = model()#人为构造输入和真实标签
input_data = torch.randn([1,10])#[1,10]代表输入一个样本,该样本的向量是10维,此处必须是二位数据
target = torch.tensor([1],dtype = torch.long)#输入一个样本时真实标签只有一个,如果输入是[5,10],则真实标签就应该为5,例如,torch.tensor([0,1,1,1,0])#模型计算,反向传播
result = model(input_data)
loss_fc = CrossEntropyLoss()
loss = loss_fc(input_data,target)
loss.backward()#使用优化函数优化过程中,为不同的层赋予不同的学习率,
param_lstm = [p for p in model.lstm.parameters()]
param_linear = [p for p in model.linear.parameters()]
params = [{'params':param_lstm,'lr':0.1},{'params':param_linear,'lr':0.01}]
torch.optimizer.SGD(params)

将两个模型参数的平均值赋予第三个模型

import torch
import torch.nn as nn
from collections import OrderedDict
#创建两个模型
model1 = nn.Linear(10,10)
model2 = nn.Linear(10,10)#获取两个模型的平均值
param_dict = {}
for key in model1.state_dict.keys():#model1.state_dict()输出值为OrderedDict类型param_key = (model1.state_dict[key] + model2.state_dict[key]) / 2param_dict[key] = param_key#将两个模型的平均值转换成OrderedDict类型,并赋予第三个模型
param_dict = OrderedDict(param_dict)
model3 = nn.Linear(10,10)#三个模型的构造必须一致
model3.load_state_dict(param_dict)

输出模型中每个层的梯度

import torch
import torch.nn as nn
from torch.nn import CrossEntropyLossclass model(nn.Module):def __init__(self):super(model,self).__init__()self.lstm = nn.LSTM(input_size = 10,hidden_size = 10,requires_grad = True)self.linear = nn.Linear(input_features = 5,out_features = 2,requires_grad = True)def forward(self,inputdata):lstm_result = self.lstm(input_data)output = self.linear(lstm_result)return outputmodel = model()#人为构造输入和真实标签
input_data = torch.randn([1,10])#[1,10]代表输入一个样本,该样本的向量是10维,此处必须是二位数据
target = torch.tensor([1],dtype = torch.long)#输入一个样本时真实标签只有一个,如果输入是[5,10],则真实标签就应该为5,例如,torch.tensor([0,1,1,1,0])#模型计算,反向传播
result = model(input_data)
loss_fc = CrossEntropyLoss()
loss = loss_fc(input_data,target)
loss.backward()#输出不同层的梯度
print(model.lstm.grad)
print(model.linear.grad)#细分输出不同层权值和偏置的梯度
print(model.lstm.weight.grad)
print(model.lstm.bias.grad)
print(model.linear.weight.grad)
print(model.linear.bias.grad)

查看模型梯度参考:https://zhuanlan.zhihu.com/p/36121066
后续还需了解如何直接为某层赋予一定的梯度。


推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
匿名用户
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有