【问题标题】:Keras: how to change random number every epoch?Keras:如何在每个时期更改随机数?
【发布时间】:2021-01-10 23:38:54
【问题描述】:

我正在使用

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

但是,随机数不会在每个时期都发生变化。如果这样更容易,我将如何在每个时期甚至每个批次中执行此操作?

编辑:

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

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)

我想在每个 epoch 随机更改 X,因此我希望每个 epoch 都有一个不同的随机数。

【问题讨论】:

  • 如果您想在训练期间做某事(epoch 开始或结束,或批次开始或结束等),回调是一种方法。查看下面我的答案以获取示例并链接到回调文档以获取有关如何使用它们的更多选项。

标签: tensorflow keras tensorflow2.0


【解决方案1】:

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

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

  1. Rand_int 在每个 epoch 结束时生成
  2. 在 rand_int 上运行某些条件,并且 xx 是更新
  3. xx 是一个全局变量,在每个 epoch 结束时不断更新
  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 的最终状态。

【讨论】:

  • 嗨@Akshay,我已经尝试过了,当在CustomCallback() 之外访问rand_int 时得到错误NameError: name 'rand_int' is not defined。你知道如何解决这个问题吗?
  • 你想对随机数做什么?要将其存储在列表中吗?
  • 更新了我的答案
  • 我已经更详细地编辑了我的问题。我需要以某种方式访问​​random_func 函数中的随机数。
  • 为什么不把函数放在回调函数本身呢?只需保留一个全局变量 X。然后在 def on_epoch_end() 函数中不断更新它。
【解决方案2】:

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

虽然那里的一些响应建议切换到使用较新的 Generator 对象来生成随机数,但在我的情况下并没有解决它。全局变量方法也不适用于我的情况。

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

请注意,这将导致每个 batch 不是每个时期都有一个新的随机数,但根据您的问题,这似乎就足够了,并且不需要全局变量和回调等。在任何情况下,我认为其他人可能会受益

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 2022-01-17
    • 2014-05-29
    • 2016-12-21
    • 2021-09-09
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多