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

Pytorch——循环神经网络层、损失函数、优化器

文章目录二、循环神经网络层三、损失函数(LossFunction)四、优化器关于深度学习的一些理解的参考链接:https:www.cnbl


文章目录

  • 二、循环神经网络层
  • 三、损失函数(Loss Function)
  • 四、优化器

关于深度学习的一些理解的参考链接:
https://www.cnblogs.com/bamtercelboo/p/7469005.html
#一、 基础知识
##1)激活函数
这里写图片描述
sigmoid和tanh函数的导数都是原函数的函数。这样,我们一旦计算原函数的值,就可以用它来计算出导数的值。


二、循环神经网络层

##1)LSTM

t.manual_seed(1000)input=V(t.randn(2,3,4))
print('input:')print(input)
lstm=nn.LSTM(4,3,1)
h0=V(t.randn(1,3,3))
c0=V(t.randn(1,3,3))
out,hn=lstm(input, (h0,c0))
print('out:')
print(out)

结果:

input:
tensor([[[-0.5306, -1.1300, -0.6734, -0.7669],[-0.7029, 0.9896, -0.4482, 0.8927],[-0.6043, 1.0726, 1.0481, 1.0527]],[[-0.6424, -1.2234, -1.0794, -0.6037],[-0.7926, -0.1414, -1.0225, -0.0482],[ 0.6610, -0.8908, 1.4793, -0.3934]]])
out:
tensor([[[-0.3610, -0.1643, 0.1631],[-0.0613, -0.4937, -0.1642],[ 0.5080, -0.4175, 0.2502]],[[-0.0703, -0.0393, -0.0429],[ 0.2085, -0.3005, -0.2686],[ 0.1482, -0.4728, 0.1425]]])

##2)LSTMCell

t.manual_seed(1000)
input=V(t.randn(2,3,4))
print('input:')print(input)
lstm=nn.LSTMCell(4,3)
hx=V(t.randn(3,3))
cx=V(t.randn(3,3))
out=[]
for i_ in input:hx,cx=lstm(i_, (hx,cx))out.append(hx)print('out:')
print(out)

结果:

input:
tensor([[[-0.5306, -1.1300, -0.6734, -0.7669],[-0.7029, 0.9896, -0.4482, 0.8927],[-0.6043, 1.0726, 1.0481, 1.0527]],[[-0.6424, -1.2234, -1.0794, -0.6037],[-0.7926, -0.1414, -1.0225, -0.0482],[ 0.6610, -0.8908, 1.4793, -0.3934]]])
out:
[tensor([[-0.3610, -0.1643, 0.1631],[-0.0613, -0.4937, -0.1642],[ 0.5080, -0.4175, 0.2502]]), tensor([[-0.0703, -0.0393, -0.0429],[ 0.2085, -0.3005, -0.2686],[ 0.1482, -0.4728, 0.1425]])]

三、损失函数(Loss Function)

在深度学习中要用到各种各样的损失函数,这些损失函数可看做是一种特殊的layer, Pytorch也将这些损失函数专门提取出来,作为独立的一部分。
这里以交叉熵损失CrossEntripyliss为例:

#batchsize=3 计算对应每个类别的分数(只有两个类别0, 1)
score=V(t.randn(3,2))
#三个样本分别属于1,0,1类,label必须是LongTensor
label=V(t.Tensor([1,0,1])).long()#loss与普通的layer无差异
criterion=nn.CrossEntropyLoss()
loss=criterion(score,label)
loss

结果:

tensor(0.8908)

四、优化器

Pytorch将深度学习中所有的优化方法都封装在**torch.optim**中,其设计十分灵活,能够很方便地扩展成自定义的优化方法。

所有的优化方法都是继承基类optim.Optimizer, 并实现了自己的优化步骤。
下面以最基本的 优化方法——随机梯度下降法(SGD)举例说明。
这里需要掌握:


  1. 优化方法的基本使用方法;
  2. 如何对模型的不同部分设置不同的学习率;
  3. 如何调整学习率

from torch import optim
import torch as t
from torch import nn
from torch.autograd import Variable as V#首先定义一个Lenet网络
class Net(nn.Module):def __init__(self):super(Net,self).__init__()self.features=nn.Sequential(nn.Conv2d(3,6,5),nn.ReLU(),nn.MaxPool2d(2,2),nn.Conv2d(6,16,5),nn.ReLU(),nn.MaxPool2d(2,2))self.classifier=nn.Sequential(nn.Linear(16*5*5, 120),nn.ReLU(),nn.Linear(120, 84),nn.ReLU(),nn.Linear(84, 10),)def forward(self,x):x=self.features(x)x=x.view(-1,16*5*5)x=self.classifier(x)return xnet=Net()

optimizer=optim.SGD(params=net.parameters(), lr=1)
optimizer.zero_grad() #梯度清零等价于net.zero_grad()input=V(t.randn(1,3,32,32))
output=net(input)
output.backward(output)optimizer.step() #执行优化

#为不同的子网络设置不同的学习率,在finetune中经常用到
#如果对某个参数不指定学习率,就使用默认的学习率
optimizer=optim.SGD([{'params':net.features.parameters()},{'params':net.classifier.parameters()}], lr=1e-5)

#只在全连接层设置较大的学习率,其余层设置较小的学习率
special_layers=nn.ModuleList([net.classifier[0], net.classifier[3]])
special_layers_params=list(map(id, special_layers.parameters())
base_params = filter(lambda p:id(p) not in special_layers_params, net.parameters())optimizer=t.optim.SGD([{'params':base_params},{'params':special_layers.parameters(),'lr':0.01}
], lr=0.01)

调整学习率的方法主要有两种。
一种是修改optimizer.params_groups 中对应的学习率,另一种是新建优化器(更简单也是更推荐的做法)。由于optimizer十分轻量级,构建开销很小,故可以构建新的optimizer.
但是构建新的优化器会重新初始化动量等状态信息,这对使用动量的优化器来说(如带momentum的sgd),可能会造成损失函数在收敛过程中出现 震荡。

#调整学习率 新建一个optimizer
old_lr=0.1
optimizer=optim.SGD([{'params':net.features.parameters()},{'params':net.classifier.parameters(),'lr':old_lr*0.1}
],lr=1e-5)

推荐阅读
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
null
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有