pytorch中view和reshape的区别
一、基本解释
“从功能上来看,它们的作用是相同的,都是用来重塑 Tensor 的 shape 的。view 只适合对满足连续性条件 (contiguous) 的 Tensor进行操作,而reshape 同时还可以对不满足连续性条件的 Tensor 进行操作,具有更好的鲁棒性。view 能干的 reshape都能干,如果 view 不能干就可以用 reshape 来处理。 如果不想继续看下去,建议所有情况都无脑使用 reshape。”
tensor中会有两个区,分别是数据存储区和头部区
- 存储区是按照数据顺序存储的,
- 头部信息则存储相应的索引关系 上面的a和b共用同一数据区,而头部信息是不同的,代表不同索引方式(就是从数据区取数据的方式及步长发生变化)
二、连续性的定义
如果数据区的数据与头部数据区的顺序相符,就是连续的如果将一个tensor转置后,它的索引就会发生变化,此时就是不连续的
三、总结
如果采用view和reshape,尽量都保证其相应的连续性,但在使用reshape的时候,如果tensor是非连续的时候:
- reshape会创建一个新的副本返回 此副本不和原数据共享同一数据区
- 那么view就会报错
建议在pytorch中调用时候直接使用contiguous()
data = image.contiguous().reshape(145 * 145, 220)
data = image.contiguous().view(145 * 145, 220)
data = image.reshape(145 * 145, 220)