Machine learning PyTorch中寄存器\参数和寄存器\缓冲区之间的区别是什么?
模块在训练过程中会发生变化,也就是说,它们是在神经网络训练过程中学习到的东西,但什么是一个 它是在神经网络训练期间学习的吗?Pytorch forMachine 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()和模型的其
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移出时,参数和缓冲区也会随之移动