一. 概念:张量、算子
写出定义,并用通俗易懂的语言描述自己的理解。
张量的定义:在深度学习框架中,数据经常用张量(Tensor)的形式来存储。张量是矩阵的扩展与延伸,可以认为是高阶的矩阵。1阶张量为向量,2阶张量为矩阵。
理解:那么张量是类似于Numpy的多维数组(ndarray)的概念,可以具有任意多的维度。
算子定义:深度学习算法由一个个计算单元组成,我们称这些计算单元为算子(Operator,简称OP)。在网络模型中,算子对应层中的计算逻辑。
理解:卷积层(Convolution Layer)是一个算子;全连接层(Fully-connected Layer, FC layer)中的权值求和过程,是一个算子。再例如:tanh、ReLU等,为在网络模型中被用做激活函数的算子。
二. 使用pytorch实现张量运算
1.2 张量
1.2.1 创建张量
1.2.1.1 指定数据创建张量
import torch #导入python包
x = torch.arange(12) #使用 arange 创建一个行向量 x
print(x)
运行结果:
1.2.1.2 指定形状创建
x=torch.ones((2, 3, 4)) #创建一个形状为(2,3,4)的张量,其中所有元素都设置为1。
print(x)
运行结果:
1.2.1.3 指定区间创建
x=torch.randn(3, 4) #创建一个形状为(3,4)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。
print(x)
运行结果:
1.2.2 张量的属性
1.2.2.1 张量的形状
x=torch.randn(3, 4)
print(x.shape) #通过张量的shape属性来访问张量(沿每个轴的长度)的形状 。
运行结果:
1.2.2.2 形状的改变
X = x.reshape(2, -1) #可以把张量x从形状为(3,4)的行向量转换为形状为(2,6)的矩阵。
print(X)
运行结果:
1.2.2.3 张量的数据类型
x=torch.randn(3, 4)
print(torch.tensor(x).dtype) #查看张量的数据类型
运行结果:
1.2.2.4 张量的设备位置
x=torch.randn(3, 4)
print(x.device) #获取张量的设备位置
运行结果:
1.2.3 张量与Numpy数组转换
a = torch.tensor([3.5]) #创建一个张量
print(a)
print(a.item())#调用item函数将张量转换成python NumPy标量
运行结果:
1.2.4 张量的访问
1.2.4.1 索引和切片
X = torch.arange(12)
print(X[-1]) #用[-1]选择最后一个元素
print(X[1:3]) #用[1:3]选择第二个和第三个元素
运行结果:
1.2.4.2 访问张量
X = torch.arange(12)
print(X[8]) #运用索引访问张量中的任意一个元素
运行结果:
1.2.4.3 修改张量
X = torch.arange(12)
X[2] = 10 #将第三个元素改为10
print(X)
运行结果:
1.2.5 张量的运算
1.2.5.1 数学运算
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print(x + y) #加法运算
print(x - y) #减法运算
print(x * y) #乘法运算
print(x / y) #除法运算
print(x ** y) #求幂运算
运行结果:
1.2.5.2 逻辑运算
X = torch.tensor([1.0, 2, 4, 8])
Y = torch.tensor([2, 2, 2, 2])
print(X == Y) # 对于每个位置,如果X和Y在该位置相等,则新张量中相应项的值为1。 这意味着逻辑语句X == Y在该位置处为真,否则该位置为0。
运行结果:
1.2.5.3 矩阵运算
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone() # 通过分配新内存,将A的一个副本分配给B
print(A * B) #两个矩阵的按元素乘法称为Hadamard积,将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。
运行结果:
1.2.5.4 广播机制
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
'''
由于a和b分别是和矩阵,如果让它们相加,它们的形状不匹配。 我们将两个矩阵广播
为一个更大的矩阵,如下所示:矩阵a将复制列, 矩阵b将复制行,然后再按元素相加。
'''
print(a+b)
运行结果:
三. 使用pytorch实现数据预处理
1. 读取数据集 house_tiny.csv、boston_house_prices.csv、Iris.csv
import pandas as pd
#要从创建的CSV文件中加载原始数据集,我们导入pandas包并调用read_csv函数。
a = pd.read_csv(r'D:\刘子豪\应用程序\pycharm\python项目\liu\Iris.csv')
print(a)
b= pd.read_csv(r'D:\刘子豪\应用程序\pycharm\python项目\liu\boston_house_prices.csv')
print(b)
c=pd.read_csv(r'D:\刘子豪\应用程序\pycharm\python项目\liu\house_tiny.csv')
print(c)
运行结果:
2. 处理缺失值
c=pd.read_csv(r'D:\刘子豪\应用程序\pycharm\python项目\liu\house_tiny.csv')
'''
通过位置索引iloc,我们将data分成inputs和outputs, 其中前者为data的前两列,
而后者为data的最后一列。 对于inputs中缺少的数值,我们用同一列的均值替换“NaN”项。
'''
inputs, outputs = c.iloc[:, 0:2], c.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
运行结果:
inputs, outputs = c.iloc[:, 0:2], c.iloc[:, 2]
inputs = pd.get_dummies(inputs, dummy_na=True)
'''
使用get_dummies()函数对类别特征进行哑变量处理
dummy_na表示是否为NaN增加一列,默认为False
'''
print(inputs)
运行结果:
3. 转换为张量格式
X= torch.tensor(inputs.values)
y=torch.tensor(outputs.values)
print(X, y)
运行结果:
三.感悟
这次的实验让我收获很多,具体为增强了自己对张量,算法概念的理解,新学习了广播机制的概念,对于pytorch的基本运算进一步提高,学习了如何用pytorch实现数据预处理。