感知领域是什么:人可以快速感知、处理的阶段(英语转中文)。
深度学习、计算机视觉、自然语言处理可以说是目前AI领域最大的三块内容。
深度学习的应用
数据维度:标量(0维)、向量(一维)和矩阵(二维)、图片(三维)、批量图片(四维),视频的批量(五维,还有视频)
图片中的冒号表示的是一个区域。
张量表示一个数值组成的数组,这个数组可能有多个维度。n维数组一般表示为ndarray
或者tensor
# 张量的创建与使用
import torch
x = torch.arrage(12) #创建行向量
x.shape #形状
x.numel #元素总数
X = x.reshape(3,4) #改变形状但不改变元素数量和元素值
torch.zeros((2,3,4)) #创建全0的,创建全1就是ones,这是一个三维的数组
torch.randn(3, 4) #创建随机数数组
张量之间的运算操作:
torch.tensor([[1,2,3,4],[1,2,4,3]]) #告诉每一行的列表,通过[]改变维度
x = torch.tensor([1.0,2,4,8]) #常见的标准算数符运算(+ - * /)可以被升级为按元素运算, **为幂运算
y = torch.tensor([2,2,2,2])
x + y, x -y, x* y
torch.exp(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) # 将多个张量结合在一起,前者为0维相加,也就是x行堆在一起,后者为1维相加,也就是y列堆在一起,因为这里只有两维,所以如果dim = 2就会报错
X == Y # 判断张量中每个位置的元素是否相等
X.sum() # 对张量中所有元素进行求和,产生一个单元素张量
广播机制
即使形状不同,我们仍然可以通过调用 广播机制(broadcasting mechanism)来执行按元素操作
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
a + b # 这时虽然形状不同,但是会自动堆形状进行赋值和转换
索引和切片
X[-1], X[1:2] # 前者选择最后一个元素,后者选择第二个元素,注意因为[1:3]之间相差2,才是选择第二个和第三个
X[1, 2] = 9 # 第二行第三列的元素
X[0:2, :] = 12 # 第一行和第二行的所有元素
节省内存
运行一些操作可能会导致为新结果分配内存,可以使用切片来解决这个问题
before = id(Y)
Y = Y + X
id(Y) == before # 这个时候Y已经是一个新的Y了
Z = torch.zeros_like(Y) # 使用zeros_like来分配一个全 0 的块
print('id(Z):', id(Z))
Z[:] = X + Y #切片操作,可以将操作的结果分配给先前分配的数组
print('id(Z):', id(Z))
转换为python对象
这里特别指转换为NumPy中的ndarray
A = X.numpy() # A的格式变成了ndarray
a = torch.tensor([3.5])
a.item() # 吧大小为1的张量转化为python标量,并且可以用于后续的使用
预处理原始数据开始通常使用panda
软件包,它可以和张量兼容
读取数据集
# 创建一个人工数据集,并存储在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')
然后使用pandas
的read_csv
函数来进行数据集加载:
import pandas as pd
data = pd.read_csv(data_file)
print(data)
处理缺失数据
典型方法包括插值法
和删除法
# 插值法:
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] #数据分为输入(前两列)和输出(最后一列),idex_location也就是位置索引
inputs = inputs.fillna(inputs.mean()) # 对于所有inputs是NaN的,使用这一列的均值来替换na(fillna)
# 对于inputs中的类别值或离散值,我们将“NaN”视为一个类别,除了类别"Pave"就是类别"Nah",所以最后的结果就可以替换为0 或者1
inputs = pd.get_dummies(inputs, dummy_na=True) # 两个类,如果是pave的话就是1,否则为0
print(inputs)
转换为张量格式
现在inputs和outputs中的所有条目都是数值类型,它们可以转换为张量格式
,然后使用张量函数来操作。
import torch
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values) #默认是64位浮点数
X, y