Keras:如何在每个时期更改随机数?

Keras: how to change random number every epoch?

我正在使用

在我的模型中生成一个随机数
rand_int = tf.random.uniform((), 0, 2, dtype=tf.int32)

但是,随机数并不是每个epoch都变的。如果更容易的话,我将如何在每个时期甚至每个批次中做到这一点?

编辑:

这里有一些关于我想用随机数做什么的更多信息。

def random_func(X):

    if rand_int == 0:
        # Do something X
    if rand_int == 1:
        # Do something else to X

    return X

X = random_func(X)

每个时期我都想随机改变X,所以我每个时期都想要一个不同的随机数。

您可以使用回调在每个时期(或批次)结束时调用一个函数,每次都会生成一个新的随机数。阅读有关回调及其提供的选项的模式 here.

您可以在函数内将 xx 设置为全局。

  1. Rand_int 在每个纪元结束时生成
  2. 某些条件 运行 rand_int 并且 xx 正在更新
  3. xx 是一个全局变量,在每个纪元结束时不断更新
  4. xx 的最终值在训练结束时返回给变量 xx。
import tensorflow as tf
from tensorflow.keras import layers, Model, callbacks

xx = 0

class CustomCallback(callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        rand_int = tf.random.uniform((1,), 0, 1)
        global xx
        if rand_int < 0.5:
            xx = -4999
        if rand_int > 0.5:
            xx = 4999
        print(rand_int.numpy()[0], xx)

X, y = np.random.random((10,5)), np.random.random((10,))

inp = layers.Input((5,))
x = layers.Dense(3)(inp)
x = layers.Dense(3)(x)
out = layers.Dense(1)(x)

model = Model(inp, out)

model.compile(loss='MAE', optimizer='adam')
model.fit(X,y,callbacks=[CustomCallback()], epochs=3, verbose=1)

print('')
print('random function output, final state:',xx)
Epoch 1/3
1/1 [==============================] - 0s 248ms/step - loss: 1.6208
0.53797233 4999
Epoch 2/3
1/1 [==============================] - 0s 5ms/step - loss: 1.6057
0.64474905 4999
Epoch 3/3
1/1 [==============================] - 0s 3ms/step - loss: 1.5907
0.05995667 -4999

random function output, final state: -4999

如您所见,rand_int 导致 xx 根据每个时期的函数更改值。 xx 的最终状态也被返回。

因此,这似乎并不是 tf.random.uniform 的预期行为。实际上,它每次都应该生成一个新的随机数。在 tensorflow github 上看到这个问题:https://github.com/tensorflow/tensorflow/issues/36715

虽然那里的一些回复建议切换到使用更新的生成器对象来生成随机数,但在我的情况下并没有解决它。全局变量方法对我的情况也不可行。

所做的 为我修复的是将包含随机数生成的代码封装在自定义层的调用方法中,如评论中所述:https://github.com/tensorflow/tensorflow/issues/36715#issuecomment-586349200

请注意,这将导致每个 批次 产生一个新的随机数,而不是每个时期,但根据您的问题,这似乎就足够了,并且不需要全局变量和回调等。无论如何,我认为其他人可能会受益