Quiero apilar dos objetos de conjuntos de datos en Tensorflow (función rbind en R). Creé un conjunto de datos A a partir de archivos tfRecord y un conjunto de datos B a partir de matrices numpy. Ambos tienen las mismas variables. ¿Sabes si hay alguna manera de apilar estos dos conjuntos de datos para crear uno más grande? ¿O para crear un iterador que leerá aleatoriamente datos de estas dos fuentes?
Gracias
El método tf.data.Dataset.concatenate() es el análogo más cercano a tf.stack() cuando se trabaja con conjuntos de datos. Si tiene dos conjuntos de datos con la misma estructura (es decir, los mismos tipos para cada componente, pero posiblemente formas diferentes):
dataset_1 = tf.data.Dataset.range(10, 20) dataset_2 = tf.data.Dataset.range(60, 70)entonces puedes concatenarlos de la siguiente manera:
combined_dataset = dataset_1.concatenate(dataset_2)Si al apilar quiere decir lo que hacen tf.stack() y np.stack() :
Apila una lista de tensores de rango
Ren un tensor de rango(R+1).
https://www.tensorflow.org/api_docs/python/tf/stack
Únete a una secuencia de matrices a lo largo de un nuevo eje.
https://docs.scipy.org/doc/numpy/reference/generated/numpy.stack.html
entonces creo que lo más cercano que puede venir con un tf.data.Dataset es Dataset.zip() :
@staticmethod zip(datasets)Crea un conjunto de
Datasetal comprimir los conjuntos de datos dados.
https://www.tensorflow.org/api_docs/python/tf/data/Dataset?version=stable#zip
Esto le permite iterar a través de múltiples conjuntos de datos al mismo tiempo al iterar sobre la dimensión compartida de los conjuntos de datos originales, de manera similar a un tensor o matriz stack() ed.
Luego, también puede usar .map(tf.stack) o .map(lambda *t: tf.stack(t, axis=-1)) para apilar los tensores a lo largo de nuevas dimensiones en la parte delantera o trasera, respectivamente,
Si realmente desea lograr lo que tf.concat() y np.concatenate() , entonces use Dataset.concatenate() .
Suponga que tiene dos conjuntos de datos cuya forma de elemento es respectivamente (bs, d0, d1) y (bs, d0', d1) y desea un nuevo conjunto de datos cuya forma de elemento es (bs, d0 + d0', d1) puede hacerlo usando tf.Dataset.zip y luego concatenando cada elemento en el segundo eje, como en el siguiente ejemplo:
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)Si, en cambio, desea apilar dos conjuntos de datos con la misma forma de elementos (bs, d0, d1) en un nuevo conjunto de datos con forma de elementos (bs, d0, d1,2), puede hacerlo comprimiendo los dos conjuntos de datos y luego replanteando los elementos.
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)