pytorch 损失函数,交叉熵 pytorch

  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()的麻烦;

pytorch 损失函数,交叉熵 pytorch