Machine learning PyTorch中寄存器\参数和寄存器\缓冲区之间的区别是什么?

Machine learning PyTorch中寄存器\参数和寄存器\缓冲区之间的区别是什么?,machine-learning,deep-learning,neural-network,pytorch,Machine Learning,Deep Learning,Neural Network,Pytorch,模块在训练过程中会发生变化,也就是说,它们是在神经网络训练过程中学习到的东西,但什么是一个 它是在神经网络训练期间学习的吗?Pytorch forregister\u buffer()方法读取 这通常用于注册不应被视为模型参数的缓冲区。例如,BatchNorm的running_mean不是参数,而是持久状态的一部分 正如您已经观察到的,在培训过程中使用SGD学习和更新模型参数。 但是,有时还有其他数量是模型“状态”的一部分,应该是 -保存为状态的一部分 -移动到cuda()或cpu()和模型的其

模块在训练过程中会发生变化,也就是说,它们是在神经网络训练过程中学习到的东西,但什么是一个

它是在神经网络训练期间学习的吗?

Pytorch for
register\u buffer()
方法读取

这通常用于注册不应被视为模型参数的缓冲区。例如,BatchNorm的
running_mean
不是参数,而是持久状态的一部分

正如您已经观察到的,在培训过程中使用SGD学习和更新模型参数。
但是,有时还有其他数量是模型“状态”的一部分,应该是
-保存为
状态的一部分
-移动到
cuda()
cpu()
和模型的其余参数。
-使用模型的其余参数强制转换为
float
/
half
/
double

将这些“参数”注册为模型的
缓冲区
允许pytorch跟踪它们并像常规参数一样保存它们,但阻止pytorch使用SGD机制更新它们


在模块中可以找到一个缓冲区示例,其中
running_mean
running_var
num_batches_tracked
被注册为缓冲区,并通过累积通过层转发的数据统计信息来更新。这与使用常规SGD优化学习数据仿射变换的
权重
偏差
参数形成对比。

为模块创建的参数和缓冲区(
nn.module

假设您有一个线性层
nn.linear
。您已经有了
权重
偏差
参数。但如果需要一个新参数,可以使用它注册一个新的命名参数,即张量

当您注册一个新参数时,它将出现在
module.parameters()
iterator中,但当您注册一个缓冲区时,它不会出现

区别在于:

是命名的张量,不会在每一步更新渐变,如参数。 对于缓冲区,您可以创建自定义逻辑(完全由您决定)

好的方面是,当您保存模型时,所有参数和缓冲区都会保存,当您将模型移动到CUDA或从CUDA移出时,参数和缓冲区也会随之移动