有没有办法堆叠两个 tensorflow 数据集?

Posted

技术标签:

【中文标题】有没有办法堆叠两个 tensorflow 数据集?【英文标题】:Is there a way to stack two tensorflow datasets? 【发布时间】:2018-07-24 02:24:28 【问题描述】:

我想在 Tensorflow 中堆叠两个数据集对象(R 中的 rbind 函数)。我从 tfRecord 文件创建了一个数据集 A,从 numpy 数组创建了一个数据集 B。两者都有相同的变量。你知道是否有办法将这两个数据集堆叠起来创建一个更大的数据集?或者创建一个从这两个来源随机读取数据的迭代器?

谢谢

【问题讨论】:

发布您尝试的代码,其中包含特定的错误或问题。太宽泛了。 【参考方案1】:

tf.data.Dataset.concatenate() 方法是处理数据集时最接近 tf.stack() 的模拟方法。如果您有两个具有相同结构的数据集(即每个组件的类型相同,但形状可能不同):

dataset_1 = tf.data.Dataset.range(10, 20)
dataset_2 = tf.data.Dataset.range(60, 70)

然后你可以按如下方式连接它们:

combined_dataset = dataset_1.concatenate(dataset_2)

【讨论】:

除了 mrry 的回答之外,还有 tensorflow.org/api_docs/python/tf/data/Dataset#interleave 允许您合并数据集而不是连接数据集。然后您可以Dataset.shuffle() 随机化一批交错记录。 我不认为tf.data.Dataset.concatenate()tf.stack() 有任何相似之处。 concatenate() 使用现有维度,stack() 创建一个新维度。这在numpy 中完全一样,比较np.concatenate()np.stack() 从我的张量板分析来看,似乎每个时期都会发生连接。有没有办法在预处理时只执行一次?【参考方案2】:

如果堆叠是指tf.stack()np.stack() 的作用:

将 rank-R 张量的列表堆叠到一个 rank-(R+1) 张量中。

https://www.tensorflow.org/api_docs/python/tf/stack

沿新轴加入一系列数组。

https://docs.scipy.org/doc/numpy/reference/generated/numpy.stack.html

那么我相信您可以使用tf.data.Dataset 最接近的是Dataset.zip()

@staticmethod
zip(datasets)

通过将给定数据集压缩在一起创建Dataset

https://www.tensorflow.org/api_docs/python/tf/data/Dataset?version=stable#zip

这允许您通过迭代原始数据集的共享维度来同时迭代多个数据集,类似于stack()ed 张量或矩阵。

您还可以使用.map(tf.stack).map(lambda *t: tf.stack(t, axis=-1)) 分别在前面或后面沿新维度堆叠张量,

如果您确实想实现tf.concat()np.concatenate() 所做的事情,那么您可以使用Dataset.concatenate()

【讨论】:

【参考方案3】:

假设您有两个元素形状分别为 (bs,d0,d1) 和 (bs,d0',d1) 的数据集,并且您想要一个元素形状为 (bs,d0+d0',d1) 的新数据集可以使用 tf.Dataset.zip 然后在第二个轴上连接每个元素,如下例所示:

import tensorflow as tf

a = tf.zeros((100,4,8))
b = tf.ones((100,1,8))

d1 = tf.data.Dataset.from_tensor_slices(a)
d1 = d1.batch(16,drop_remainder=True)      # elements shape (16,4,8)

d2 = tf.data.Dataset.from_tensor_slices(b)
d2 = d2.batch(16,drop_remainder=True)      # elements shape (16,1,8)

d = tf.data.Dataset.zip((d1,d2))
d = d.map(lambda x,y:tf.concat([x,y],axis=-2)) # elements shape (16,4+1,8)

it = iter(d)
x = next(it)
print(x.shape)
print(x)

如果您想将两个具有相同元素形状 (bs,d0,d1) 的数据集堆叠成一个具有元素形状 (bs,d0,d1,2) 的新数据集,您可以压缩这两个数据集,然后放样元素

import tensorflow as tf

a = tf.zeros((100,4,8))
b = tf.ones((100,4,8))

d1 = tf.data.Dataset.from_tensor_slices(a)
d1 = d1.batch(16,drop_remainder=True)      # elements shape (16,4,8)

d2 = tf.data.Dataset.from_tensor_slices(b)
d2 = d2.batch(16,drop_remainder=True)      # elements shape (16,4,8)

d = tf.data.Dataset.zip((d1,d2))
d = d.map(lambda x,y:tf.stack([x,y],axis=-1)) # elements shape (16,4,8,2)

it = iter(d)
x = next(it)
print(x.shape)
print(x)

【讨论】:

以上是关于有没有办法堆叠两个 tensorflow 数据集?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在使用 JavaScript 的 Google 图表堆叠折线区域图中只显示没有区域的线?

不平衡图像数据集 (Tensorflow2)

机器学习在用到mnist数据集报错No module named 'tensorflow.examples.tutorials'解决办法

堆叠的水平条形图,图例在图内。我如何使这个情节更明显[重复]

在一页中堆叠 vuetify 元素

如何在 TensorFlow 2 中保存/加载模型的一部分?