Tensorflow 在自定义TF2.4训练循环中应如何使用指数移动平均值
我有一个定制的训练循环,可以简化如下Tensorflow 在自定义TF2.4训练循环中应如何使用指数移动平均值,tensorflow,tensorflow2.0,Tensorflow,Tensorflow2.0,我有一个定制的训练循环,可以简化如下 inputs = tf.keras.Input(dtype=tf.float32, shape=(None, None, 3)) model = tf.keras.Model({"inputs": inputs}, {"loss": f(inputs)}) optimizer = tf.keras.optimizers.SGD(learning_rate=0.1, momentum=0.9, nesterov=True
inputs = tf.keras.Input(dtype=tf.float32, shape=(None, None, 3))
model = tf.keras.Model({"inputs": inputs}, {"loss": f(inputs)})
optimizer = tf.keras.optimizers.SGD(learning_rate=0.1, momentum=0.9, nesterov=True)
for inputs in batches:
with tf.GradientTape() as tape:
results = model(inputs, training=True)
grads = tape.gradient(results["loss"], model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
目前尚不清楚该如何将其用于。有人用过这个吗
此外,如果阴影变量仍在内存中,应如何将其恢复到模型中,以及如何检查训练变量是否已正确更新?在训练循环之前创建EMA对象:
ema = tf.train.ExponentialMovingAverage(decay=0.9999)
然后在优化步骤后应用EMA。ema对象将保留模型变量的阴影变量。(此处不需要调用tf.control\u dependencies
,请参阅中的注释)
然后,在模型中使用阴影变量的一种方法是通过调用EMA对象的average
方法将阴影变量分配给模型的变量:
for var in model.trainable_variables:
var.assign(ema.average(var))
model.save("model_with_shadow_variables.h5")
带有定制model.fit的EMA
下面是一个自定义拟合的指数移动平均值的工作示例
DummyModel
import numpy as np
input = keras.Input(shape=(28, 28))
flat = tf.keras.layers.Flatten()(input)
outputs = keras.layers.Dense(1)(flat)
model = EMACustomModel(input, outputs)
model.compile(optimizer="adam", loss="mse", metrics=["mae"])
DummyData
np.random.seed(101)
x = np.random.randint(0, 256, size=(50, 28, 28)).astype("float32")
y = np.random.random((50, 1))
print(x.shape, y.shape)
# train the model
model.fit(x, y, epochs=10, verbose=2)
谢谢你的回答。我怎样才能确定指数移动平均值是否适用?我正在打印模型。可训练的变量[0][0,0,0,0]
,它似乎不受该操作的影响…我有什么遗漏吗?顺便说一句,我的模型中没有设置优化程序。这有什么区别吗(我正在更新我的问题以反映这一点)我将编辑掉model.optimizer
它在这里什么都没有改变。正如我在回答中所说,EMA对象只保存和更新模型的阴影变量的值。如何处理这些阴影变量取决于您。例如,您可能希望在推理时将它们加载到模型中。谢谢您的回答。它帮助我更好地理解这是如何工作的。我更新了这个问题,专门询问应该如何加载阴影变量,我认为这使问题更加完整。你介意回答最后一部分吗?再次感谢。我添加了一个小片段。我希望它能帮助您了解如何在应用程序中使用EMA
import numpy as np
input = keras.Input(shape=(28, 28))
flat = tf.keras.layers.Flatten()(input)
outputs = keras.layers.Dense(1)(flat)
model = EMACustomModel(input, outputs)
model.compile(optimizer="adam", loss="mse", metrics=["mae"])
np.random.seed(101)
x = np.random.randint(0, 256, size=(50, 28, 28)).astype("float32")
y = np.random.random((50, 1))
print(x.shape, y.shape)
# train the model
model.fit(x, y, epochs=10, verbose=2)
...
...
Epoch 49/50
2/2 - 0s - loss: 189.8506 - mae: 10.8830
Epoch 50/50
2/2 - 0s - loss: 170.3690 - mae: 10.1046
model.trainable_weights[:1][:1]