自定义autograd
import torch class MyreLu(torch.autograd.Function):
"""
我们可以通过定义torch.autograd的子类来实现我们自定义的autograd函数,
并完成张量的正向反向传播
"""
@staticmethod
def forward(ctx, x ):
"""
在正向传播的时候,forward函数会接受一个上下文对象和一个包含输入输出的张量;
我们必须返回一个输出张量;
并且我们可以使用上下文对象来缓存对象,以便在反向传播中使用
"""
print(x.size())
ctx.save_for_backward(x)
'''
save_for_backward() 只能存储 tensor, None 其余的都不可以存储
save_for_backward() 只能存储 forward 的实例参数,和forward的返回值
'''
return x.clamp(min=0) #实现relu的操作
@staticmethod
def backward(ctx, grad_output):
"""
在反向传播的过程中,我们会接收上下文对象ctx和一个张量
其中包含了相对于正传播中产生的输出损失的梯度。
我们可以从上下文对象中检索缓存的数据
并且计算与正向传播的输入相关的损失梯度
"""
x,= ctx.saved_tensors #这里在x后面为啥加逗号,博主也不知道,目前没搞明白
print(x.size()) #ctx.save_for_backward保存反向传播需要用到的参数;
#ctx.saved_tensors读取参数
grad_x = grad_output.clone()
print(grad_x.size())
grad_x[x < 0] =0 #这个表达式操作博主也不是很明白
return grad_x
'''这里只是用了一个输入做一个小演示,正常的话是需要input,weight,bias 这三个参数的。
grad_x[x < 0] = 这个操作博主认为应该是判断其requires_grad是否为True,从而判断是否进行梯度的运算
但是至于这个为啥这么写,博主也不是很清楚 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') N, D_in, H, D_out = 64, 1000, 100, 10 x = torch.randn(N, D_in, device=device)
y = torch.randn(N, D_out, device=device) w1 = torch.randn(D_in, H, device=device,requires_grad=True)
w2 = torch.randn(H, D_out, device=device,requires_grad=True) learning_rate = 1e-6 for t in range(500): y_pred = MyreLu.apply(x.mm(w1)).mm(w2)
loss = (y_pred-y).pow(2).sum()
print(t,loss)
loss.backward() with torch.no_grad():
w1 -= learning_rate*w1.grad
w2 -= learning_rate*w2.grad #完成更新后清零梯度 w1.grad.zero_()
w2.grad.zero_()
自定义autograd的更多相关文章
- [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下)
[源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 目录 [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 0x00 摘要 0x01 前文回顾 0x02 Te ...
- 通过示例学习PYTORCH
注意:这是旧版本的PyTorch教程的一部分.你可以在Learn the Basics查看最新的开始目录. 该教程通过几个独立的例子较少了PyTorch的基本概念. 核心是:PyTorch提供了两个主 ...
- [Pytorch]PyTorch Dataloader自定义数据读取
整理一下看到的自定义数据读取的方法,较好的有一下三篇文章, 其实自定义的方法就是把现有数据集的train和test分别用 含有图像路径与label的list返回就好了,所以需要根据数据集随机应变. 所 ...
- [pytorch] 自定义激活函数中的注意事项
如何在pytorch中使用自定义的激活函数? 如果自定义的激活函数是可导的,那么可以直接写一个python function来定义并调用,因为pytorch的autograd会自动对其求导. 如果自定 ...
- 关于Unity3D自定义编辑器的学习
被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做). 刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...
- 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表
1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...
- JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
今天为大家分享一下我自己制作的浏览器滚动条,我们知道用css来自定义滚动条也是挺好的方式,css虽然能够改变chrome浏览器的滚动条样式可以自定义,css也能够改变IE浏览器滚动条的颜色.但是css ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- ASP.NET Aries 入门开发教程5:自定义列表页工具栏区
前言: 抓紧时间,继续写教程,因为发现用户期待的内容,都在业务处理那一块. 不得不继续勤劳了. 这节主要介绍工具栏区的玩法. 工具栏的默认介绍: 工具栏默认包括5个按钮,根据不同的权限决定显示: 添加 ...
随机推荐
- Oracle 设置NLS_CHARACTERSET字符集
Oracle 设置NLS_CHARACTERSET字符集 sqlplus "/ as sysdba"SQL> SHUTDOWN IMMEDIATE;SQL> START ...
- Spring 事务管理的API
Spring事务管理有3个API,均为接口. (1)PlatformTransactionManager 平台事务管理器 常用的实现类: DataSourceTransactionManager ...
- 跨域-CORS
跨域:是浏览器为了安全而做出的限制策略 浏览器请求必须遵循同源策略:同域名,同端口,同协议 cors跨域- 服务器端设置,前端直接调用 说明:后台允许前端某个站点进行访问 后台设置 Access-Co ...
- springmvc中整合mongodb副本集配置文件
配置文件jdbc.properties: mongo.hostport=192.168.100.100:28007,192.168.100.110:28008,192.168.100.120:2800 ...
- Mac夜神模拟器99%无法正常使用
PS:部分因更新OS X导致的卡99%可以尝试更新VBOX来解决此问题. 下载VBOX地址:https://www.virtualbox.org/wiki/Downloads 选择对应 ...
- 【CSS 】js操作css
对设置和移除所有 <p> 元素的 "main" 类进行切换: $("button").click(function(){ $("p&quo ...
- 【PAT甲级】1064 Complete Binary Search Tree (30 分)
题意:输入一个正整数N(<=1000),接着输入N个非负整数(<=2000),输出完全二叉树的层次遍历. AAAAAccepted code: #define HAVE_STRUCT_TI ...
- 【PAT甲级】1061 Dating (20 分)
题意: 给出四组字符串,前两串中第一个位置相同且大小相等的大写字母(A~G)代表了周几,前两串中第二个位置相同且大小相等的大写字母或者数字(0~9,A~N)代表了几点,后两串中第一个位置相同且大小相等 ...
- Ubuntu新手指引-软件包apt命令使用
看到这个博客,你十有八九是刚接触Ubuntu,不知从何下手.Ubuntu社区虽然现在不活跃,但里有很多文,可以帮助你快速上手,比如Ubuntu中文社区新手指引. 软件包的管理常常涉及root权限,普通 ...
- 2019年ipa发布苹果应用商店审核指南
https://baijiahao.baidu.com/s?id=1623886553597961077&wfr=spider&for=pc ipa 发布审核指南 说明: 本指南为初版 ...