动手学深度学习 | 数据操作+数据预处理 | 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

  1. reshape是不会产生新的对象的,还是和原来同一个内存地址

  1. tensor和array有什么区别?

tensor是有明确的数学定义的,array是计算机的术语。

但是在这里我们不做过多区分,可以简单理解为tensor就是 n-dim array。

  1. 如果新变量生成,旧变量是否会自动释放?

如果旧变量没有使用的话,Python会帮忙释放内存。

所以关于内存管理,在Python这里是不用过分担心的。

posted @ 2021-09-17 10:47  RowryCho  阅读(144)  评论(0编辑  收藏  举报