pytorch 损失函数,交叉熵 pytorch
pytorch中的连续()1 先看看官方中英文doc:
火炬。Tensor.contiguous (Python方法,在torch中。张量)火炬。Tensor.is_contiguous (Python方法,在torch中。张量)1.1 contiguous() Tensor
返回包含与自张量相同数据的连续张量。如果自张量是连续的,该函数返回自张量。1.2 contiguous() Tensor
返回一个具有连续记忆和相同数据的张量;如果原张量有连续记忆,则返回原张量;2 pytorch contiguous的使用
Contiguous一般与transpose、persist、view一起使用:使用transpose或persist变换维度后,调用contiguous,然后使用view变换维度(例如:tensor_var.contiguous()。view()))。例子如下:
X=torch.tensor (2,3) y=x.permate (1,0) # permate:二维张量的量纲变换。这里的函数相当于转置y.view (-1) #来报告一个错误。在使用视图之前,需要调用coherent()函数y=x.permate (1,0
1.经过转置、置换等维度变换操作后,张量不再连续存储在内存中,而视图操作需要张量的内存连续存储,所以需要contiguous返回一个连续的副本;
2维度转换后的变量是前一个变量的浅拷贝,指向同一个区域,即视图操作会和原变量一起变形,这是非法的,所以也会报错;——这个解释有一定道理,就是contiguous返回了张量的contiguous副本数据的深度副本;
3 contiguous函数分析,参考CSDN博客
在pytorch中,不改变张量本身内容的操作只有几个,而是只是重新定义下标与元素的对应关系。换句话说,这种操作不进行数据拷贝和数据的改变,变的是元数据,这些操作是:
narrow(),view(),expand(),transpose();举个栗子。用transpose()的时候是pytorch并不会创建新的、转置后的tensor,但是修改了tensor中的一些属性(也就是元数据),使得此时的offset和stride是与转置tensor相对应的,还有转置的tensor和原tensor的内存是共享的!
为了证明这一点,让我们看看下面的代码:
X=torch.randn (3,2) y=x.transpose (x,0,1) x [0,0]=233print (y [0,0]) # print233可以看出改变了x的元素的值的同时,y的元素的值也发生了变化;也即,经过上述操作后得到的tensor,它内部数据的布局不同于从头开始创建一个正则张量。所以使用了contiguous()。
在上例中,x是contiguous的,但y不是(因为内部数据不是通常的布局方式)。注意:不要被连片的字面意思误解,tensor中数据还是在内存中一块区域里,只是布局的问题!
*当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一模一样;*
一般来说,这个不用太担心。如果您没有在需要的地方调用contiguous(),运行时将提示您:
运行时:输入不连贯,看到这个错误提示加上coherent () ~
4 其他
4.1 is_contiguous()函数
is_contiguous() bool
如果self tensor在内存中以C顺序连续,则返回True。is_contiguous() bool
返回True如果张量在记忆中是连续的;contiguous() 是以 C 为顺序保存在内存里面在pytorch,如果不是,返回一个按C顺序保存的张量:
Tensor_var.is_contiguous() #一些可以用来判断张量是否按C顺序保存的,可能会导致不按C顺序保存:
导入torch x=torch.ones (10,10)x . is _ contiguous()# truex . transpose(0,1)。is _ contiguous () # false,transpose会改变张量变量内存x.transpose (0,1)的布局。连续().
pytorch 0.4中增加了torch.reshape(),类似于numpy.reshape(),大致相当于tensor.contiguous()。view(),从而省去了在张量上做view()变换之前调用contiguous()的麻烦;
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。