0
点赞
收藏
分享

微信扫一扫

PyTorch reshape和view的区别


a1=torch.arange(12)
b1=a1.reshape(2,6)
c1=a1.view(3,4)
print(a1.storage().data_ptr())
print(b1.storage().data_ptr())
print(c1.storage().data_ptr())
print(id(a1))
print(id(b1))
print(id(c1))

tensor中会有两个区,分别是数据存储区和头部区

tensor如果定义一个a后,随后将a的某一行赋值给b
那么a和b就会共享数据存储区,b改动a也会随之改动
这是为了减少内存开销

存储区是按照数据顺序存储的,而头部信息则存储相应的索引关系
上面的a和b共用同一数据区,而头部信息是不同的,代表不同索引方式(就是从数据区取数据的方式及步长发生变化)

什么是连续性?
如果数据区的数据与头部数据区的顺序相符,就是连续的
如果将一个tensor转置后,它的索引就会发生变化,此时就是不连续的

view和reshape都可以改变形状
但是如果如果原tensor是连续的,二者没有区别,返回的都是和原数据共享同一区
但是如果tensor是非连续的,那么viem就会报错,而reshape会创建一个新的副本返回
此副本不和原数据共享同一数据区


举报

相关推荐

0 条评论