【动手学深度学习 | Week1a】02+03+04 数据操作与数据处理

02 深度学习简介

感知领域是什么:人可以快速感知、处理的阶段(英语转中文)。
深度学习、计算机视觉、自然语言处理可以说是目前AI领域最大的三块内容。
【动手学深度学习 | Week1a】02+03+04 数据操作与数据处理_第1张图片
深度学习的应用

  • 图片分类(IMAGENET),目前图片分类的误差已经可以媲美人类的精度了
  • 物体检测和分割(Mask_RCNN)
  • 样式迁移(MxNet-style-transfer)
  • 人脸合成(2018)
  • 文字生成图片(openai)
  • 文字生成(gpt3)
  • 无人驾驶
  • 广告推荐(下面是一个小案例)
    【动手学深度学习 | Week1a】02+03+04 数据操作与数据处理_第2张图片
    机器学习的三类人:业务领域专家、数据科学家、AI专家

03 动手学-安装

  • windows安装参考:(感谢这个踩坑的老哥)
    https://blog.csdn.net/qq_38311396/article/details/120768038
    需要注意的是,pandas这些软件不需要特别注意他们的版本(新的setup.py里面也没有说版本,其实一般电脑都会自动寻找依赖ok的版本,如果版本不对,也会帮你卸掉重新装对的版本),然后每个安装完以后都import一下看看有没有成功,我是自己安装的torch。

04 数据操作

数据维度:标量(0维)、向量(一维)和矩阵(二维)、图片(三维)、批量图片(四维),视频的批量(五维,还有视频)
【动手学深度学习 | Week1a】02+03+04 数据操作与数据处理_第3张图片
图片中的冒号表示的是一个区域。

张量表示一个数值组成的数组,这个数组可能有多个维度。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标量,并且可以用于后续的使用

04-2 数据预处理

预处理原始数据开始通常使用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')

然后使用pandasread_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

你可能感兴趣的:(动手学深度学习,人工智能,深度学习,计算机视觉)