数据操作及预处理
- 数据操作
-
主要数据结构—N维数组
- 0-d(标量)—一个类别—1.0
- 1-d(向量)—一个特征向量—[1.0, 2.7, 3.4]
- 2-d(矩阵)—一个样本即为特征矩阵—[ [ 1,2,3 ] [ 4,5,6 ] ]
- 3-d—RGB图片(宽* 高 * 通道数)—[ [ [ 1,2,3 ] [ 4,5,6 ] ][ [ 5,6,7 ] [ 8,9,5 ] ] ]
- 4-d—一个RGB图片的批量(批量大小* 宽 * 高 * 通道)
- 5-d—一个视频批量(批量大小* 时间 * 宽 * 高 * 通道)
-
创建数组三要素
- 形状
- 数据类型
- 每个元素的值
-
访问元素遵循切片原则,注意,切片范围左闭右开,同时注意python中步长在何处定义
-
实践
import torch # 导入 print(torch.__version__) # 查看版本号 #张量表示的是一个数值组成的数组,这个数组可以有多个维度 x = torch.arange(12) # 生成0-12的向量 x.shape # 查看张量的形状 x.numel() # 元素的种类数---12 X = x.reshape(3, 4) # 改变一个张量大形状而不改变元素数量和元素值重写数据的形状---三行四列 torch.zeros((2, 3, 4)) # 创建一个三行四列有两个通道的三维数组 torch.tensor([[1,2,3], [4,5,6], [7,8,9]]) # 通过列表来为所创建的张量中的每个元素赋值---三行两列的二维数组通道数为一 # 标准运算符按照对应位置元素进行运算 x = torch.tensor([1.0, 2.0, 3.0]) y = torch.tensor([2, 2, 2]) x + y , x - y, x * y torch.exp(y) # 指数运算 X = torch.arange(12, dtype=torch.float32).reshape((3, 4)) Y = torch.tensor([[1,2,3,4], [4,5,6,7], [7,8,9,10]]) torch.cat((X,Y), dim=0) # 按行拼接 torch.cat((X,Y), dim=1) # 按列拼接 X.sum() # 对张量中所有元素进行求和会产生只有一个元素的张量 X[-1] # 访问最后一行 X[1:3] # 访问1-2行 Z = torch.zeros_like(X) # 数据都为0但结构和X一致 A = X.numpy() # 转变为numpy类型 B = torch.tensor(A) # 转变torch类型
- 注意广播机制对于错误的矩阵依然可以进行运算
- 运行一些操作可能导致新结果分配内存
before = id(Y) Y = Y + X id(Y) == before # 输出False---代表内存位置其实发生了变化 Z = torch.zeros_like(Y) Z[:] = X + Y # 前后两次Z的内存地址不变 # 也可以将Y = Y + X 改为Y += X这样其实也是内存地址不变
-
数据预处理
- 创建一个人工数据集,并存储在csv(逗号分隔值)文件
import os os.makedirs(os.path.join('..', 'data'), exist_ok=True) data_file = os.path.join('..', 'data', 'house_tiny.csv') # makedirs(path, exist_ok=False)---path : 要创建的目录,绝对路径或者相对路径---exist_ok:如果已经存在怎么处理,默认是 False ,即:已经存在程序报错。当为 True 时,创建目录的时候如果已经存在就不报错。 # os.path.join函数用于路径拼接文件路径,可以传入多个路径 # .csv---每一行是一个数据,行内是用逗号分开的 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,777500\n') f.write('4,NA,347500\n') f.write('NA,NA,140000\n')
- 从创建的csv文件中加载原始数据集
# 读取必须要有pandas # !pip install pandas import pandas as pd data = pd.read_csv(data_file) print(data)
效果图
- NA其实就是缺失的数据,处理缺失数据经典的方法包括插值和删除,这里采用插值
import pandas as pd data = pd.read_csv(data_file) inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # 对读取的数据进行切片分类为输入输出 inputs = inputs.fillna(inputs.mean()) # 对于数值的列,mean方法是平均值补齐的填充的方法 inputs = pd.get_dummies(inputs, dummy_na=True) # 将字符串独热码化 print(inputs)
效果图
- 使用torch将目前这个数值化后的数据集进行读入
# 通过上述操作我们已将数据完全转化成为数值类型,因此可以将他们变为张量格式 import torch x, y = torch.tensor(inputs.values), torch.tensor(outputs.values) # 但是这个操作张量大dtype=float64深度学习中我们一般采用32
-