有没有办法堆叠两个张量流数据集?
Is there a way to stack two tensorflow datasets?
我想在 Tensorflow 中堆叠两个数据集对象(R 中的 rbind 函数)。我从 tfRecord 文件创建了一个数据集 A,从 numpy 数组创建了一个数据集 B。两者都有相同的变量。您知道是否有办法堆叠这两个数据集以创建更大的数据集?或者创建一个迭代器,从这两个源随机读取数据?
谢谢
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)
如果堆叠是指 tf.stack()
和 np.stack()
所做的:
Stacks a list of rank-R
tensors into one rank-(R+1)
tensor.
https://www.tensorflow.org/api_docs/python/tf/stack
Join a sequence of arrays along a new axis.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.stack.html
那么我相信最接近的 tf.data.Dataset
是 Dataset.zip()
:
@staticmethod
zip(datasets)
Creates a Dataset
by zipping together the given datasets.
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()
.
假设您有两个数据集,其元素形状分别为 (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 中堆叠两个数据集对象(R 中的 rbind 函数)。我从 tfRecord 文件创建了一个数据集 A,从 numpy 数组创建了一个数据集 B。两者都有相同的变量。您知道是否有办法堆叠这两个数据集以创建更大的数据集?或者创建一个迭代器,从这两个源随机读取数据?
谢谢
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)
如果堆叠是指 tf.stack()
和 np.stack()
所做的:
Stacks a list of rank-
R
tensors into one rank-(R+1)
tensor.
https://www.tensorflow.org/api_docs/python/tf/stack
Join a sequence of arrays along a new axis.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.stack.html
那么我相信最接近的 tf.data.Dataset
是 Dataset.zip()
:
@staticmethod
zip(datasets)
Creates a
Dataset
by zipping together the given datasets.
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()
.
假设您有两个数据集,其元素形状分别为 (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)