数据预处理的最终目的是将我们正在处理的任何数据转换成能够感知我们神经网络的张量
基本概念
CNN的输入tensor
一般CNN的输入是一个4阶张量,分别用一个字母代表每个axis上的长度,那么它的shape为:
[B,C,H,W]
其中 H 和 W 分别代表输入的单张图片的 height(高)和 width(宽)的像素数。
C 代表 color,是指图片的颜色通道数量。对于彩色图片,通常是 C = 3(分别是RGB通道);如果是灰度图片,那么 C = 1。但 C 只在输入层中是这个含义,图片进入CNN传播之后这个axis的意义会变化。于是可以通过 C、H、W 这三个axis来索引单张图片某一个像素点的像素值,通过 C 索引颜色通道,通过 H 和 W 索引这个颜色通道下第几行第几列的亮度数值。
B 代表 batch size,因为一次向神经网络中会不只输入一张图片,而是同时输入一批图片进行并行计算,因此 B 的数值就代表一次输入了几张图片。
color channel的变化
color channel在图片在CNN的传播中会发生变化,是因为CNN中使用不同的filter对图像进行卷积操作,每个filter进行卷积之后都会输出一个output channel,称为feature map。于是原来的每一个color channel就被替换成了多个feature map。假设CNN中使用了 F 个filter,那么经过一次卷积之后tensor的shape会变成:B, F*C, H, W]
根据卷积操作的不同,输出tensor中的 H 和 W 长度也可能会发生变化。
创建操作
PyTorch中的tensor attributes
我们创建的一个空的tensor t:
> import torch
>t = torch.Tensor()
>type(t)
torch.Tensor
查看三个属性:
> print(t.dtype)
>print(t.device)
>print(t.layout)
torch.float32
cpu
torch.strided
利用已有 data 创建 PyTorch tensor
- torch.Tensor(data)
- torch.tensor(data)
- torch.as_tensor(data)
- torch.from_numpy(data)
创建 tensor 的实例如下:
> import torch
>import numpy as np
>data = np.array([1,2,3])
>type(data)
numpy.ndarray
用4种方法转化为torch.Tensor:
t1 = torch.Tensor(data) # 构造类
t2 = torch.tensor(data) # 工厂函数
t3 = torch.as_tensor(data) # 工厂函数
t4 = torch.from_numpy(data) # 工厂函数
>print(t1)
>print(t2)
>print(t3)
>print(t4)
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)
区别在于,torch.Tensor(data)是torch.Tensor这个类的 class constructor,使用默认的参数创建一个 tensor。如前所述torch.Tensor类的默认数据类型是 float32(32位浮点数),所以输出的是 [1., 2., 3.],小数点就代表浮点数。
查看默认数据类型:
> torch.get_default_dtype()
torch.float32
验证 torch.Tensor 创建的数据类型:
>t1.dtype == torch.get_default_dtype()
True
后面三种是 factory function,根据输入的 data 创建一个torch.Tensor返回给 caller,并且直接继承 data 的属性(type inference),也可以用给定参数指定属性。
指定创建的 tensor 的数据类型为 float32:
torch.tensor(data, dtype=torch.float32)
torch.as_tensor(data, dtype=torch.float32)
利用预设创建tensor
- torch.eye()函数可以创建单位二阶张量(单位矩阵),括号内指定axis的length。例如创建 2x2 单位阵:
> print(torch.eye(2))
tensor([[1., 0.],
[0., 1.] ])
- torch.zeros()函数创建全零张量,例如创建 2x2 全零二阶张量:
print(torch.zeros([2,2]))
tensor([[0., 0.],
[0., 0.]])
- torch.ones()函数创建全1张量, 例如创建 2x2 全1张量:
print(torch.ones([2,2]))
tensor([[1., 1.],
[1., 1.]])
- torch.rand()函数创建随机数值张量,例如创建 3x3 随机数据张量:
print(torch.rand([3,3]))
tensor([[0.6006, 0.0577, 0.0226],
[0.1377, 0.9634, 0.5406],
[0.4780, 0.5221, 0.4703]])