维度变换
type
status
date
slug
summary
tags
category
icon
password
Property

View/Reshape/Resize_

reshape view之间的区别:
view和reshape都能改变tensor形状。view()只能改变连续的张量,否则需要先调用.contiguous()方法;而.reshape()方法不受此限制;如果对tensor 调用过 transposepermute等操作的话会使该 tensor 在内存中变得不再连续。
reshape/viewresize_之间的区别:
前者在改变形状的时候,总的数据个数不能变,而后者在改变形状的时候是可以只截取一部分数据的
reshape(1,-1)转化成1行;reshape(2,-1)转换成两行;reshape(-1,1)转换成1列;reshape(-1,2)转化成两列
合并与分割
type
status
date
slug
summary
tags
category
icon
password
Property
目录
目录

Cat

cat是concatnate的意思,拼接联系在一起
notion image
notion image
 

Stack

数学运算与统计属性
type
status
date
slug
summary
tags
category
icon
password
Property
目录
目录

Basic

a + b ——torch.add()
a - b ——torch.sub()
a * b ——torch.mul()
a / b ——torch.div()
notion image
 
线性代数与自动求导
type
status
date
slug
summary
tags
category
icon
password
Property
 
目录
目录

 
 
 
torch.Tensor 是包的核心类。如果将其属性 .requires_grad 设置为 True,则会开始跟踪针对 tensor 的所有操作。完成计算后,可以调用 .backward() 来自动计算所有梯度。该张量的梯度将累积到 .grad 属性中。
节省内存和矢量化加速
type
status
date
slug
summary
tags
category
icon
password
Property
 

节省内存

运行一些操作可能会导致为新结果分配内存。 例如,如果用Y = X + Y,将取消引用Y指向的张量,而是指向新分配的内存处的张量:
这是不可取的,机器学习可能有数百兆的参数,并且一秒内多次更新所有参数。 通常情况下,最好原地执行这些更新。如果不原地更新,其他引用仍然会指向旧的内存位置,这样某些代码可能会无意中引用旧的参数。
 
执行原地操作非常简单,可以用切片表示法将操作的结果分配给先前分配的数组,例如Y[:] = <expression>。 下面创建一个新的矩阵Z,其形状与另一个Y相同, 使用zeros_like来分配一个全0的块
 
如果在后续计算中没有重复使用X, 也可以使用X[:] = X + YX += Y来减少操作的内存开销
 
符号式编程
type
status
date
slug
summary
tags
category
icon
password
Property

命令式编程

命令式编程使用诸如print、“+”和if之类的语句来更改程序的状态,考虑下面这段简单的命令式程序:
Python是一种解释型语言(interpreted language)。因此,当对上面的fancy_func函数求值时,它按顺序执行函数体的操作。也就是说,它将通过对e = add(a, b)求值,并将结果存储为变量e,从而更改程序的状态。接下来的两个语句f = add(c, d)g = add(e, f)也将执行类似地操作,即执行加法计算并将结果存储为变量。
notion image
尽管命令式编程很方便,但可能效率不高。一方面原因,Python会单独执行这三个函数的调用,而没有考虑add函数在fancy_func中被重复调用。如果在一个GPU(甚至多个GPU)上执行这些命令,那么Python解释器产生的开销可能会非常大。此外,它需要保存ef的变量值,直到fancy_func中的所有语句都执行完毕。这是因为程序不知道在执行语句e = add(a, b)f = add(c, d)之后,其他部分是否会使用变量ef
 

符号式编程

Dataset&DataLoader
type
status
date
slug
summary
tags
category
icon
password
Property

一般来说PyTorch中深度学习训练的数据读取流程是这样的:
  1. 创建Dateset
  1. Dataset传递给DataLoader
  1. DataLoader迭代产生训练数据提供给模型
 

Dataset

pytorch自带数据集

torchvision.datasets模块提供了一些已有数据集的直接导入:
Pytorch内置损失函数
type
status
date
slug
summary
tags
category
icon
password
Property
目录
目录

很多的 loss 函数都有 size_averagereduce 两个布尔类型的参数。因为一般损失函数都是直接计算 batch 的数据,因此返回的 loss 结果都是维度为 (batch_size, ) 的向量。
  • 如果 reduce = False,那么 size_average 参数失效,直接返回向量形式的 loss;
  • 如果 reduce = True,那么 loss 返回的是标量
    • 如果 size_average = True,返回 loss.mean()
    • 如果 size_average = False,返回 loss.sum()
 
Pytorch最新的版本将弃用这两参数改用reduction:
🐠 优化和凸性
type
status
date
slug
summary
tags
category
icon
password
Property

深度学习的优化目标

尽管优化提供了一种最大限度地减少损失函数的方法,但实质上,优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。
例如,训练误差和泛化误差通常不同,由于优化算法的目标函数通常是基于训练数据集的损失函数,因此优化的目标是减少训练误差。但是,深度学习的目标是减少泛化误差,除了使用优化算法来减少训练误差之外,还需要注意过拟合。
如下图所示所述,经验风险是训练数据集的平均损失,而风险则是整个数据群的预期损失。假设只有有限量的训练数据,经验风险函数不如风险函数平滑。
notion image
 
经验风险、期望风险、结构风险
经验风险:基于样本学习的经验进行决策的错误风险。将经验风险最小化,将会使模型对训练样本的学习能力增强,表现为拟合能力增强。显然,一味的经验风险最小化,会使得模型对训练样本过拟合。
🐠 梯度下降
type
status
date
slug
summary
tags
category
icon
password
Property

一维梯度下降

为什么梯度下降算法可以优化目标函数?
考虑一类连续可微实值函数, 利用泰勒展开可以得到:
即在一阶近似中, 可通过处的函数值和一阶导数得出。
假设在负梯度方向上移动的会减少。 为了简单起见,选择固定步长 ,然后取 , 将其代入泰勒展开式可以得到:
如果其导数没有消失,就能继续展开,这是因为。 此外,总是可以令小到足以使高阶项变得不相关。 因此,
🐠 牛顿法
type
status
date
slug
summary
tags
category
icon
password
Property
目录
目录

 
选择“恰到好处”的学习率 是很棘手的。 如果把它选得太小,就没有什么进展;如果太大,得到的解就会振荡,甚至可能发散。 如果可以自动确定,或者完全不必选择学习率,会怎么样?
除了考虑目标函数的值和梯度、还考虑它的曲率的二阶方法可以帮我们解决这个问题。 虽然由于计算代价的原因,这些方法不能直接应用于深度学习,但为如何设计高级优化算法提供了有用的思维直觉,可以模拟许多理想特性。
 

牛顿法

回顾一些函数 的泰勒展开式,事实上可以把它写成
为了避免繁琐的符号,将 定义为Hessian,是矩阵。
🐠 随机梯度下降与动态学习率
type
status
date
slug
summary
tags
category
icon
password
Property

 

随机梯度更新

在深度学习中,目标函数通常是训练数据集中每个样本的损失函数的平均值。给定 个样本的训练数据集,假设是关于索引 的训练样本的损失函数,其中 是参数向量。然后得到目标函数
的目标函数的梯度计算为
如果使用梯度下降法,则每个自变量迭代的计算代价为 ,它随线性增长。因此,当训练数据集较大时,每次迭代的梯度下降计算代价将较高。