第二章 预备知识(数据操作、数据预处理)
2.1数据操作
2.1.1张量数据类型
使用n维数组,张量(tensor)数据类型进行深度学习
张量具有一个轴称为向量,两个轴称为矩阵
.arange()函数生成行向量
import torch
x=torch.arange(12)
print(x)
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
.shape属性访问张量沿每个轴的形状
print(x.shape)
torch.Size([12])
.numel()函数查询张量中元素的总数
print(x.numel())
12
.sum()函数对张量中所有元素求和并产生单张量
print(x.sum())
tensor(66)
.reshape()改变张量形状
张量形状改变后,张量的大小不会变
y=x.reshape(3,4)
print(y)
print(y.numel())
tensor([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
12
当我们只需要指定一个维度,另一维度可以使用-1,自动计算得到另一维度
.zeros()生成所有元素为0的张量
print(torch.zeros((2,3,4)))
tensor([[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]],[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]]])
.ones()生成所有元素为1的张量
print(torch.ones((2,3,4)))
tensor([[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]],[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]]])
.randn()生成随机张量
print(torch.randn(3,4))
tensor([[-1.5250, 0.5136, -1.0154, -0.1906],[-0.5657, -0.8168, -0.0836, -0.1606],[-0.4388, -0.5666, 0.3631, -0.8722]])
随机生成的每个元素从均值为0,标准差为1的高斯分布中随机采样
2.1.2运算符
按元素运算
例如加减乘除幂运算等标准运算符,对相应位置元素进行运算
import torch
x=torch.tensor([1,2,4,8])
y=torch.tensor([2,2,2,2])
print(x+y)
print(x-y)
print(x*y)
print(x**y)
print(torch.exp(x))
张量连结
使用.cat()将两个张量连结起来,沿行连结(dim=0),沿列连结(dim=1)
import torch
x=torch.tensor([[1,2,4,8],[2,4,6,8]])
y=torch.tensor([[2,2,2,2],[1,1,1,1]])
print(torch.cat((x,y),dim=0))
print(torch.cat((x,y),dim=1))
tensor([[1, 2, 4, 8],[2, 4, 6, 8],[2, 2, 2, 2],[1, 1, 1, 1]])
tensor([[1, 2, 4, 8, 2, 2, 2, 2],[2, 4, 6, 8, 1, 1, 1, 1]])
2.1.3广播机制
通过适当复制元素来扩展一个或两个数组,以便在转换后,两个张量具有相同的形状
import torch
x=torch.tensor([[0],[1],[2]])
y=torch.tensor([0,1])
print(x+y)
先通过广播机制将数据扩展为相同形状张量后再进行运算
tensor([[0, 1],[1, 2],[2, 3]])
2.1.4索引和切片
和python中其他数组一样,使用[a:b]。其中,包括a,不包含b
import torch
x=torch.tensor([[0, 1],[1, 2],[2, 3]])
print(x[1:3])
tensor([[1, 2],[2, 3]])
也可以进行特定位置元素的更改, :表示这一列所有的值
x[0:2,:]=9
print(x)
tensor([[9, 9],[9, 9],[2, 3]])
2.1.5转换为其他Python对象
pytorch支持numpy数据类型和tensor数据类型的互相转换
.numpy()函数将tensor类型转换为ndarray类型
import torch
x=torch.arange(12)
A=x.numpy()
B=torch.tensor(A)
print(type(A))
print(type(B))
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
.item()函数将数据转换为python中的标量
import torch
x=torch.tensor([3.5])
print(x)
print(x.item())
tensor([3.5000])
3.5
2.2数据预处理
2.2.1读取数据集
使用os库创建数据集
import os
os.makedirs(os.path.join("..","data"),exist_ok=True)#创建文件目录exist_ok=True如果目录已存在不会报错
data_file=os.path.join("..","data","house_tiny.csv")
with open(data_file,'w') as f:f.write("NumRooms,Alley,Price\n")f.write("NA,Pave,127500\n")f.write("2,NA,10600\n")f.write("4,NA,178100\n")f.write("NA,NA,140000\n")
创建名为data_file的csv格式文件并写入数据
使用pandas库读取数据
import pandas as pd
import os
data_file=os.path.join("..","data","house_tiny.csv")
data=pd.read_csv(data_file)
print(data)
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 10600
2 4.0 NaN 178100
3 NaN NaN 140000
2.2.2处理缺失值
插值法:用一个替代值弥补缺失值
删除法:直接忽略缺失值
插值法
对于数值类型的数据用平均值来代替缺失值
inputs=data.iloc[:,0:2]
inputs['NumRooms'] = inputs['NumRooms'].fillna(inputs['NumRooms'].mean())
print(inputs)
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
iloc
是 integer location 的缩写,用于通过行和列的位置索引(整数位置)来选择数据
fillna
用于填充DataFrame或Series中的缺失值(NaN值)
对于类别值,将每种类别视为一列,正确的为1,错误的为0
inputs=pd.get_dummies(inputs,dummy_na=True)
print(inputs)
NumRooms Alley_Pave Alley_nan
0 3.0 True False
1 2.0 False True
2 4.0 False True
3 3.0 False True
pd.get_dummies()
将分类变量转换为虚拟变量,每个类别创建一个新的二进制列。
dummy_na=True
会为缺失值创建单独的虚拟变量列(默认为False)
2.2.3转换为张量格式
先利用pands数据类型的to_numpy()函数将 pandas DataFrame 转换为 NumPy 数组,再将 NumPy 数组转换为 PyTorch 张量
import pandas as pd
import os
import torch
data_file=os.path.join("..","data","house_tiny.csv")
data=pd.read_csv(data_file)
inputs=data.iloc[:,0:2]
inputs['NumRooms'] = inputs['NumRooms'].fillna(inputs['NumRooms'].mean())
inputs=pd.get_dummies(inputs,dummy_na=True)
print(type(inputs))
a=inputs.to_numpy(dtype=float)
print(type(a))
x=torch.tensor(inputs.to_numpy(dtype=float))
print(type(x))
<class 'pandas.core.frame.DataFrame'>
<class 'numpy.ndarray'>
<class 'torch.Tensor'>