前言
本章内容为动手学深度学习-预备知识章节
本章内容源自d2l代码包中的
chapter_preliminaries
文件夹
课程源自 动手学深度学习在线课程
代码运行在Google的Colab平台中
数据操作
1 | import torch |
1 | x = torch.arange(15) |
1 | x = x.reshape(3,5) |
1 | print(torch.ones((2,3,4))) |
1 | # 二维数据 |
1 | x = torch.arange(12, dtype=torch.float32).reshape((3,4)) # 【3,4】 |
1 | x.sum() |
广播机制--同一纬度不同大小矩阵的相加机制
如对于一个二维的(3,1)大小矩阵跟(1,2)大小矩阵
会把(3,1)扩展出相同的一列变为(3,2)
同理(1,2)扩展为(3,2)
1 | x = torch.arange(3).reshape((3,1)) |
Python矩阵拆分
1 | x = torch.arange(12).reshape((3,4)) |
内存分配问题
id()相当于c语言的指针
元素赋值不改变地址,整个数组赋值会改变地址
1 | x = torch.arange(12).reshape((3,4)) |
更换张量
1 | A = x.numpy() # 转换为Numpy的张量 |
数据预处理
创建、写入CSV文件 -- os
创建文件夹:
os.makedirs()
创建csv文件:
os.path.join()
写入内容:
with open() as f:
f.write()
1 | import os |
加载csv原数据集 -- pandas
read读入文件:
pd.read_csv()
1 | import pandas as pd |
处理缺失数据 -- .fillna(插值)
常用插值或删除处理缺失数据
取csv表格的某一行或列:
.iloc[ ]
字符串缺失
字符串缺失的可以将字符串分为多个类别,用1-0表示
.get_dummies()
1 | input, output = data.iloc[:, 0:2], data.iloc[:, 2] |
1 | input = pd.get_dummies(input, dummy_na=True) |
将csv数值型表格转换成tensor格式
需要在csv表格nan数据都被处理成数值后才可以转换
torch.tensor()
1 | x, y = torch.tensor(input.values), torch.tensor(output.values) |
线性代数
矩阵转置
对称矩阵的转置等于本身
.T
克隆张量 -- 重新分配内存
B=A是建立view,改变B时A也会变
B=A.clone()
是重新分配内存,改变B时A不会改变axis
axis=0是按行(第一维度)处理,axis=1是按列(第二维度)处理
范数计算
向量的\(L_2\)范式 -- 求元素的平方和的平方根
torch.norm()
向量的\(L_1\)范式 -- 求元素的绝对值之和
torch.abs(u).sum()
矩阵的\(F\)范数 -- 矩阵元素的平方和的平方根
torch.norm(u)
计算和、均值
求和
.sum(axis=)
求均值
.mean(axis=)
矩阵乘法
矩阵×向量
torch.mv()
矩阵×矩阵
torch.mm()
1 | x = torch.arange(12).reshape(3,4) |
1 | y = x.clone() |
1 | u = torch.tensor([3.0,4.0]) |
1 | A = torch.arange(20*2).reshape(2,5,4) |
1 | A = torch.arange(20).reshape(5, 4) # 5*4的矩阵 |
1 | A = torch.arange(20).reshape(5, 4) # 5*4的矩阵 |
微积分
标量对列向量求导:求解结果转置为行向量
列向量对标量求导:求解结果为列向量
由于loss通常是标量,因此深度学习中一般对标量进行求导,而不对矩阵或向量求导
自动微分
存储梯度
requires_grad_(True)
反向传播函数计算y关于x的每个分量的梯度
.backward()
清除x累积的梯度,将梯度清为0
.grad.zero_()
1 | x = torch.arange(4.0, requires_grad=True) |
1 | y = 2 * torch.dot(x, x) # y=x^2 |
1 | y.backward() |
1 | x.grad.zero_() # 清除累积的梯度记录 |
1 | x.grad.zero_() |
1 | x.grad.zero_() |
1 | def f(a): |