Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 在自定义TF2.4训练循环中应如何使用指数移动平均值_Tensorflow_Tensorflow2.0 - Fatal编程技术网

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]