Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >TensorFlow的`sample_from_datasets`在得到一个“`DirectedInterleave选择了一个耗尽的输入”警告时,是否仍然从一个数据集中取样?

TensorFlow的`sample_from_datasets`在得到一个“`DirectedInterleave选择了一个耗尽的输入”警告时,是否仍然从一个数据集中取样?
EN

Stack Overflow用户
提问于 2019-07-30 10:44:21
回答 1查看 3.1K关注 0票数 11

当使用TensorFlow的tf.data.experimental.sample_from_datasets对两个非常不平衡的数据集进行同样的采样时,我最终会得到一个DirectedInterleave selected an exhausted input: 0警告。基于这个GitHub问题,当sample_from_datasets中的一个数据集已经耗尽了示例,并且需要对已经看到的示例进行采样时,就会出现这种情况。

那么,耗尽的数据集是否仍然产生样本(从而保持所需的均衡培训比率),还是数据集没有采样,从而使培训再次变得不平衡?如果是后者,是否有一种方法可以用sample_from_datasets生成所需的均衡训练比率?

注:正在使用TensorFlow 2 Beta。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-30 22:08:38

较小的数据集不会重复--一旦用完,其余的数据集将来自仍然有示例的较大数据集。

您可以通过这样的操作来验证这种行为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def data1():
  for i in range(5):
    yield "data1-{}".format(i)

def data2():
  for i in range(10000):
    yield "data2-{}".format(i)

ds1 = tf.data.Dataset.from_generator(data1, tf.string)
ds2 = tf.data.Dataset.from_generator(data2, tf.string)

sampled_ds = tf.data.experimental.sample_from_datasets([ds2, ds1], seed=1)

然后,如果我们在sampled_ds上迭代,我们会发现,一旦data1耗尽,就不会产生来自它的任何样本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tf.Tensor(b'data1-0', shape=(), dtype=string)
tf.Tensor(b'data2-0', shape=(), dtype=string)
tf.Tensor(b'data2-1', shape=(), dtype=string)
tf.Tensor(b'data2-2', shape=(), dtype=string)
tf.Tensor(b'data2-3', shape=(), dtype=string)
tf.Tensor(b'data2-4', shape=(), dtype=string)
tf.Tensor(b'data1-1', shape=(), dtype=string)
tf.Tensor(b'data1-2', shape=(), dtype=string)
tf.Tensor(b'data1-3', shape=(), dtype=string)
tf.Tensor(b'data2-5', shape=(), dtype=string)
tf.Tensor(b'data1-4', shape=(), dtype=string)
tf.Tensor(b'data2-6', shape=(), dtype=string)
tf.Tensor(b'data2-7', shape=(), dtype=string)
tf.Tensor(b'data2-8', shape=(), dtype=string)
tf.Tensor(b'data2-9', shape=(), dtype=string)
tf.Tensor(b'data2-10', shape=(), dtype=string)
tf.Tensor(b'data2-11', shape=(), dtype=string)
tf.Tensor(b'data2-12', shape=(), dtype=string)
...
---[no more 'data1-x' examples]--
...

当然,您可以让data1重复这样的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sampled_ds = tf.data.experimental.sample_from_datasets([ds2, ds1.repeat()], seed=1)

但是,从评论中可以看出,您已经意识到了这一点,并且它不适用于您的场景。

如果是后者,是否有一种方法可以用sample_from_datasets来产生所需的均衡训练比率?

那么,如果您有两个不同长度的数据集,并且从那时开始平均抽样,那么您似乎只有两个选择:

  • 重复较小的数据集n时间(其中n ≃ len(ds2)/len(ds1))
  • 在较小的数据集耗尽后停止采样。

要实现第一个目标,您可以使用ds1.repeat(n)

要实现第二个目标,您可以使用ds2.take(m) where m=len(ds1)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57278214

复制
相关文章

相似问题

熊猫从一个更大的数据集中随机选择n组。

12

如何从tensorflow数据集中获取样本的文件名?

17

我如何从一个非常庞大的数据集中得到一个无偏的随机样本?

23

Django默认的ArrayField是一个可调用的,但我仍然得到一个警告?

152

从一个数据集中使用多个条件进行选择

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文