python Keras:如何改变随机数每个纪元?

vbopmzt1  于 2023-01-12  发布在  Python
关注(0)|答案(2)|浏览(146)

我在模型中生成一个随机数

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)

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

egdjgwm8

egdjgwm81#

您可以使用回调函数在每个时期(或批处理)结束时调用函数,每次生成一个新的随机数。关于回调函数及其提供的选项的读取模式here
您可以在函数内部将xx设置为全局。
1.在每个时期结束时生成随机数
1.某些条件在rand_int上运行,xx为update

  1. xx是一个全局变量,在每个时期结束时不断更新
    1.在训练结束时将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的最终状态也会被返回。

ivqmmu1c

ivqmmu1c2#

因此,这似乎并不是tf.random.uniform的预期行为,实际上它每次都应该生成一个新的随机数。https://github.com/tensorflow/tensorflow/issues/36715
虽然有些人建议改用新的Generator对象来生成随机数,但在我的例子中,这并没有解决问题,全局变量方法对我的例子也不可行。
我所做的是将包含随机数生成的代码封装在一个自定义层的call方法中,正如下面的评论中所提到的:https://github.com/tensorflow/tensorflow/issues/36715#issuecomment-586349200
请注意,这将导致每 * 批 * 一个新的随机数,而不是每一个时期,但根据您的问题,这似乎是足够的,不需要全局变量和回调等。无论如何,我认为其他人可能会受益

相关问题