数据操作
N维数组处理:
机器学习和神经网络的主要数据结构 RGB图片(3d) 批量RGB图片通道(4d) 视频批量(5d)
创建数组:
- 形状:3×4矩阵
- 每个元素的数据类型:例如32位浮点数
- 每个元素的值:如0
访问元素:
”:“的使用 a:b 表示(a,b) a:b:k k为步长
代码语句声明:
import torch
x = torch.arrange(12) # 产生长度为12的一维矩阵
x.shape # 输出x 的形状
x.numel() # number of elements
要改变一个张量的形状而不改变元素数量和元素值可使用reshape函数
X = x.reshape(3,4)
赋值时可以用python列表赋值(类似于matlab的矩阵)
注意到tensor()只接收一个参数 如果要使用多维矩阵要嵌套列表
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
算术运算:
所有的算术运算都是以元素为单位运行
x = torch.tensor([1.0, 2, 4, 8]) # 1.0为了改变整个张量的类型
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x**y
X = torch.arange(12, dtype=torch.float32).reshape((3, 4)) # 产生一个三行四列的张量 值从0到11 arange(a) 产生[0, a-1)的一维张量
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=1) # dim为两者连接的维度 0为行 1为列
x.sum()对张量x的所有元素进行求和产生只有一个元素的张量(tensor)
广播机制 : 两矩阵形状不同时,会触发广播机制来执行按元素操作
reshape的语法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnhzNXw3-1653483722885)(C:\Users\13097\AppData\Roaming\Typora\typora-user-images\image-20220523200918967.png)]
a = torch.arange(3).reshape((3, 1)) # 将元组(3, 1)传给newshape变量
**python内存问题: ** 运行一些操作会导致为新结果分配内存
before = id(Y)
Y = Y + X
id(Y) == before # result: false
虽然python不涉及内存管理问题,但同时生成较多大矩阵时仍然要避免一些浪费的情况
改写情况:原地操作
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))
发现两者id相同,这里是因为我们改写之后的语句中Z[:] = X + Y是对值的改写 而不是对张量的声明
将pytorch张量转换为numpy张量:
A = X.numpy()
B = torch.tensor(A) # 可以转换回来
数据预处理
- 需求:创建一个人工数据集,并存储在csv**(逗号分割值)**文件
import os
os.makedirs(os.path.join('..', 'data'), 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,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')
-
从创建的csv文件中加载原始数据集
# 如果没有安装pandas,只需取消对以下行的注释来安装pandas # !pip install pandas import pandas as pd data = pd.read_csv(data_file) # 读取psv文件 print(data)
-
处理缺失数据(插值 删除)
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # 将前两列放到inputs里 最后一列放入outputs inputs = inputs.fillna(inputs.mean()) # 将inputs的na值填入没有放na的均值 (数值域) print(inputs)
插值只能对数值进行处理 对于非数值往往采取将n个元素划为一个n维数组
inputs = pd.get_dummies(inputs, dummy_na=True) # 将“NaN”视为一个类别 pandas自动将Alley类转化为数值 print(inputs)
运行结果:
NumRooms Alley_Pave Alley_nan 0 3.0 1 0 1 2.0 0 1 2 4.0 0 1 3 3.0 0 1
[对于inputs
中的类别值或离散值,我们将“NaN”视为一个类别。] 由于“巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”, pandas
可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。 巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。
-
转换为张量格式
上述步骤结束后inputs与outputs均已全部转化为数值,可以将其转换为张量格式
import torch X, y = torch.tensor(inputs.values), torch.tensor(outputs.values) print(X, y)
运行结果:
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))
果:
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))