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的更多相关文章

  1. [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下)

    [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 目录 [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 0x00 摘要 0x01 前文回顾 0x02 Te ...

  2. 通过示例学习PYTORCH

    注意:这是旧版本的PyTorch教程的一部分.你可以在Learn the Basics查看最新的开始目录. 该教程通过几个独立的例子较少了PyTorch的基本概念. 核心是:PyTorch提供了两个主 ...

  3. [Pytorch]PyTorch Dataloader自定义数据读取

    整理一下看到的自定义数据读取的方法,较好的有一下三篇文章, 其实自定义的方法就是把现有数据集的train和test分别用 含有图像路径与label的list返回就好了,所以需要根据数据集随机应变. 所 ...

  4. [pytorch] 自定义激活函数中的注意事项

    如何在pytorch中使用自定义的激活函数? 如果自定义的激活函数是可导的,那么可以直接写一个python function来定义并调用,因为pytorch的autograd会自动对其求导. 如果自定 ...

  5. 关于Unity3D自定义编辑器的学习

    被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做).  刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...

  6. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...

  7. JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome

    今天为大家分享一下我自己制作的浏览器滚动条,我们知道用css来自定义滚动条也是挺好的方式,css虽然能够改变chrome浏览器的滚动条样式可以自定义,css也能够改变IE浏览器滚动条的颜色.但是css ...

  8. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  9. ASP.NET Aries 入门开发教程5:自定义列表页工具栏区

    前言: 抓紧时间,继续写教程,因为发现用户期待的内容,都在业务处理那一块. 不得不继续勤劳了. 这节主要介绍工具栏区的玩法. 工具栏的默认介绍: 工具栏默认包括5个按钮,根据不同的权限决定显示: 添加 ...

随机推荐

  1. 【JavaWeb】Spring相关错误记录

    Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: ...

  2. VScode Vim插件快速上手与配置

    快速安装: 打开market place,搜索vim即可安装. 基本改建与配置说明: 方向键: 用I k j l表示光标上下左右,需要编辑visual mode和normal mode { " ...

  3. 例题3_4 猜数字游戏的提示(UVa340)

    实现一个经典“猜数字”游戏.给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据.每组输入第一行为序列长度n,第二行是答案序列,接 ...

  4. 下载完idea后需要做的设置

    1.设置字体 2.安装插件 3.设置文件头(C:\Users\用户名\.IntelliJIdea2019.2\config\fileTemplates\includes下有个文件叫做File Head ...

  5. POJ2516 Minimum Cost

    亲爱的,一个货物销售者,现在遇到了一个大问题,他需要你的帮助.在他的销售区域有 N 个店主(从 1 到 N)向他储存货物,Dearboy 有M 个供应点(从 1 到 M),每个供应点提供 K 种不同的 ...

  6. 吴裕雄--天生自然Numpy库学习笔记:NumPy IO

    Numpy 可以读写磁盘上的文本数据或二进制数据. NumPy 为 ndarray 对象引入了一个简单的文件格式:npy. npy 文件用于存储重建 ndarray 所需的数据.图形.dtype 和其 ...

  7. Codeforces Round #611 (Div. 3) D

    There are nn Christmas trees on an infinite number line. The ii -th tree grows at the position xixi ...

  8. 【转】使用普通用户执行docker

    原文:https://www.cnblogs.com/klvchen/p/9098745.html CentOS 版本 7.4,Docker 版本 docker-1.13 及以下 ll /var/ru ...

  9. Codeforces Round #617 (Div. 3)

    A 题意:能否将数组里面的值用数组里面的值替换出一个和为奇数的数组 思路:1.和为奇数yes 2.和为偶数但有奇数yes 3.个数是奇数的,有奇数的yes 其他都是no 果然罚时全给了A #inclu ...

  10. 时隔两天,三星再称GalaxyFold已准备就绪,王自如的脸还好吗?

    编辑 | 禾斗 出品 | 于见(mpyujian) 据消息人士透露,三星已经完成对其有缺陷的折叠智能手机进行了重新设计,Galaxy Fold准备适时再度推出,但问题是,作为消费者,我们准备好了吗? ...