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. HDFS的常用命令

    一.常用命令 二.其他命令

  2. jquery-1.10.2_d88366fd.js和jquery-3.1.0.min.js 在用touch事件时候, event.changedTouches[0]报错的问题。

    1.animation动画:(注意如果这个动画是一开始就执行的,在pc端就要用px,在手机端用rem,如果在pc端展示页面,但用的是rem为单位,这时候动画一开始就执行,因为根字体大小还没准备好,动画 ...

  3. 关于emoji表情,支持在app端发送web端显示,web端发送给app端显示,web与wap端互相显示。

    要用到emoji.js和emoji.jquery.js两个插件配合实现三端互通. 1.app端发送的emoji表情----到服务器---服务器存储的是‘问号’,无法显示如图所示: 后台的同学也试验了网 ...

  4. 实验四《Android程序设计》

    实验四<Android程序设计> 一.实验内容 1.Android Stuidio的安装测试 2.Activity测试 3.UI测试 4.布局测试 5.事件处理测试 二.实验步骤 第一部分 ...

  5. LeetCode练题——70. Climbing Stairs

    1.题目 70. Climbing Stairs——Easy You are climbing a stair case. It takes n steps to reach to the top. ...

  6. Python - 八大排序算法

    1.序言 本文使用Python实现了一些常用的排序方法.文章结构如下: 1.直接插入排序 2.希尔排序 3.冒泡排序 4.快速排序 5.简单选择排序 6.堆排序 7.归并排序 8.基数排序 上述所有的 ...

  7. C++中的sort函数和⾃定义cmp函数

    写在最前面,本文摘录于柳神笔记: sort 函数在头⽂件 #include ⾥⾯,主要是对⼀个数组进⾏排序( int arr[] 数组或 者 vector 数组都⾏), vector 是容器,要⽤ v ...

  8. easy flash &easy log

    EASY FLASH: ENV 快速保存产品参数(k-v型no-sql数据库存储),支持 写平衡(磨损平衡) 及 掉电保护 功能 EasyFlash不仅能够实现对产品的 设定参数 或 运行日志 等信息 ...

  9. C++11常用特性介绍——左值引用、右值引用

    一.左值.右值 1)左值:可以放在赋值号左侧.可以被赋值的值:左值必须要在内存中有实体. 2)右值:必须放在赋值号右侧.取出值赋值给其它变量:右值可以在内存中也可以在CPU寄存器中. 二.引用 引用是 ...

  10. ES Search API

    Search API 搜索请求 SearchRequest用于与搜索文档.聚合.suggestions相关的任何操作,还提供了在结果文档上请求高亮的方法. 在最基本的表单中,我们可以向请求添加查询: ...