Tensorflow 2.0 Keras BatchNorm:如何在定制培训中更新在线参数?

Tensorflow 2.0 Keras BatchNorm:如何在定制培训中更新在线参数?,keras,tensorflow2.0,batchnorm,Keras,Tensorflow2.0,Batchnorm,如何在不使用任何keras.compile方法的情况下训练批处理规范层?通常,层具有可访问的损耗。这里的loss方法是空的 更新: 这似乎有很多困惑,甚至BatchNorm的实现方式也相当混乱 首先,只有一种方法可以训练在线参数(在训练=假模式下使用)来缩放和移动特征:在训练=真模式下调用层。如果您永远不想使用批处理规范化的“批处理”部分(即,您只需要一个在线规范化程序,它可以用一个正常的log prob丢失来训练自己,那么您基本上不能在一次调用AFAIK中做到这一点 使用training=Fa

如何在不使用任何keras.compile方法的情况下训练批处理规范层?通常,层具有可访问的损耗。这里的loss方法是空的

更新:

这似乎有很多困惑,甚至BatchNorm的实现方式也相当混乱

首先,只有一种方法可以训练在线参数(在训练=假模式下使用)来缩放和移动特征:在训练=真模式下调用层。如果您永远不想使用批处理规范化的“批处理”部分(即,您只需要一个在线规范化程序,它可以用一个正常的log prob丢失来训练自己,那么您基本上不能在一次调用AFAIK中做到这一点

使用training=False调用层不会更新参数。使用training=True调用层会提取参数,但随后会得到批量赋范层(不使用在线位置和比例)

更新:

显示keras层有时会有损失(当子任务存在时,如调节):

[335]中的
:l=tf.keras.layers.Dense(8,kernel\u regularizer=tf.keras.regularizers.L1L2())
In[336]:l(np.random.randn(2,4))
出[336]:
在[337]中:l.损失
出[337]:[]
In[338]:l=tf.keras.layers.致密(8)
In[339]:l(np.random.randn(2,4))
出[339]:
在[340]中:l.损失
出[340]:[]

BatchNorm进行训练,但没有损失。它只跟踪加权移动平均中连续批次的平均值和标准偏差。不涉及损失/梯度。

BatchNorm进行训练,但没有损失。它只跟踪加权移动平均中连续批次的平均值和标准偏差。没有损失/梯度偏差已解决。

Keras层从未有过损失,因此不知道您在谈论什么概念,您能澄清一下吗?Keras层有损失。将粘贴简单代码以显示在udpate中。批处理规范有一个必须训练的损失…即训练=错误情况,其中学习的参数用于定位和缩放特征。如果通过应该在文档中明确的侧频道在线更新。不,批处理规范一点也没有损失。您可能正在寻找的是批处理规范总体的更新op。好的,是的,这就是我正在寻找的。看起来很奇怪,他们实现了“op”对于层丢失。例如,如果你用一个bijector实现这种事情,你可能会使用一个丢失,但在所有重构之前可能会使用批处理规范?Keras层从来没有丢失过,所以你不知道你在谈论什么概念,你能澄清一下吗?Keras层有丢失。将粘贴简单的代码在udpate中向你展示吗.Batch norm有一个必须训练的损失…即训练=错误情况,在这种情况下,学习的参数用于定位和缩放特征。如果它通过侧通道在线更新进行训练,则应在文档中明确说明。否,Batch norm根本没有损失。您可能要查找的是Batch norm populati的更新op在mean和stdAh好的,是的,这就是我要找的。他们执行“op”似乎很奇怪对于层丢失。例如,如果你用一个bijector实现这种事情,你可能会使用一个丢失,但在所有重构之前可能会使用批处理规范?在线更新在概念上是一个丢失的梯度。我们应该更新文档,明确声明这一层不是“keras丢失”基于并通过自定义更新操作实现它自己的子任务更新。我认为这对于我们这些来自TF2和TFP(双对象等)的人来说特别不自然例如,RealNVP在结构上与training=False模式下的批处理规范非常相似。请参见此处:在线更新在概念上是一种损失梯度。我们应该更新文档,明确声明该层不是“keras损失”基于并通过自定义更新操作实现其自身的子任务更新。我认为这对于我们这些来自TF2和TFP(bijectors等)的人来说特别不自然。例如,RealNVP在结构上与training=False模式下的批处理规范非常相似。请参阅此处:
import tensorflow as tf

class Model(tf.keras.models.Model):
    def __init__(self):
        super().__init__()
        self.dense = tf.keras.layers.Dense(4)
        self.bn = tf.keras.layers.BatchNormalization()
    def call(self, x, training=False):
        x = self.dense(x)
        x = self.bn(x, training=training)
        return x

model = Model()    
x = 10 * np.random.randn(30, 4).astype(np.float32)

print(tf.math.reduce_std(model(x)))
tf.keras.backend.set_learning_phase(1)
print(tf.math.reduce_std(model(x)))
print(tf.math.reduce_std(model(x)))
tf.keras.backend.set_learning_phase(0)
print(tf.math.reduce_std(model(x)))
print(tf.math.reduce_std(model(x)))


tf.Tensor(9.504262, shape=(), dtype=float32)
tf.Tensor(0.99999136, shape=(), dtype=float32)
tf.Tensor(0.99999136, shape=(), dtype=float32)
tf.Tensor(5.4472375, shape=(), dtype=float32)
tf.Tensor(5.4472375, shape=(), dtype=float32)
In [335]: l = tf.keras.layers.Dense(8, kernel_regularizer=tf.keras.regularizers.L1L2())

In [336]: l(np.random.randn(2, 4))

Out[336]:
<tf.Tensor: id=2521999, shape=(2, 8), dtype=float32, numpy=
array([[ 1.1332406 ,  0.32000083,  0.8104123 ,  0.5066328 ,  0.35904446, -1.4265257 ,  1.3057183 ,  0.34458983],
       [-0.23246719, -0.46841025,  0.9706465 ,  0.42356712,  1.705613  , -0.08619405, -0.5261058 , -1.1696107 ]], dtype=float32)>

In [337]: l.losses
Out[337]: [<tf.Tensor: id=2522000, shape=(), dtype=float32, numpy=0.0>]

In [338]: l = tf.keras.layers.Dense(8)

In [339]: l(np.random.randn(2, 4))

Out[339]:
<tf.Tensor: id=2522028, shape=(2, 8), dtype=float32, numpy=
array([[ 1.0674231 , -0.13423748,  0.01775402,  2.5400681 , -0.53589094,  1.4460006 , -1.7197075 ,  0.3285858 ],
       [ 2.2171447 , -1.7448915 ,  0.4758569 ,  0.58695656,  0.32054698,  0.7813705 , -2.3022552 ,  0.44061095]], dtype=float32)>

In [340]: l.losses
Out[340]: []