0 前言
这个系列主要是写给自己看的,奉行拿来主义,对于学习过程中使用到的优质的学习资源和教程会直接把链接贴进来(省的自己看完忘了),也会附上我的一些学习笔记,同时也记录一下我在学习过程中踩过的各种坑(血泪史),希望能帮助到和我一样刚刚入门的人吧。这个系列称为“实践笔记”,是因为其主要面向编程实践而非理论学习。因为我的基础还是比较差,很多东西只是自己的理解,不一定对,供参考。
教程介绍和目录见此文:
季节:【从零开始的机器学习实践笔记】02-优质教程资源收录zhuanlan.zhihu.com![3e884059b505ec2c9d3c6a0d520a724c.png](https://i-blog.csdnimg.cn/blog_migrate/629c65263583292a27d16555e9d67109.jpeg)
1 学习笔记
教程10-13集讲了在PyTorch中对tensor的几种操作。
在Pytorch中对tensor的操作主要有以下四种类型:
- Reshaping operations
- Element-wise operations
- Reduction operations
- Access operations
- Episode 10 of 33
这一集主要讲的是reshaping。
(1)Reshape 操作
先创建一个具有浮点数数据类型的3x4的二阶张量方便举例:
>
张量 t 的 shape 或者 size 为:
>
前面在《教程5-7:tensor基本概念》中介绍过要注意reshape前后元素总量不变,而查看一个张量中的元素总量可以用以下两种方法:
① 计算各个 tensor 各个 axis 上的长度乘积:
>
② 或者直接用 numel() 函数(number of elements的缩写):
>
二阶张量 t 中一共有12个元素,那么对t进行 reshape 可能的结果是将 3x4 改成 1x12、2x6、3x4、4x3、6x2、12x1,当然也可以用 t.reshape(2,2,3) 这样的方式 reshape 为 2x2x3 的三阶张量。
另外PyTorch中还有一个 view() 函数和 reshape() 具有相同的作用。
(2)Flatten 操作
在 reshape 的各种操作中,最常用的一种操作叫做 flatten 操作,就是把一个n阶的张量变形为只有一行的一阶张量,即变为 array 类型。这个操作通常在CNN中由卷积层传递到全连接层的时候发生。上一篇说过,卷积层的输出是很多的 feature map,每一个 feature map 都是一个二阶张量,但是全连接层的输入只能是数组,因此需要把卷积层输出的高阶张量压平变为一维数组,才能输入全连接层。
这里要说明的是,对二阶张量进行 flatten 的操作,是第一行数据不动,将第二行数据拼接至第一行数据末尾,再将第三行数据拼接到第二行数据的末尾,以此类推。
比如采用 reshape() 函数对张量 t 进行变换:
>
这里要注意的是,输出的张量有两层中括号,而且 shape 为“[1, 12]”,表明其在计算机中存储的形式仍然为二阶张量,只不过有一个 axis 的长度为 1 而已。要进一步将其转为一阶张量,需要用到 squeeze() 函数:
>
这时注意到输出结果变为了一阶