主要是记录一下我自己的学习历程,简单、快速为主。
1. 序言、安装、符号、前言
我花了一个小时读完了这部分,这部分铺垫了一些宏观的知识,安装部分我没操作,打算后续使用自己的pycharm,符号部分看了一眼,以后记不住再来翻看。前言的监督学习部分写的比较好,对几中机器学习的任务介绍的好,可以看看。 2022年4月27日17点16分。 累计耗时1hour
2.预备知识
2.1 数据操作
2022年4月28日16点34分 耗时1hour
2.1.1 入门
张量(tensor)表示由一个数值组成的数组,这个数组可能有多个维度。 具有一个轴的张量对应数学上的向量(vector); 具有两个轴的张量对应数学上的矩阵(matrix); 具有两个轴以上的张量没有特殊的数学名称。 ps:tensorflow的tensor就是张量,合起来就是张量流。
2.1.2 运算符
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)
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 2., 1., 4., 3.],
[ 1., 2., 3., 4.],
[ 4., 3., 2., 1.]]), tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.],
[ 4., 5., 6., 7., 1., 2., 3., 4.],
[ 8., 9., 10., 11., 4., 3., 2., 1.]]))
英语翻译猜测!: 连接 concatenate 维度 dimension
2.1.3 广播机制
矩阵 a 3x1 b 1x2 a+b 3x2 就是复制一行(列)再运算。
2.1.4索引和切片
和python一样。 A[-1] A[2,3]==A[2][3] 两种表示方法都可以。
2.1.5 节省内存
X[:] = X + Y 可以用id(X)查看内存地址。
2.1.6. 转换为其他Python对象
A = X.numpy() B = torch.tensor(A) type(A), type(B) 输出 (numpy.ndarray, torch.Tensor) 要将大小为1的张量转换为Python标量,我们可以调用item函数或Python的内置函数。大小不为1的张量调用item()会报错。
2.2 数据预处理
2022年4月28日17点05分 耗时 20mins
2.2.1. 读取数据集
查缺补漏: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’)
import pandas as pd
data = pd.read_csv(data_file) print(data)
输出 NumRooms Alley Price 0 NaN Pave 127500 1 2.0 NaN 106000 2 4.0 NaN 178100 3 NaN NaN 140000
2.2.2. 处理缺失值
“NaN”项代表缺失值 一般有插值法和删除法,这里用插值法演示。
2.2.3. 转换为张量格式
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
2.2.4. 小结
pandas软件包是Python中常用的数据分析工具中,pandas可以与张量兼容。 用pandas处理缺失的数据时,我们可根据情况选择用插值法和删除法。
2.2.5 练习
直接粘贴的人家的代码
def drop_col():
n = len(data)
i = 0
for col_name in ('NumRooms','Alley','Price'):
cnt = data[col_name].count()
if(n-cnt)>i:
i = (n-cnt)
j = col_name
data.drop(j,axis=1,inplace=True)
drop_col()
data
NumRooms Price
0 NaN 127500
1 2.0 106000
2 4.0 178100
3 NaN 140000
2.3 线性代数
2022年4月29日09点15分耗时1hour
2.3.1. 标量
严格来说,我们称仅包含一个数值的叫标量(scalar)。 C=5/9*(F-32)。 这里边 C和F是变量(variable), 5、9、32是标量。
2.3.2. 向量
你可以将向量视为标量值组成的列表。 我们将这些标量值称为向量的元素(element)或分量(component)。 在数学表示法中,我们通常将向量记为粗体、小写的符号 (例如,x、y、z)。 我们通过一维张量处理向量。 注意:大量文献认为列向量是向量的默认方向,在本书中也是如此。
2.3.2.1. 长度、维度和形状
向量的长度通常称为向量的维度(dimension)。 与普通的Python数组一样,我们可以通过调用Python的内置len()函数来访问张量的长度。 当用张量表示一个向量(只有一个轴)时,我们也可以通过.shape属性访问向量的长度。 形状(shape)是一个元素组,列出了张量沿每个轴的长度(维数)。 对于只有一个轴的张量,形状只有一个元素。 请注意,维度(dimension)这个词在不同上下文时往往会有不同的含义,这经常会使人感到困惑。 为了清楚起见,我们在此明确一下: 向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量。 然而,张量的维度用来表示张量具有的轴数。 在这个意义上,张量的某个轴的维数就是这个轴的长度。
2.3.3. 矩阵
正如向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。 矩阵,我们通常用粗体、大写字母来表示 (例如,X、Y、Z), 在代码中表示为具有两个轴的张量。 当矩阵具有相同数量的行和列时,其形状将变为正方形; 因此,它被称为方阵(square matrix) 当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose)。 代码是:X.T 对称矩阵(symmetric matrix)等于其转置:
拓展:矩阵是有用的数据结构:它们允许我们组织具有不同模式的数据。 例如,我们矩阵中的行可能对应于不同的房屋(数据样本),而列可能对应于不同的属性。 如果你曾经使用过电子表格软件或已阅读过 2.2节,这应该听起来很熟悉。 因此,尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中, 将每个数据样本作为矩阵中的行向量更为常见。 我们将在后面的章节中讲到这点,这种约定将支持常见的深度学习实践。 例如,沿着张量的最外轴,我们可以访问或遍历小批量的数据样本。
2.3.4. 张量
就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。 张量(本小节中的“张量”指代数对象)为我们提供了描述具有任意数量轴的维数组的通用方法。 例如,向量是一阶张量,矩阵是二阶张量。 张量用特殊字体的大写字母表示(例如,X Y Z), 它们的索引机制和矩阵类似。
2.3.5. 张量算法的基本性质
具体而言,两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号)一个圆圈里边一个点。 代码:A*B 将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。
2.3.6. 降维
求和Σ x.sum() 指定张量沿哪一个轴来通过求和降低维度 A54 A_sum_axis0 = A.sum(axis=0) A04 A4 所有维度求和有两种表示方法 A.sum(axis=[0, 1]) # SameasA.sum() 求平均值 A.mean(), A.sum() / A.numel() 也可以指定维度 A.mean(axis=0), A.sum(axis=0) / A.shape[0]
2.3.6.1. 非降维求和
但是,有时在调用函数来计算总和或均值时保持轴数不变会很有用。 sum_A = A.sum(axis=1, keepdims=True) 后期可以通过广播恢复。 如果我们想沿某个轴计算A元素的累积总和, 比如axis=0(按行计算),我们可以调用cumsum函数。 此函数不会沿任何轴降低输入张量的维度 A.cumsum(axis=0)
A
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]])
A.cumsum(axis=0)
tensor([[ 0., 1., 2., 3.],
[ 4., 6., 8., 10.],
[12., 15., 18., 21.],
[24., 28., 32., 36.],
[40., 45., 50., 55.]])
2.3.7. 点积(Dot Product)
点积(dot product)是相同位置的按元素乘积的和。 注意,我们可以通过执行按元素乘法,然后进行求和来表示两个向量的点积:
x,y,torch.dot(x,y)
(tensor([0., 1., 2., 3.]), tensor([1., 1., 1., 1.]), tensor(6.))
torch.sum(x*y)
tensor(6.)
2.3.8. 矩阵-向量积(matrix-vector product)
代码中使用张量表示矩阵-向量积,我们使用与点积相同的mv函数。 当我们为矩阵A和向量x调用torch.mv(A, x)时,会执行矩阵-向量积。 注意,A的列维数(沿轴1的长度)必须与x的维数(其长度)相同
A,x,torch.mv(A,x)
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]]), tensor([0., 1., 2., 3.]), tensor([ 14., 38., 62., 86., 110.]))
2.3.9. 矩阵-矩阵乘法(matrix-matrix multiplication)
矩阵-矩阵乘法可以简单地称为矩阵乘法,不应与”Hadamard积”混淆。
A,B,torch.mm(A,B)
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.],
[16., 17., 18., 19.]]), tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]]), tensor([[ 6., 6., 6.],
[22., 22., 22.],
[38., 38., 38.],
[54., 54., 54.],
[70., 70., 70.]]))
A.shape,B.shape,torch.mm(A,B).shape
(torch.Size([5, 4]), torch.Size([4, 3]), torch.Size([5, 3]))
2.3.10. 范数
线性代数中最有用的一些运算符是范数(norm)。 非正式地说,一个向量的范数告诉我们一个向量有多大。 这里考虑的大小(size)概念不涉及维度,而是分量的大小
u = torch.tensor([3.0, -4.0])
torch.norm(u)
tensor(5.)
这个是L2范数, L1范数是7 torch.abs(u).sum() tensor(7.)
2.3.10.1. 范数和目标
在深度学习中,我们经常试图解决优化问题: 最大化分配给观测数据的概率; 最小化预测和真实观测之间的距离。 用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。 目标,或许是深度学习算法最重要的组成部分(除了数据),通常被表达为范数
2.3.12. 小结
标量、向量、矩阵和张量是线性代数中的基本数学对象。
向量泛化自标量,矩阵泛化自向量。
标量、向量、矩阵和张量分别具有零、一、二和任意数量的轴。
一个张量可以通过sum和mean沿指定的轴降低维度。
两个矩阵的按元素乘法被称为他们的Hadamard积。它与矩阵乘法不同。
在深度学习中,我们经常使用范数,如L1范数、L2范数和Frobenius范数。
我们可以对标量、向量、矩阵和张量执行各种操作
练习,没做
2.4 微积分
|