使用時numpy.random,我們可以生成多個具有不同上限的隨機整數。我想知道在使用tf.random.uniform. 例如,如果我想生成兩個以 5 和 4 為界的整數,我可以做什么:
import numpy as np
import random
import tensorflow as tf
np.random.randint([5,4])
array([0, 2])
但是,當我使用tensorflow. 這是因為minval并且maxval必須是單個數字。我不想使用 for 回圈,因為我知道它會減慢訓練程序。如果有的話,這里有哪些替代方案?
tf.random.uniform([1,2],minval=[1,1], maxval=[5,4], dtype=tf.int32)
編輯:
時間對比:
import time
start = time.time()
lim =np.random.randint(1, 10000, size=500000)
x = np.random.randint(lim)
print(x.shape)
print("time: ", time.time()-start)
(500000,)
time: 0.03663229942321777
生成 500000 個數字需要 0.03 秒random.randint。如果我使用tf.experimental.numpy.random.randint,則僅生成 15 個數字所花費的時間相同。
l = tf.convert_to_tensor(np.random.randint(1, 2, size=15), tf.int32)
h = tf.convert_to_tensor(np.random.randint(2, 10000, size=15), tf.int32)
bounds = tf.stack([l, h], axis=1)
start = time.time()
z = tf.map_fn(fn=lambda x: tf.experimental.numpy.random.randint(low=x[0], high=x[1]), elems=bounds)
print(tf.shape(z))
print("time: ", time.time()-start)
tf.Tensor([15], shape=(1,), dtype=int32)
time: 0.03790450096130371
uj5u.com熱心網友回復:
minval = tf.constant([1, 1], dtype=tf.float32)
maxval = tf.constant([5, 4], dtype=tf.float32)
for _ in range(10):
random_int = tf.cast(tf.random.uniform(shape=tf.shape(minval)) * (maxval - minval) minval, dtype=tf.int32)
print(random_int)
# tf.Tensor([3 1], shape=(2,), dtype=int32)
# tf.Tensor([2 3], shape=(2,), dtype=int32)
# tf.Tensor([4 2], shape=(2,), dtype=int32)
# tf.Tensor([1 1], shape=(2,), dtype=int32)
# tf.Tensor([2 3], shape=(2,), dtype=int32)
# tf.Tensor([4 3], shape=(2,), dtype=int32)
# tf.Tensor([1 1], shape=(2,), dtype=int32)
# tf.Tensor([1 1], shape=(2,), dtype=int32)
# tf.Tensor([4 2], shape=(2,), dtype=int32)
# tf.Tensor([3 3], shape=(2,), dtype=int32)
使用tf.map_fn來自Flavia Giammarino 的
解決方案是一種通用方法,但在性能上可能不是最優的。
uj5u.com熱心網友回復:
如果您真的不想使用回圈或tf.map_fn,您還可以嘗試創建一個大的均勻隨機張量,并使用每次需要的邊界從中進行采樣。
import tensorflow as tf
random_numbers = tf.random.uniform([500, 1], minval=1, maxval=5, dtype=tf.int32)
samples = 10
random_samples = tf.gather(random_numbers, tf.random.uniform([samples], maxval=random_numbers.shape[0], dtype=tf.int32), axis=0)
lower, upper = 1, 4
tensors = tf.gather_nd(random_samples, tf.where(tf.logical_and(tf.greater(random_samples, lower), tf.less(random_samples, upper))))
print(tensors)
# ... and so on
tf.Tensor([2 3 2 2 2 2 2], shape=(7,), dtype=int32)
uj5u.com熱心網友回復:
您可以使用每個樣本的下限和上限串列定義張量,然后使用tf.map_fn生成亂數tf.experimental.numpy.random.randint。
import tensorflow as tf
bounds = tf.constant([
[1, 5],
[1, 4],
], dtype=tf.int64)
tf.map_fn(fn=lambda x: tf.experimental.numpy.random.randint(low=x[0], high=x[1]), elems=bounds)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/391941.html
