x.contiguous()张量有什么作用x?
x.contiguous()
x
PyTorch 中有一些对张量的操作不会改变张量的内容,但会改变数据的组织方式。这些操作包括:
narrow(), view(),expand()和transpose()
narrow()
view()
expand()
transpose()
例如: 当您调用 时transpose(),PyTorch 不会生成具有新布局的新张量,它只是修改张量对象中的元信息,以便偏移量和步幅描述所需的新形状。在这个例子中,转置张量和原始张量共享相同的内存:
x = torch.randn(3,2) y = torch.transpose(x, 0, 1) x[0, 0] = 42 print(y[0,0]) # prints 42
这就是 连续 的概念出现的地方。在上面的例子中,x是连续的,但y不是因为它的内存布局与从头开始制作的相同形状的张量的内存布局不同。请注意, “连续” 这个词有点误导,因为张量的内容并不是散布在不连贯的内存块周围。这里字节仍然分配在一块内存中,但元素的顺序不同!
y
当您调用 时contiguous(),它实际上会复制张量,使其元素在内存中的顺序与使用相同数据从头开始创建的顺序相同。
contiguous()
通常你不需要担心这个。您通常可以安全地假设一切都会正常工作,并等到您得到RuntimeError: input is not contiguousPyTorch 期望连续张量添加对contiguous().
RuntimeError: input is not contiguous