我正在尋找一種將 aDataset與另一個合并的方法,但只是偶爾從中抽取樣本。
例如,給定這兩個Datasets
ds1 = tf.data.Dataset.range(1, 10).repeat()
ds10 = tf.data.Dataset.range(10, 100, 10).repeat()
我想將樣本添加到樣本中ds10,ds1但僅針對每兩個樣本,這樣結果將是
ds = my_merge(ds1, ds10)
list(ds)
# 11, 2, 23, 4, 35, 6, 47...
這可能嗎?我想避免解決方案丟棄樣本,ds10因為在我的情況下這將是低效的。
編輯結果ds需要是一個Dataset,以便可以應用進一步的輸入管道操作(例如批處理)。
uj5u.com熱心網友回復:
ds10根據跳過引數修改資料集
skip = 2
pattern = np.concatenate(([0], np.ones((skip-1)))).astype(np.int64)
choice_dataset = tf.data.Dataset.from_tensor_slices((pattern)).repeat()
zeros = tf.data.Dataset.range(0,1).repeat()
ds10 = tf.data.Dataset.choose_from_datasets([ds10, zeros], choice_dataset)
#[10, 0, 20, 0, 30, 0, 40, 0, 50]
壓縮并添加兩個資料集值
ds = tf.data.Dataset.zip((ds1,ds10))
ds = ds.map(lambda x,y:x y)
#[11, 2, 23, 4, 35, 6, 47, 8, 59]
uj5u.com熱心網友回復:
您可以創建自己的生成器:
import tensorflow as tf
from functools import partial
ds1_unrepeated = tf.data.Dataset.range(1, 10) # because repeat prevents element_spec
ds1_spec = ds1_unrepeated.element_spec
ds1 = ds1_unrepeated.repeat()
ds10 = tf.data.Dataset.range(10, 100, 10).repeat()
def my_merge(iter1,iter2):
sliced_iter2 = iter(iter2)
sliced_iter1 = iter(iter1)
while True:
yield next(sliced_iter1) next(sliced_iter2)
yield next(sliced_iter1)
ds = tf.data.Dataset.from_generator(partial(my_merge,ds1,ds10),output_signature=ds1_spec)
for element in ds:
print(element)
tf.Tensor(11, shape=(), dtype=int64)
tf.Tensor(2, shape=(), dtype=int64)
tf.Tensor(23, shape=(), dtype=int64)
tf.Tensor(4, shape=(), dtype=int64)
tf.Tensor(35, shape=(), dtype=int64)
tf.Tensor(6, shape=(), dtype=int64)
tf.Tensor(47, shape=(), dtype=int64)
編輯:我已將其更新為資料集,但我認為頂部的答案更有效,這個答案只有在答案應該盡可能懶惰地評估,對輸入知之甚少的情況下,即:合并可以任意復雜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/522936.html
下一篇:訓練后的遷移學習自定義模型
