IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 深度学习--微积分&自动求导 -> 正文阅读

[人工智能]深度学习--微积分&自动求导

x = torch.arange(4.0)
print("x = ",x)              #x =  tensor([0., 1., 2., 3.])
x.requires_grad_(True)  # 等价于 `x = torch.arange(4.0, requires_grad=True)`
print("x = ",x)              #x =  tensor([0., 1., 2., 3.], requires_grad=True)
print("x.grad = ",x.grad)    #x.grad =  None 默认值是None
y = 2 * torch.dot(x, x)
print("y = ", y)             #y =  tensor(28., grad_fn=<MulBackward0>)
y.backward()
print("x.grad = ", x.grad)   #x.grad =  tensor([ 0.,  4.,  8., 12.])

# 在默认情况下,PyTorch会累积梯度,我们需要清除之前的值
x.grad.zero_()
y = x.sum()
y.backward()
print("x.grad = ", x.grad)          #x.grad =  tensor([1., 1., 1., 1.])
x.grad.zero_()
y = x * x
u = y.detach()
z = u * x
z.sum().backward()                  #Z对x的导数为u = x*x
print("x.grad = ", x.grad)          #x.grad =  tensor([0., 1., 4., 9.])
print("u = ",u)                     #u =  tensor([0., 1., 4., 9.])

x.grad.zero_()
y = x * x
z = y *x
z.sum().backward()                # Z的导数为3x*x*x
print("x.grad = ", x.grad)        #x.grad =  tensor([ 0.,  3., 12., 27.])

备注:detach()[source]
返回一个新的Variable,从当前计算图中分离下来的,但是仍指向原变量的存放位置,不同之处只是requires_grad为false,得到的这个Variable永远不需要计算其梯度,不具有grad。
即使之后重新将它的requires_grad置为true,也不会具有梯度grad,这样就会继续使用这个新的Variable进行计算,后面当进行反向传播时,到该调用detach()的Variable就会停止,不能再继续向前进行传播。

控制流的梯度计算:即使构建函数的计算图需要通过 Python控制流(例如,条件、循环或任意函数调?),我们仍然可以计算得到的变量的梯度。

def f(a):
    b = a * 2
    while b.norm() < 1000:
        print("b = ",b)
        b = b * 2
    if b.sum() > 0:
        c = b
        print("c ==",c)
    else:
        c = 100 * b
        print("c = ",c)
    return c

if __name__ == '__main__':
    a = torch.randn(size=(), requires_grad=True)
    print("a = ",a)
    d = f(a)
    d.backward()
    print("a.grad = ", a.grad)
    print("d/a = ", d/a) # 此函数类似f(a) = k*d ,故导数为:f(a)/d

输出结果如下:

D:\workspace\pyPrj\venv\Scripts\python.exe D:/workspace/pyPrj/main.py
a = ?tensor(-0.6704, requires_grad=True)
b = ?tensor(-1.3407, grad_fn=<MulBackward0>)
b = ?tensor(-2.6814, grad_fn=<MulBackward0>)
b = ?tensor(-5.3628, grad_fn=<MulBackward0>)
b = ?tensor(-10.7257, grad_fn=<MulBackward0>)
b = ?tensor(-21.4513, grad_fn=<MulBackward0>)
b = ?tensor(-42.9027, grad_fn=<MulBackward0>)
b = ?tensor(-85.8054, grad_fn=<MulBackward0>)
b = ?tensor(-171.6107, grad_fn=<MulBackward0>)
b = ?tensor(-343.2215, grad_fn=<MulBackward0>)
b = ?tensor(-686.4429, grad_fn=<MulBackward0>)
c = ?tensor(-137288.5938, grad_fn=<MulBackward0>)
a.grad = ?tensor(204800.)
d/a = ?tensor(204800.0156, grad_fn=<DivBackward0>)

Process finished with exit code 0
?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:02:40  更:2021-12-03 13:04:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/24 22:20:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码