自定义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个按钮,根据不同的权限决定显示: 添加 ...
随机推荐
- POJ 3041 Asteroids(二分图 && 匈牙利算法 && 最小点覆盖)
嗯... 题目链接:http://poj.org/problem?id=3041 这道题的思想比较奇特: 把x坐标.y坐标分别看成是二分图两边的点,如果(x,y)上有行星,则将(x,y)之间连一条边, ...
- R语言 plot()函数
语法: plot(x, y, ...) x,y分别是两个向量,x为横轴坐标,y为纵轴坐标 其他参数: type= "p" for points, 散点图 默认 "l&qu ...
- 使用pycharm创建Django项目,'django-admin' 不是内部或外部命令
报错信息如下: (笔者的电脑为win10,python3.7,django 2.2.6 ) 第一种情况的解决方案:没有配置环境变量,Django安装之后,需要配置环境变量,命令django-admin ...
- Python中令人迷惑的4个引用
第一个:执行时机的差异 1. array = [1, 8, 15] g = (x for x in array if array.count(x) > 0) array = [2, 8, 22] ...
- 进程作业管理2-kill,前后台作业,并行执行
kill命令:向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开 头(可省略),不区分大小写 显示当前系统可用信号: kill –l 或者 trap -l 常用信号: ...
- Vue项目引进ElementUI组件
1.https://blog.csdn.net/Mr_JavaScript/article/details/80741914 1.1 安装 npm install element-ui -save 1 ...
- 【原】python3.6安装python-dev
[root@ci /usr/lib64/python3.6]# yum -y install python36-devel
- Java面向对象编程 -1.5
对象引用传递分析 类本身属于引用传递类型,既然是引用传递类型,那么就牵扯到内存的引用传递 所谓的引用传递的本质:同一块堆内存空间可以被不同的栈内存所指向,也可以更换指向. class Person{ ...
- [BPNN]BP神经网络概念
BP神经网络概念 BP神经网络的计算过程: 由正向计算过程和反向计算过程组成: 正向计算过程,输入模式从输入层经隐单元层逐层处理,并转向输出层,每一层神经元的状态只影响下一层神经元的状态.如果在输出层 ...
- WPS/office使用技巧系列
一 WPS中如果要对比2个文档,不想以标签形式打开而是以多窗口形式,该怎么操作? 点击WPS左上角的蓝色或绿色框-->选项->->视图->勾选在任务栏中显示所有窗口,恢复书签模 ...