动手学深度学习_2.2_autograd

Tensor

import torch

x = torch.ones(2, 2, requires_grad=True)  # 将其属性.requires_grad设置为True,它将开始追踪(track)在其上的所有操作。完成计算后,可以调用.backward()来完成所有梯度计算
print(x)
print(x.grad_fn)  # 每个Tensor都有一个.grad_fn属性,该属性即创建该Tensor的Function(除非用户创建的Tensors时设置了grad_fn=None)

# tensor([[1., 1.],
#        [1., 1.]], requires_grad=True)
# None 
y = x + 2
print(y)
print(y.grad_fn)

# tensor([[3., 3.],
#         [3., 3.]], grad_fn=<AddBackward0>)
# <AddBackward0 object at 0x7fecef6f5320>

attension: x是直接创建的,所以他没有grad_fn,而y通过一个加法操作创建的,所以它有一个的grad_fn

# x这种直接创建的称为叶?节点,叶?节点对应的 grad_fn 是 None
print(x.is_leaf, y.is_leaf) 

# True False
z = y * y * 3
out = z.mean()
print(z, out)

# tensor([[27., 27.],
#         [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
# 通过.requires_grad_()来用in-place的方式改变requires_grad属性
a = torch.randn(2, 2)  # 缺失情况下默认requires_grad=False
a = ((a * 3) / (a - 1))
print(a.requires_grad)

a.requires_grad_(True)
print(a.requires_grad)

b = (a * a).sum()
print(b.grad_fn)

# False
# True
# <SumBackward0 object at 0x7fecef6d17b8>

梯度

# 因为out是一个标量,所以调用backward()时不需要指定求导变量
out.backward()  # 等价于out.backward(torch.tensor(1.))
print(x.grad)

# tensor([[4.5000, 4.5000],
#         [4.5000, 4.5000]])
# 再来一次反向传播,注意 grad 是累加的
out2 = x.sum()
out2.backward()
print(x.grad)

out3 = x.sum()
x.grad.data.zero_()
out3.backward()
print(x.grad)

# tensor([[5.5000, 5.5000],
#         [5.5000, 5.5000]])
# tensor([[1., 1.],
#         [1., 1.]])
# y.backward(w) 求的不是 y 对 x 的导数,而是 l = torch.sum(y*w) 对 x 的导数。
x = torch.tensor([1.0, 2.0, 3.0, 4.0], requires_grad=True)
y = 2 * x
z = y.view(2, 2)
print(z)

# tensor([[2., 4.],
#         [6., 8.]], grad_fn=<ViewBackward>)

现在y不是一个标量,所以在调用backward时需要传入一个和y同行的权重向量进行甲醛求和得到一个标量

v = torch.tensor([[1.0, 0.1], [0.01, 0.001]], dtype=torch.float)
z.backward(v)
print(x.grad)

# tensor([2.0000, 0.2000, 0.0200, 0.0020])
# 中断梯度追踪
x = torch.tensor(1.0, requires_grad=True)
y1 = x ** 2
with torch.no_grad():  # 与y2有关的梯度是不会回传的,只有与y1有关的梯度才会回传
    y2 = x ** 3
y3 = y1 + y2

print(x, x.requires_grad)
print(y1, y1.requires_grad)
print(y2, y2.requires_grad)  # False,所以不能调用y2.backward()
print(y3, y3.requires_grad)

# tensor(1., requires_grad=True) True
# tensor(1., grad_fn=<PowBackward0>) True
# tensor(1.) False
# tensor(2., grad_fn=<AddBackward0>) True
y3.backward()
print(x.grad)

# tensor(2.)

想修改tensor的数值,但又不希望被autograd记录(即不影响反向传播),那么可对tensor.data操作

x = torch.ones(1, requires_grad=True)

print(x.data)
print(x.data.requires_grad)

y = 2 * x
x.data *= 100

y.backward()
print(x)
print(x.grad)

# tensor([1.])
# False
# tensor([100.], requires_grad=True)
# tensor([2.])

原文地址:https://www.cnblogs.com/harbin-ho/p/11962014.html

时间: 2024-08-02 16:10:23

动手学深度学习_2.2_autograd的相关文章

动手学深度学习_2.1_tensor

数据操作 1 import torch 2 3 torch.manual_seed(0) 4 torch.cuda.manual_seed(0) 5 print(torch.__version__) # 1.3.1 创建tensor 1 # 创建一个5x3的未初始化的tensor 2 x = torch.empty(5, 3) 3 print(x) 4 5 # tensor([[1.3563e-19, 1.3563e-19, 7.9717e-10], 6 # [5.8270e-10, 5.827

分享《动手学深度学习》高清PDF+视频教程-李沐著

下载:https://pan.baidu.com/s/10EKdEe-vjp9i97xP1FWuGA 更多资料学习:http://blog.51cto.com/14087171 由 MXNet 创始人李沐大神.Aston Zhang 等人所著的交互式书籍<动手学深度学习>推出了在线预览版,面向在校学生.工程师和研究人员,旨在帮助读者从入门到深入.动手学习深度学习,即使是零基础的读者也完全适用. 在本书上线之前,李沐等人还推出了<动手学深度学习>系列视频,这门课程的第一季已经于今年

分享《动手学深度学习(李沐等著)》PDF+源代码+《神经网络与深度学习(吴岸城)著》PDF

下载:https://pan.baidu.com/s/11O2m_uxSWJGbkXHF2Zh94w 更多资料:https://pan.baidu.com/s/1g4hv05UZ_w92uh9NNNkCaA <动手学深度学习(李沐等著)> 中文PDF,530页,带书签目录,文字可以复制粘贴.配套源代码. <神经网络与深度学习 (吴岸城)著>中文PDF,233页,带书签目录. 如图: 原文地址:https://www.cnblogs.com/limujun/p/10054478.ht

对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中可以大获全胜?人工智终将会取代人类智慧吗? <神经网络与深度学习>是一本介绍神经网络和深度学习算法基本原理及相关实例的书籍,它不是教科书,作者已尽量把公式减少到最少,以适应绝大部分人的阅读基础和知识储备.<神经网络与深度学习>涵盖了神经网络的研究历史.基础原理.深度学习中的自编码器.深

【动手学深度学习】Jupyter notebook中 import mxnet出错

问题描述 打开d2l-zh目录,使用jupyter notebook打开文件运行,import mxnet 出现无法导入mxnet模块的问题, 但是命令行运行是可以导入mxnet模块的. 原因: 激活环境是能够运行代码的前提. 解决方法: 在d2l-zh目录运行conda activate gluon命令,然后再打开jupyter notebook,则可以正常导入mxnet模块. 参考 1. d2l-zh-doc; 2. [动手学深度学习]中Jupyter notebook中 import mx

小白学习之pytorch框架(2)-动手学深度学习(begin)

在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比较执着,想学pytorch,好,有个大神来了,把<动手学深度学习>整本书用pytorch代码重现了,其GitHub网址为:https://github.com/ShusenTang/Dive-into-DL-PyTorch   原书GitHub网址为:https://github.com/d2l-

DataWhale 动手学深度学习PyTorch版-task3+4+5:文本预处理;语言模型;循环神经网络基础

课程引用自伯禹平台:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV <动手学深度学习>官方网址:http://zh.gluon.ai/ ——面向中文读者的能运行.可讨论的深度学习教科书. 第二次打卡: Task03: 过拟合.欠拟合及其解决方案:梯度消失.梯度爆炸:循环神经网络进阶 Task04:机器翻译及相关技术:注意力机制与Seq2seq模型:Transformer Task05:卷积神经网络基础:leNet:卷积神经网络进阶 有

动手学深度学习第一课:从上手到多类分类-Autograd

使用autograd来自动求导 在机器学习中,我们通常使用梯度下降来更新模型参数从而求解.损失函数关于模型参数的梯度指向一个可以降低损失函数值的方向,我们不断地沿着梯度的方向更新模型从而最小化损失函数.虽然梯度计算比较直观,但对于复杂的模型,例如多达数十层的神经网络,手动计算梯度非常困难. 为此MXNet提供autograd包来自动化求导过程.虽然大部分的深度学习框架要求编译计算图来自动求导,mxnet.autograd可以对正常的命令式程序进行求导,它每次在后端实时创建计算图从而可以立即得到梯

动手学深度学习 3-5 Others

其他问题 1. 模型选择.欠拟合和过拟合 1.1 训练误差和泛化误差 1.2 模型选择 1.2.1 验证数据集 1.2.2 \(K\) 折交叉验证 由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈.一种改善的方法是\(K\)折交叉验证(\(K\)-fold cross-validation).在\(K\)折交叉验证中,我们把原始训练数据集分割成\(K\)个不重合的子数据集,然后我们做\(K\)次模型训练和验证.每一次,我们使用一个子数据集验证模型,并使用其他\(K-