文章目录
在jupyter notebook/jupyterlab中怎么操作宿主机
当在jupyter中需要操作宿主机时,可以通过将命令前加上!
或者%
即可。
#查看当前目录
%pwd
!pwd
#查看当前目录下有什么内容
!ls
%ls
#通过jupyter安装相关包
创建张量
创建张量的方法是由从什么来创建所决定的。
如果从列表来创建,那么就用torch.tensor()
方法。
如果从概率分布中创建就用torch.randn()
等方法来生成。
通过创建函数赋值创建张量就是在新位置(id
)处生成一个数据。
tensor.data
提取出来的是张量的数据地址,当把它赋值给别的变量时,相当于把同一个地址赋值给这个新位置处的变量。当这个位置的变量的数值发生变化时,原位置处的变量的数值也会发生变化。而tensor.detach()
提取出来的是数据的复制品,当把它赋值给别的变量时,不存在位置上的依赖。
要想保持原位置更新张量的数值,那么就需要使用冒号或者是简略运算符,例如+=,-=,*=,/=
等等,这就跟节省内存对应上了。
#绝缘的操作,具有不同id,无论采取什么方法更改数据区都不会影响另一个的数据。哪怕是采用不绝缘的操作来更改数据区也不会影响另一个的数据。
tensora=tensorb.data
tensora=torch.tensor(tensorb)
tensora=tensorb.clone()
tensora=tensorb.detach()
#不绝缘的操作,具有同一个id,当采用特定的原地修改方法时会影响另一个数据。
tensora=tensorb
tensora.data=tensorc #采用这种方法可以实现原地修改数据区,这样在不绝缘的情况下会影响tensorb这个数据。
tensora=tensorc #采用这种方法不能原地修改数据区也就不能影响tensorb这个数据。
Pytorch中的tensor张量属性
利用pytorch进行深度学习或人工智能开发,不可避免要用到Tensor张量,所以有必要弄清楚张量的所有属性和用法。
#注意方法要加括号,属性不用加括号
#通过clone方法来创建张量
tensora=tensorb.clone()
##这样两个张量的id是不一样的。所对应的data属性区也是不一样的,更改tensora的data不会影响tensorb的数据。更改tensorb的data属性也不会影响tensora的数据。双向绝缘。
#通过detach方法来创建张量
tensora=tensorb.detach()
##这两个张量的id是不一样的。数据区data也是不一样的,双向绝缘。
#通过torch.tensor方法来创建张量
tensora=torch.tensor(tensorb)
##这两个张量的id也是不一样的。数据区也是绝缘的,
原张量数据区变化:
clone张量数据区变化:
detach张量的数据区变化:
所以就算原张量是一个可变张量,detach以后就是一个常量了,clone以后也是一个常量了。原张量的变化不会对detach,clone后产生的张量发生影响。
autograd包中的Variable变量属性
提到张量不得不提跟他很相似的变量,variable,在PyTorch中,Variable是一个重要的概念,它是对tensor的封装,可以用于自动求导和梯度下降算法等。
#Variable变量的创建
tensora=Variable(tensorb)
#随后对这个变量tensora进行clone和detach方法,发现关系依旧如上所示,双向绝缘。注意此处使用的是.data属性更改tensora的内容。同时保持了tensora的前后id一致。见下图第一个
#同时tensora和创建时备用来做参数的tensorb之间也是绝缘的。
#当采用赋值直接修改的时候会变化这个变量的id。
通过.data属性修改变量内容
同样不会改变数据类型
所以通过.data可以实现原地修改。而其他的会改变数据位置。
直接修改变量内容
当然还需要验证一下直接赋值会不会改变变量类型。不过貌似是没有什么变化。
什么时候数据不是绝缘的?
通过上述分析可以发现,通过创建函数来创建的张量或者变量的数据区都是绝缘的。id都不一样,比如torch.tensor创建的,variable创建的,clone(),detach()等等。
唯一不绝缘的就是通过直接变量名赋值的,比如:tensora=tensorb
,这样两个变量的id是一样的。修改任意一个变量的数据区并保持id不变也就是原地修改,那么另一个变量的数据区也会发生变化。如果不原地修改,那么会导致绝缘。
绝缘的情况:
不绝缘的情况:
可以粗略的认为除了这种情况,其他的都是绝缘的。
张量运算
张量操作分为同形状按元素运算和不同形状用广播运算。除了形状不一致采用广播运算,其他的都是按元素运算。
参考: