一. 概念:张量、算子
- 张量(Tensor):深度学习中表示和存储数据的主要形式。在动手实践机器学习之前,需要熟悉张量的概念、性质和运算规则,以及了解飞桨中张量的各种API。
- 算子(Operator):构建神经网络模型的基础组件。每个算子有前向和反向计算过程,前向计算对应一个数学函数,而反向计算对应这个数学函数的梯度计算。有了算子,我们就可以很方便地通过算子来搭建复杂的神经网络模型,而不需要手工计算梯度。
张量通俗的说,张量概念是矢量概念和矩阵概念的推广,标量是零阶张量,矢量是一阶张量,矩阵(方阵)是二阶张量,而三阶张量则好比立体矩阵,更高阶的张量用图形无法表达。
算子简单来说就是进行某种“操作”,“动作”。算法中的一个函数、几行可以重复使用的代码、一个数学中的平方操作,这些都可以认为是算子。
二. 使用pytorch实现张量运算
1.创建张量
创建一个张量可以有多种方式,如:指定数据创建,指定形状创建,指定区间创建等。
1.1指定数据创建张量
1.1.1创建一个一维张量
import torch
# 创建一维Tensor
x = torch.tensor([2.0, 3.0, 4.0])
执行结果:
1.1.2创建一个二维张量
#创建二维Tensor
x = torch.tensor([[1.0,2.0,3.0],
[4.0,5.0,6.0]])
print(x)
执行结果:
1.1.3创建多维张量
#创建多维张量
x = torch.tensor([[[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]],
[[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]]])
print(x)
执行结果:
注意:张量在任何一个维度上的元素数量必须相等。下面尝试定义一个在同一维度上元素数量不等的张量。
例如
x = torch.tensor([[1.0,2.0]
[4.0,5.0,6.0]])
print(x)
执行结果:
1.2指定形状创建
m, n = 2, 3
# 创建数据全为0,形状为[m, n]的Tensor
zeros_Tensor = torch.zeros([m, n])
# 创建数据全为1,形状为[m, n]的Tensor
ones_Tensor = torch.ones([m, n])
# 创建数据全为指定值,形状为[m, n]的Tensor,这里我们指定数据为10
full_Tensor = torch.full([m, n], 10)
print('zeros Tensor: ', zeros_Tensor)
print('ones Tensor: ', ones_Tensor)
print('full Tensor: ', full_Tensor)
执行结果:
1.3指定区间创建
# 创建以步长step均匀分隔数值区间[start, end)的一维Tensor
arange_Tensor = torch.arange(start=1, end=5, step=1)
# 创建steps段数的均匀分隔数值区间[start, stop]的Tensor
linspace_Tensor = torch.linspace(start=1, end=5, steps=5)
print('arange Tensor: ', arange_Tensor)
print('linspace Tensor: ', linspace_Tensor)
执行结果:
2.张量的属性
2.1张量的形状
张量具有以下形状属性:
Tensor.ndim
:张量的维度,例如向量的维度为1,矩阵的维度为2。Tensor.shape
: 张量每个维度上元素的数量。Tensor.shape[n]
:张量第n维的大小。Tensor.numel
:张量中全部元素的个数。
创建一个四维张量,并打印出shape
、ndim
、shape[n]
、numel属性。
ndim_4_Tensor = torch.ones([2, 3, 4, 5])
print("Number of dimensions:", ndim_4_Tensor.ndim)
print("Shape of Tensor:", ndim_4_Tensor.shape)
print("Elements number along axis 0 of Tensor:", ndim_4_Tensor.shape[0])
print("Elements number along the last axis of Tensor:", ndim_4_Tensor.shape[-1])
print('Number of elements in Tensor: ', ndim_4_Tensor.numel())
执行结果
2.2形状的改变
要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape
函数。
例如:
# 创建一个从0-11的一维张量
x = torch.arange(12)
print(x)
# 改变x的形状为三行四列
X = x.reshape(3, 4)
print(X)
执行结果:
注意,通过改变张量的形状,张量的大小不会改变。
2.3张量的数据类型
使用type函数即可
x = torch.arange(12)
print(x.type())
执行结果:
2.4张量的设备位置
初始化张量时可以通过place来指定其分配的设备位置,可支持的设备位置有三种:CPU、GPU和固定内存。device可以查询具体的设备。
x = torch.arange(12)
print(x.device)
执行结果:
3.张量与Numpy数组转换
x = torch.arange(12)
y = np.array(x)
Y = torch.Tensor(y)
print(Y)
执行结果:
4.张量的访问
4.1索引和切片
a = torch.Tensor([[6,7,8],
[5,4,3],
[2,1,0]])
a = torch.Tensor([[1,1,4],[5,1,4],[191,98,10]])
b = a.numpy()
print(b)
执行过程:
4.2访问张量
print(a[1])
print(a[1,2])
print(a[[1,2],[0,1]])
执行结果:
4.3修改张量
a = torch.Tensor([[6,7,8],
[5,4,3],
[2,1,0]])
a[0] = -1
a[1] = torch.Tensor([-5,-1,-4])
a[2] = a[2] * (-1)
print(a)
执行结果:
5.张量的运算
5.1数学运算
a = torch.Tensor([[6,7,8],
[5,4,3],
[2,1,0]])
print(a)
a = a * -1
print(a)
a = a - 1
print(a)
a += 1
print(a)
a /= 6
print(a)
执行结果:
5.2逻辑运算
a = torch.Tensor([1,0,1,1,0]).bool()
b = torch.Tensor([0,0,1,0,3]).bool()
print(a)
print(b)
print(a & b) # 与运算
print(a | b) # 或运算
print(~a) # 取反
print(a ^ b) # 异或运算
执行结果:
5.3矩阵运算
矩阵转置
a = ([[6,5,4],
[3,2,1],
[9,8,7]])
b = torch.tensor(a)
print(b.t()) # 矩阵转置
执行结果:
矩阵乘法
a = ([[6,5,4],
[3,2,1],
[9,8,7]])
c = ([[3,4,5],
[5,6,7],
[2,3,4]])
b = torch.tensor(a)
d = torch.tensor(c)
print(torch.mm(b,d))
执行结果:
6.广播机制
处理两个张量维度不同或不匹配时的计算问题时就产生了广播。
a = ([6,5,4])
c = ([[3,4,5],
[5,6,7],
[2,3,4]])
b = torch.tensor(a)
d = torch.tensor(c)
print(b.shape)
print(d.shape)
print(b+d)
执行结果:
7.数据预处理
7.1读取数据集
pandas可以读取很多数据集
读取数据集 house_tiny.csv、boston_house_prices.csv、Iris.csv
这里读取的房子、波士顿房价、鸢尾花数据集均为csv格式
import pandas as pd
df_house_tiny = pd.read_csv('./house_tiny.csv')
df_boston_house_prices = pd.read_csv('./boston_house_prices.csv')
df_iris = pd.read_csv('./Iris.csv')
7.2处理缺失值
pandas对缺失值有两种处理方式:丢弃(dropna)和填充(fillna)。
例如
df_house_tiny = pd.read_csv('./house_tiny.csv')
df_boston_house_prices = pd.read_csv('./boston_house_prices.csv')
df_iris = pd.read_csv('./Iris.csv')
df_house_tiny = df_house_tiny.fillna(
df_house_tiny.iloc[:,0:2].mean())
print(df_house_tiny)
这时缺失值过多
df_house_tiny = pd.get_dummies(df_house_tiny,dummy_na=True).iloc[:,[0,2,3,1]]
print(df_house_tiny)
执行结果:
7.3转换为张量格式
ret = torch.Tensor(df_house_tiny.values)
执行结果:
8.总结
经过第二周对pytorch的学习,我学会了pytorch中张量的各种基本用法,也了解pandas和pytorch的一些代码转换。现在的了解依旧非常浅显,pytorch之中还有很多值得我们去探索。