- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章pytorch_detach 切断网络反传方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
官方文档中,对这个方法是这么介绍的.
1
2
3
4
5
6
7
8
|
detach
=
_add_docstr(_C._TensorBase.detach, r
"""
Returns a new Tensor, detached from the current graph.
The result will never require gradient.
.. note::
Returned Tensor uses the same data tensor as the original one.
In-place modifications on either of them will be seen, and may trigger
errors in correctness checks.
"""
)
|
返回一个新的从当前图中分离的 Variable.
返回的 Variable 永远不会需要梯度 。
如果 被 detach 的Variable volatile=True, 那么 detach 出来的 volatile 也为 True 。
还有一个注意事项,即:返回的 Variable 和 被 detach 的Variable 指向同一个 tensor 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import
torch
from
torch.nn
import
init
t1
=
torch.tensor([
1.
,
2.
],requires_grad
=
True
)
t2
=
torch.tensor([
2.
,
3.
],requires_grad
=
True
)
v3
=
t1
+
t2
v3_detached
=
v3.detach()
v3_detached.data.add_(t1)
# 修改了 v3_detached Variable中 tensor 的值
print
(v3, v3_detached)
# v3 中tensor 的值也会改变
print
(v3.requires_grad,v3_detached.requires_grad)
'''
tensor([4., 7.], grad_fn=<AddBackward0>) tensor([4., 7.])
True False
'''
|
在pytorch中通过拷贝需要切断位置前的tensor实现这个功能。tensor中拷贝的函数有两个,一个是clone(),另外一个是copy_(),clone()相当于完全复制了之前的tensor,他的梯度也会复制,而且在反向传播时,克隆的样本和结果是等价的,可以简单的理解为clone只是给了同一个tensor不同的代号,和‘='等价。所以如果想要生成一个新的分开的tensor,请使用copy_().
不过对于这样的操作,pytorch中有专门的函数——detach().
用户自己创建的节点是leaf_node(如图中的abc三个节点),不依赖于其他变量,对于leaf_node不能进行in_place操作.根节点是计算图的最终目标(如图y),通过链式法则可以计算出所有节点相对于根节点的梯度值.这一过程通过调用root.backward()就可以实现. 。
因此,detach所做的就是,重新声明一个变量,指向原变量的存放位置,但是requires_grad为false.更深入一点的理解是,计算图从detach过的变量这里就断了, 它变成了一个leaf_node.即使之后重新将它的requires_node置为true,它也不会具有梯度. 。
(0.4之后),tensor和variable合并,tensor具有grad、grad_fn等属性; 。
默认创建的tensor,grad默认为False, 如果当前tensor_grad为None,则不会向前传播,如果有其它支路具有grad,则只传播其它支路的grad 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# 默认创建requires_grad = False的Tensor
x
=
torch.ones(
1
)
# create a tensor with requires_grad=False (default)
print
(x.requires_grad)
# out: False
# 创建另一个Tensor,同样requires_grad = False
y
=
torch.ones(
1
)
# another tensor with requires_grad=False
# both inputs have requires_grad=False. so does the output
z
=
x
+
y
# 因为两个Tensor x,y,requires_grad=False.都无法实现自动微分,
# 所以操作(operation)z=x+y后的z也是无法自动微分,requires_grad=False
print
(z.requires_grad)
# out: False
# then autograd won't track this computation. let's verify!
# 因而无法autograd,程序报错
# z.backward()
# out:程序报错:RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
# now create a tensor with requires_grad=True
w
=
torch.ones(
1
, requires_grad
=
True
)
print
(w.requires_grad)
# out: True
# add to the previous result that has require_grad=False
# 因为total的操作中输入Tensor w的requires_grad=True,因而操作可以进行反向传播和自动求导。
total
=
w
+
z
# the total sum now requires grad!
total.requires_grad
# out: True
# autograd can compute the gradients as well
total.backward()
print
(w.grad)
#out: tensor([ 1.])
# and no computation is wasted to compute gradients for x, y and z, which don't require grad
# 由于z,x,y的requires_grad=False,所以并没有计算三者的梯度
z.grad
=
=
x.grad
=
=
y.grad
=
=
None
# True
|
1
2
3
4
5
6
7
8
9
10
|
import
torch.nn.functional as F
# With square kernels and equal stride
filters
=
torch.randn(
8
,
4
,
3
,
3
)
weiths
=
torch.nn.Parameter(torch.randn(
8
,
4
,
3
,
3
))
inputs
=
torch.randn(
1
,
4
,
5
,
5
)
out
=
F.conv2d(inputs, weiths, stride
=
2
,padding
=
1
)
print
(out.shape)
con2d
=
torch.nn.Conv2d(
4
,
8
,
3
,stride
=
2
,padding
=
1
)
out_2
=
con2d(inputs)
print
(out_2.shape)
|
补充:Pytorch-detach()用法 。
神经网络的训练有时候可能希望保持一部分的网络参数不变,只对其中一部分的参数进行调整.
或者训练部分分支网络,并不让其梯度对主网络的梯度造成影响.这时候我们就需要使用detach()函数来切断一些分支的反向传播. 。
返回一个新的tensor,从当前计算图中分离下来。但是仍指向原变量的存放位置,不同之处只是requirse_grad为false.得到的这个tensir永远不需要计算器梯度,不具有grad. 。
即使之后重新将它的requires_grad置为true,它也不会具有梯度grad.这样我们就会继续使用这个新的tensor进行计算,后面当我们进行反向传播时,到该调用detach()的tensor就会停止,不能再继续向前进行传播. 。
注意:
使用detach返回的tensor和原始的tensor共同一个内存,即一个修改另一个也会跟着改变.
比如正常的例子是:
1
2
3
4
5
6
7
8
|
import
torch
a
=
torch.tensor([
1
,
2
,
3.
], requires_grad
=
True
)
print
(a)
print
(a.grad)
out
=
a.sigmoid()
out.
sum
().backward()
print
(a.grad)
|
输出 。
tensor([1., 2., 3.], requires_grad=True) 。
None 。
tensor([0.1966, 0.1050, 0.0452]) 。
1.1 当使用detach()分离tensor但是没有更改这个tensor时,并不会影响backward()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import
torch
a
=
torch.tensor([
1
,
2
,
3.
], requires_grad
=
True
)
print
(a.grad)
out
=
a.sigmoid()
print
(out)
#添加detach(),c的requires_grad为False
c
=
out.detach()
print
(c)
#这时候没有对c进行更改,所以并不会影响backward()
out.
sum
().backward()
print
(a.grad)
'''返回:
None
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
tensor([0.7311, 0.8808, 0.9526])
tensor([0.1966, 0.1050, 0.0452])
'''
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/junqing_wu/article/details/93851909 。
最后此篇关于pytorch_detach 切断网络反传方式的文章就讲到这里了,如果你想了解更多关于pytorch_detach 切断网络反传方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个自定义的 android 开关,它是这样定义的 和像这样的拇指选择器项
很不情愿地,我请求你们帮助我克服我的大脑卡住。我正在录制音频,但遇到一个问题,无法在不丢失一半的情况下获取录制的音频。 recAudioInput = recAudioContext.createMe
我正在学习本教程:http://code.tutsplus.com/tutorials/android-user-interface-design-creating-a-numeric-keypad-
我在 Swift 中使用 CGImageCreateWithImageInRect 在触摸位置创建部分图像的副本。 我的代码运行良好,除非用户触摸屏幕边缘并且矩形大小落在 View 框架之外。它不是返
我有一张正在创建的 map ,它的一部分似乎被切断或偏离了中心。我已经尝试添加 google.maps.event.triggerr(map, 'resize') 但它仍然被切断。有什么想法吗?
我有一个包含 5 列的数据框,所有列都包含数值。列代表时间步长。我有一个阈值,如果在规定时间内达到,就会阻止值发生变化。所以假设原始值是 [ 0 , 1.5, 2, 4, 1] 排列成一行,阈值是 2
有没有办法以编程方式关闭电源或关闭 Mac 上的 USB 端口? 最佳答案 我相信 USB 电源通常直接来自电源。它可能会通过主板或其他一些硬件将其与数据线结合起来,但我认为电压不会通过任何可编程电路
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
Android 上是否有接口(interface)或 API 或其他东西允许应用弹出电缆并停止从电缆供电或接收电源? 我查看了 USBDevice(包括 USBInterfaces),似乎找不到任何可
我知道我可以让 Navigation Header 在 actionBar 上滑动,但我只想将整个 Navigation drawer 向下移动,因为我想保持“后退”按钮和 actionBar 始终可
我有一个主要的 viewController A 和一个 UITabBar。我的问题是,当我滚动到最后一个单元格,然后在 UITableView 中单击单元格进入 viewController B,然
我有一个 Web 应用程序,在 Safari 中呈现时看起来不错,但浏览器不遵守打印媒体查询。在 Chrome 中,整个可打印区域看起来都不错,但在 Safari 中,它似乎只是可见内容的一些变体。
当使用带有 SeekBar View 的自定义 thumb drawable 时,拇指 drawable 在 View 的左右边缘被剪裁。 如何解决此问题? 最佳答案 您应该可以通过设置 paddin
我在文件中有一个字符串: git@github.com:myorg/Myrepo.git git@github.com:myorg/Mysecondrepo.git git@github.com:my
我有一个信息亭网页,其中加载了55px标题,而iFrame则占据了其下方的其余窗口。在iFrame中,我有一个页面可以懒惰地加载项目网格。我们一次加载50个项目,然后再加载50个,依此类推。每个项目都
我正在使用jquery form plugin它使用 jquery ajax 来完成大部分工作。我们有 jquery 1.7.2 我们使用它通过 ajax 向服务器发送表单,并返回指示成功的值或返回带
这是我的按钮元素: Let Me In, please! 这是 CSS: .btn-submit { margin: 0; padding: 0; border: none; font-family:
我的 CSS 样式表中有以下类: .errormsg { border:solid 1px Red; padding:5px 20px 5px 20px; margin:5px; co
我将 JWPlayer 与包含字幕的 HLS 文件一起使用。但是,当我在 iPhone 或其他 iOS 设备上播放此文件时,它会切断字幕: 有没有办法提高移动设备上字幕的高度?我的 HLS 文件是:
我有一个放置在 View 内部的 UIScrollView(界面生成器文档 .xib/.m/.h),但是由于 UITabBarController,UIScrollView 的下半部分被剪裁并且不显示
我是一名优秀的程序员,十分优秀!