如果我目前得到的tensor是[b,h,w,c]的,想保存成图片,但是tensor保存成图片需要[b,c,h,w]格式的
用permute或者transpose就可以正常的转过去, 让之前[b,h,w,c]是的3通道,对应到[b,c,h,w]的3通道的位置上
transpose只是交换两个维度,permute()能交换多个维度。(transpose只能操作2D矩阵的转置,无法操作超过2个维度,所以要想实现多个维度的转置,既可以用一次性的permute,也可以多次使用transpose)
但是transpose、permute等操作会让tensor变得在内存上不连续,要加上.contiguouts()使其变得连续(但是内存是否连续现在来看也只是会影响view()的时候)
x = x.permute(1,2,0).contiguous() x = x.transpose(2,0).contiguous()
但是用view,他只是给你拍平之后,换了一种对之前元素的截取方式,元素还是按顺序选的,转换后的3通道和之前的3通道是不对应的
transpose是这样
view是这样
reshape和view是一样的。
view只适合对满足连续性条件(contiguous)的tensor进行操作,而reshape同时还可以对不满足连续性条件的tensor进行操作,即reshape更强大。view能干的reshape都能干,如果view不能干就可以用reshape来处理。可以认为 a.reshape = a.view() + a.contiguous().view()
所以以后可以默认先用reshape。
那么为什么没把view废除那?最近偶然看到了些资料,又想起了这个问题,觉得有以下原因:
1、在PyTorch不同版本的更新过程中,view先于reshape方法出现,后来出现了鲁棒性更好的reshape方法,但view方法并没因此废除。其实不止PyTorch,其他一些框架或语言比如OpenCV也有类似的操作。
2、view的存在可以显示地表示对这个tensor的操作只能是视图操作而非拷贝操作。这对于代码的可读性以及后续可能的bug的查找比较友好。
但是transpose的两维是可以跨越的
图像通道转换——从np.ndarray的[w, h, c]转为Tensor的[c, w, h]_莫邪莫急的博客-CSDN博客
图像通道转换——tensor从[h, w, c]转为[c, h, w] (permute&transpose和view的区别)(reshape和view)
于 2021-10-14 11:16:22 首次发布