Pytorch 学习笔记(CPU only)之入门
如果想进一步了解神经网络的内部结构,建议不要使用这些深度学习框架,如果有能力和时间,建议采用numpy
类库从底层实现一个神经网络各种操作,比如:前向传播、反向传播、梯度下降等。
1. 开始
1.1 构成
Pytorch 是由 Facebook 于 2016 年推出的一款深度学习框架。Pytorch 主要由以下包构成:
Packages | Description |
---|---|
torch.nn |
A subpackage that contains modules and extensible classes for building neural networks. (包含用于构建神经网络的模块和可扩展类的子包。) |
torch.autograd |
A subpackage that supports all the differentiable Tensor operations in PyTorch. |
torch.nn.functiona l |
A functional interface that contains typical operations used for building neural networks like loss functions, activation functions, and convolution operations. (一个功能接口,其中包含用于构建神经网络的典型操作,例如损失函数,激活函数和卷积操作。) |
torch.optim |
A subpackage that contains standard optimization operations like SGD and Adam. (包含基本优化例如:随机梯度下降、Adam 等操作的子包。) |
torch.utils |
A subpackage that contains utility classes like data sets and data loaders that make data preprocessing easier. (包含数据集和数据加载器等实用工具类的子包,使数据预处理更容易。) |
torchvision |
A package that provides access to popular datasets, model architectures, and image transformations for computer vision. (包含可以访问流行的数据集,模型架构和计算机视觉图像转换的包) |
1.2 Tensor
tensor
(张量)是Pytorch
中基本的数据结构。一维向量、二维矩阵、三维矩阵等都可以视为张量。
tensor 就是一个高维矩阵。
在Pytorch
中封装了torch.Tensor
这个类,创建的tensor
都是这个类的实例。在torch
中,有四种方式创建一个tensor
。
1.torch.Tensor(data)
2.torch.tensor(data)
(推荐)
3.torch.as_tensor(data)
4.torch.from_numpy(data)
传入的data
可以是python
中的array
、list
,或者numpy
中的ndarray
。 可以用 python 的索引和切片来获取和修改一个张量 tensor 中的内容。
tensor 的属性:
dtype
:torch 中共有七种 CPU tensor 类型和八种 GPU tensor 类型。
Data type | CPU tensor | GPU tensor |
---|---|---|
32-bit floating point | torch.FloatTensor |
torch.cuda.FloatTensor |
64-bit floating point | torch.DoubleTensor |
torch.cuda.DoubleTensor |
16-bit floating point | N/A | torch.cuda.HalfTensor |
8-bit integer (unsigned) | torch.ByteTensor |
torch.cuda.ByteTensor |
8-bit integer (signed) | torch.CharTensor |
torch.cuda.CharTensor |
16-bit integer (signed) | torch.ShortTensor |
torch.cuda.ShortTensor |
32-bit integer (signed) | torch.IntTensor |
torch.cuda.IntTensor |
64-bit integer (signed) | torch.LongTensor |
torch.cuda.LongTensor |
shape
:返回tensor
的维度,注:size()
方法结果相同。
1 | data = np.array([1,2,3]) |
创建 tensor 的其他方式:
torch.eye(n)
:创建 n 阶的单位矩阵torch.zeros(n)
:param
可以是一个数字n
,表示初始化为 1n 的向量;也可以是一个元组或列表(n,m)
,表示`n m`的 0 矩阵。torch.ones(param)
:1
2
3
4
5
6
7print(torch.ones([2,3]))
#print(torch.ones(2,3)
tensor([[0., 0., 0.],
[0., 0., 0.]])
print(torch.zeros(3))
tensor([0., 0., 0., 0., 0.])troch.ones(param)
:同上torch.rand(parma)
:初始化为0-1
之间的数。torch.randn(param)
: 标准正态分布 之中的数。
1.3 tensor 的操作
numpy()
:转为numpy.ndarray
eq()
:用来比较两个tensor
各个元素是否相等。1
2
3
4
5
6> preds = torch.tensor([1,2,3,4])
> labels = torch.tensor([1,5,4,4])
> preds.eq(labels)
tensor([ True, False, False, True])
> preds.eq(labels).sum().item()
2reshape()
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39> t = torch.tensor([
[1,1,1,1],
[2,2,2,2],
[3,3,3,3]
])
> t.size()
torch.Size([3, 4])
> t.shape
torch.Size([3, 4])
> t.reshape([1,12])
tensor([[1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.]]) #二维的
> t.reshape(-1)
tensor([1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.]) #一维的
> t.reshape(6,2)
tensor([[1., 1.],
[1., 1.],
[2., 2.],
[2., 2.],
[3., 3.],
[3., 3.]])
#升维
> t.reshape(2,2,3)
tensor(
[
[
[1., 1., 1.],
[1., 2., 2.]
],
[
[2., 2., 3.],
[3., 3., 3.]
]
])注意:reshape 返回后的结果可能与原
tensor
共享数据,而维度不同,即:你改变了 reshape 后的数据,原数据也会被修改;又或者 reshape 后的不共享存储。(无语….)squeeze()
将所有为 1 的维度删掉,可以传入具体的参数,表示将第几个维度进行“挤压”,如果指定维度不为1,那么调用该方法tensor不发生改变。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17> t1 = torch.tensor([[1],[2],[3],[4]]) # [4,1]
> t1_ = t1.squeeze(-1)# t1.squeeze(1)
tensor([1, 2, 3, 4])#[4]
> t1_.shape
torch.Size([4])
> a = torch.randn(1,1,3)
> print(a)
tensor([[[ 1.8239, -1.0579, 0.3052]]])
> b = torch.squeeze(a) # 将a中所有为1的维度删掉。不为1的维度没有影响。
> b
tensor([ 1.8239, -1.0579, 0.3052])
#[3]
> c=torch.squeeze(a,1) # 第2维度是否为1,为1就删掉,成为2维矩阵;不为1则不受影响
> c
tensor([[ 0.6552, 0.9220, -0.9763]])unsqueeze()
对给指定位置加上维数为一的维度1
2
3
4
5
6
7
8
9
10
11> a = torch.linspace(-1, 1, 100)
> a,shape
torch.Size([100])
> b = a.unsqueeze(0)
> b.shape
torch.Size([1,100])
> c = a.unsqueeze(1)
> c.shape
torch.Size([100,1])flatten
就是reshape
和squeezee
二者结合。1
2
3
4
5
6
7
8
9def flatten(t):
t = t.reshape(1, -1)
t = t.squeeze()
return t
> t = torch.ones(4,3)
> flatten(t) # t.reshape(1,-1).squeezee()
tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
> t.flatten()
tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])cat()
两个矩阵的拼接,按照行/列进行拼接。1
2
3
4
5
6
7
8
91,2,3,4],[5,6,7,8]]) # 2*4 t1 = torch.tensor([[
4],[8]]) # 2*1 t2 = torch.tensor([[
1) #t2列数与t1不同,只能横着拼接,依旧是行方向 torch.concat((t1,t2),dim =
tensor([[1, 2, 3, 4, 4],
[5, 6, 7, 8, 8]])
9,2,3,4]]) # [9,2,3,4]会报错!维度不一样 [4] [[9,2,3,4]] => [1,4] t3 = torch.tensor([[
tensor([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 2, 3, 4]])
stack()
要求输入的两个张量维度完全相同,结果比原张量维度+1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
171,2],[3,4]]) t1 = torch.tensor([[
5,6],[7,8]]) t2 = torch.tensor([[
torch.stack((t1,t2))
tensor([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
1) res = torch.stack((t1,t2),
res
tensor([[[1, 2],
[5, 6]],
[[3, 4],
[7, 8]]])
res.shape
torch.Size([2, 2, 2])tips:在图像数据集中,
data
的维度通常是四维的。每个维度分别代表:[batch,channel,width,height]
*view()
:用来改变tensor
的维度。类似于reshape()
。 如果是torch.view(-1)
,则原张量会变成一维的结构(和flatten
操作相同) 。注意:
view()
操作会与原tensor
共享数据!!!permute
:交换维度1
2
3
4> t = torch.randn(5,2,3)
> t = t.permute(1,2,0)
> t.shape
[3,2,5]1
2
3
4
5
6
7
8
9
10
11
12
* `type_as`:转换`tensor`类型,`tensor`默认小数为`float`型。
```pyth
> t1 = np.linspace(-10,10,100)
> t1_ = torch.tensor(t1)
> t1_.dtype
torch.float64
t1_ = t1_.type_as(torch.FloatTensor())
> t1_.dtype
torch.float32
1.4 tensor 的广播以及 reduction 操作
和numpy
类似,tensor 也可以进行每一列/行求均值(mean
)、max
、argmax
、sum
、std
等操作。
1 | > t = torch.tensor([ |
1.5 数据集的加载
通常数据要经过以下处理:
- Extract data from a data source.
- Transform data into a desirable format.
- Load data into a suitable structure.
加载自定义数据集通常使用torch.utils.data
下的Dataset,DataLoader
。
1 | from torch.utils.data import Dataset,DataLoader |
1.6 自动求梯度
定义了一个损失函数后,通过backward
方法就可以自动求变量的梯度
1 | def f(x): |
1.7 实现一个线性回归
1 | import torch |