- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
shuffle
对于中等缓冲区大小(例如 1000),以下代码中的步骤运行速度非常慢:
filenames = tf.constant(filenames)
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(_parse_function)
dataset = dataset.batch(batch_size)
dataset = dataset.shuffle(buffer_size)
numpy
打乱数据,代码如下:
idx = np.arange(len(filenames))
np.random.shuffle(idx)
new_filenames = [filenames[i] for i in idx]
next_batch_filenames = new_filenames[:batch_size]
# get the corresponding files in batch
最佳答案
比较的是两种完全不同的操作。
您的 dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
从磁盘读取。像物理长期存储,可能是磁性旋转硬盘驱动器。这很慢。如果您有能力将所有这些存储在 ram 中,或者存储在超快的 raid 式闪存驱动器中,那么您将解决最大的瓶颈。
您还有一个 _parse_function
每次读取数据时都会为每个数据点触发。该解析的计算需要时间,并且取决于其中的内容,它可能很重要。
与 numpy 的比较并不公平,因为您的 numpy 示例不涉及从磁盘读取或解析数据。
这应该是差异的主要部分。如果您已经解决了上述问题,那么下一个寻找更多加速的地方就是这些行
3) dataset = dataset.map(_parse_function)
4) dataset = dataset.batch(batch_size)
5) dataset = dataset.shuffle(buffer_size)
这些是您的代码行。第 4 行生成一批数据,可能是 32 个(肯定是
batch_size
)。然后第 5 行开始并尝试在长度为 1000 的缓冲区中打乱您的 32 批次。每次训练循环请求新的训练批次时都会发生这种情况。洗牌步骤将所有这些大批量洗牌,挑选出第一个并添加一个新的……每……一次……时间。
3) dataset = dataset.map(_parse_function)
4) dataset = dataset.shuffle(buffer_size)
5) dataset = dataset.batch(batch_size)
无论如何,这更好,因为之前批次的内容总是相同的,但顺序是混合的。这样,批次的内容也将随机化。接下来,shuffle 只需要洗牌 1000 个项目,而不是 32x1000 个项目。最后,我们可以挑战是否真的需要 1000 的缓冲区大小。假设我们的数据集是 2000 个项目。 320 的缓冲区大小和 32 的批量大小肯定会很好地随机化我们的数据,有效地让缓冲区中的任何数据有 10% 进入下一个批次,90% 被推回与其他数据混合。这很好。 64 的缓冲区大小和 64 的批次大小似乎几乎没有用,除了项目一次随机地从批次中拉出,因此实际上有可能不会被绘制并与以后的数据混合。只是没有那么多。
关于tensorflow - 为什么 TensorFlow 的 tf.data.Dataset.shuffle 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48240573/
如果我用 dataset.batch(n).prefetch(m), 将预提取m个批次或m个 sample ? 最佳答案 Dataset.prefetch(m) 转换预取其直接输入的m元素。在这种情况
根据 TensorFlow documentation 、tf.contrib.data.Dataset 类的 prefetch 和 map 方法,都有一个名为 buffer_size 的参数. 对于
我正在使用 Flink 0.10.1 的 DataSet API 编写应用程序。我可以在 Flink 中使用单个运算符获取多个收集器吗? 我想做的是如下所示: val lines = env.read
为了使用 Google Colabs TPU,我需要一个 tf.dataset.Dataset .那么如何在这样的数据集上使用数据增强? 更具体地说,到目前为止我的代码是: def get_datas
我有一个包含 2 个相关数据表(主数据表和详细信息)的数据集。我想将与我的过滤器匹配的数据(例如主数据列 A =“XXX”)复制到另一个数据集。 现在我发现这个过程需要很长时间(1k 条记录大约需要一
我正在使用 .pvd文件同时加载多个文件到 Paraviw。对于具有单个数据集的时间序列,该文件看起来像这样: 我想指定要与 a.*.vtu 一起加载的其他文件(
我听说 Google 主办(或将举办)一场网络分类竞赛,他们提供了一个大型(170k+ 文档)网站数据集,这些网站被分为多个类别(体育、计算机、科学等),我尝试环顾四周在他们的 2009 年到 201
谁能给我解释一下 DataSet.Copy() vs Dataset.Clone()也让我知道一些我们可以使用这些的场景 最佳答案 Clone 将创建一个新的空数据集,其架构(表和列)与旧数据集相同。
dataset = dataset.batch(50) dataset = dataset.prefetch(buffer_size=1) 是预取 1 个批次还是 1 个元素? 根据 tensorfl
在 Delphi 中,与 Dataset.Next 相比,使用 Dataset.Prior 是否会降低性能? 背景: 我有一个在数据集中搜索特定记录的例程。我从数据集中的最后一条记录开始,然后使用 D
我正在使用 Spark(2.0) 开发 Spark SQL,并使用 Java API 读取 CSV。 CSV 文件中有一个双引号、逗号分隔的列。例如:“Express Air,Delivery Tru
为什么要使用DataSet.BeginInit 和DataSet.EndInit? 我已经经历了official msdn documentation ,它说 Begins the initializ
我正在尝试向新的数据集 X 添加一个位于不同数据集 Y 中的数据表。如果我直接添加它,我会得到以下错误: DataTable already belongs to another DataSet. 我
我有一个表示为形状为 (num_features, num_examples) 的 NumPy 矩阵的数据集,我希望将其转换为 TensorFlow 类型 tf.Dataset。 我正在努力理解这两种
这是 question 的转发在 ai.stackexchange 中询问。由于该论坛没有太多吸引力,我想我可以在这里尝试一下机会。 我有一个特定对象的不同尺寸的图像数据集。该物体的一些图像也处于不同
我有两个数据集: main_ds = tf.data.Dataset.from_tensor_slices(list(range(1000, 1100))) backgroud_ds = tf.dat
拥有Dataset单列 json 字符串: +--------------------+ | value| +--------------------+ |{"Contex
我正在尝试解决 Azure 数据工厂中的以下场景: 我在 Azure Blob 存储中有大量文件夹。每个文件夹包含不同数量的 parquet 格式的文件。文件夹名称包含生成该文件夹中包含的数据的日期,
我正在尝试解决 Azure 数据工厂中的以下场景: 我在 Azure Blob 存储中有大量文件夹。每个文件夹包含不同数量的 parquet 格式的文件。文件夹名称包含生成该文件夹中包含的数据的日期,
我有一个顺序数据集,我可以从中创建窗口来训练 RNN。在某些情况下,我想扔掉某些 window 。但是,当我使用 dataset.window 和 dataset.filter 时,管道内部会出现一些
我是一名优秀的程序员,十分优秀!