tensor.contiguous 的作用
之前看一些大佬的代码,在对一些feature map进行维度转换处理的时候,在使用tensor.transpose() 等一些维度变换函数后,会先使用 tensor.contiguous() 然后再用tensor.view() 这种维度变形函数。
pytorch官方给的函数解释为:
Returns a contiguous in memory tensor containing the same data as self tensor. If self tensor is already in the specified memory format, this function returns the self tensor.(返回包含与自张量相同数据的连续内存张量。 如果自张量已经在指定的内存格式中,则此函数返回自张量。)
再参考一篇博客(链接)的说法:(两种解释)
-
当一个Tensor经过 tensor.transpose()、tensor.permute()等这类维度变换函数后,内存并不是连续的,而tensor.view()维度变形函数的要求是需要Tensor的内存连续,所以在运行tensor.view()之前,先使用 tensor.contiguous(),防止报错。
-
维度变换函数是进行的浅拷贝操作(只复制了指像某个对象的指针,新旧对象还是共享同一块内存)即view操作会连带原来的变量一同变形,这是不合法的,所以也会报错;---- 这个解释有部分道理,也即contiguous返回了tensor的深拷贝contiguous copy数据;
不过当在这类操作中忘记调用tensor.contiguous()而报错的话,pytorch也会进行提示:
RuntimeError: input is not contiguous