我正在使用在我的模型中生成一个随机数
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,所以我希望每个历元都有一个不同的随机数。
您可以在每个epoch(或批处理(结束时使用回调来调用一个函数,该函数每次都会生成一个新的随机数。阅读有关回调的模式及其在此处提供的选项。
您可以在函数内将xx设置为全局。
- Rand_int在每个历元结束时生成
- 一些条件在rand_int上运行,xx是更新
- xx是一个全局变量,在每个历元结束时不断更新
- 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根据每个epoch的函数更改值。同时返回xx的最终状态。
因此,这似乎实际上不是tf.random.uniform的预期行为。事实上,它每次都应该生成一个新的随机数。请在tensorflow github上查看此问题:https://github.com/tensorflow/tensorflow/issues/36715
虽然有些回应建议改用较新的Generator对象生成随机数,但在我的情况下,这并没有解决问题。全局变量方法对我的情况也不可行。
为我修复的是将包含随机数生成的代码封装在自定义层的调用方法中,如本评论中所述:https://github.com/tensorflow/tensorflow/issues/36715#issuecomment-586349200
请注意,这将导致每个批次都有一个新的随机数而不是每个历元,但根据您的问题,这似乎已经足够了,不需要全局变量和回调等。无论如何,我认为其他人可能会受益于