动手学深度学习 | 数据操作+数据预处理 | 02
数据操作
图片是三维的: w*h*channel
图片集是四维的:batch_size*w*h*channel
一个视频批量是五维的:batch_size*t*w*h*channel
这里解释最后一个,行::3
表示从第一个开始,每次步长为3,::2
表示从第一个开始,每次步长为2
数据操作实现
操作总结
import torch # 导入torch
x = torch.arange(12) # 创建一个一维张量
x.shape # 查看tensor的shape的元素个数
X = x.reshape(3,4) # 改变一个tensor的形状
torch.zeros((2,3,4)) torch.ones((2,3,4)) torch.randn(3,4) # 创建特定的tensor
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # 将Python的list转换为tensor
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y # tensor的基本运算
torch.exp(x) # e^x
X = torch.arange(12,dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X,Y),dim=0) # 行合并 竖直堆叠
torch.cat((X,y),dim=1) # 列合并 水平拼接
X==Y # 给一个bool tensor,判断其中的元素是否相等
X.sum() # 将所有元素相加, 最后只产生一个元素的tensor
# 广播机制
# 没有维度或维度为1才能进行广播机制(就是按照原来的元素按照维度进行复制)
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a + b # 两张量的shape不一致,符合条件会进行广播机制
X[-1], X[1:3] # 元素的选择
X[1, 2] = 9 # 给指定元素赋值
X[0:2, :] = 12 # 切片赋值
# 什么操作会导致新的变量产生
Y = Y + X # Y会变成新的变量
Z = torch.zeros_like(Y)
Z[:] = Y+X # 修改操作,Z不会是一个新的变量
X += Y # +=这样的操作也不会有新的变量产生
A = X.numpy() # tensor转换为tensor
a = torch.tensor([3.5])
a,a.item(),float(a),int(a) # 将tensor转换为标量
数据预处理实现
操作总结
# 自己创建一个人工数据集
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')
import pandas as pd
data = pd.read_csv(data_file) # 读取csv文件,成df对象
# 将数据分为inputs、outputs
inputs,outputs = data.iloc[:,:2],data[:,2]
inputs = input.fillna(inputs.mean()) # 使用插值的方法补缺失值
# 将字符串的缺失值(缺失值也是一种类别),使用one-hot编码处理
# 要给字符串类别编码就是使用 one-hot 阿!
inputs = pd.get_dummies(inputs,dummy_nan=True)
# 现在inputs,outputs都是数值了,可以直接转换为tensor
import torch
X,y = torch.tensor(inputs.values),torch.tensor(outputs.values)
QA
- reshape是不会产生新的对象的,还是和原来同一个内存地址
- tensor和array有什么区别?
tensor是有明确的数学定义的,array是计算机的术语。
但是在这里我们不做过多区分,可以简单理解为tensor就是 n-dim array。
- 如果新变量生成,旧变量是否会自动释放?
如果旧变量没有使用的话,Python会帮忙释放内存。
所以关于内存管理,在Python这里是不用过分担心的。