¿Cómo crear un conjunto de datos de tensorflow a partir de un DataFrame con columnas vectoriales?

Así que tengo algunos datos de tren en un archivo csv train.csv con el siguiente formato:

 x;y;type [1,2,3];[2,3,4];A [2,7,9];[0,1,2];B 

Este archivo se analiza como un pd.DataFrame con lo siguiente:

 CSV_COLUMN_NAMES = ['x', 'y', 'type'] train = pd.read_csv("train.csv", names=CSV_COLUMN_NAMES, header=0, delimiter=";") train['x'] = train['x'].apply(literal_eval) train['y'] = train['y'].apply(literal_eval) 

Hasta ahora tan bueno. La función literal_eval se aplica para que x e y se traten como una matriz. El siguiente paso es crear un DataSet con lo siguiente:

 features, labels = train, train.pop('type') dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels)) 

Y aquí es donde se rompe 🙁 Se dertwig los siguientes errores:

 TypeError: Expected binary or unicode string, got [1, 2, 3] 

¿Por qué se espera una cadena binaria o Unicode? ¿No están permitidas las columnas de características vectoriales? ¿O estoy haciendo algo mal? Por favor, dame un poco de luz

TF puede crear automáticamente un tensor a partir de un dataframe siempre que tenga un solo tipo de datos, en este caso parece tener diferentes tipos de datos.

Sin literal_eval el código parece funcionar, ya que cada una de las características es una cadena y no de tipo mixto:

 train = pd.read_csv("train.csv", names=CSV_COLUMN_NAMES, header=0, delimiter=",") Features,labels = train,train.pop('type') dataset = tf.data.Dataset.from_tensor_slices((dict(Features), labels)) iterator = dataset.make_initializable_iterator() next_element = iterator.get_next() with tf.Session() as sess: sess.run(iterator.initializer) print(sess.run(next_element)) print(sess.run(next_element)) 

Salida:

 ({'y': b'[2, 3, 4]', 'x': b'[1, 2, 3]'}, b'A') ({'y': b'[0, 1, 2]', 'x': b'[2, 7, 9]'}, b'B') 

Basado en esta solución: ( Cómo convertir una matriz Numpy 2D con tipo de objeto a una matriz 2D regular de flotantes ) si convertimos el tipo de objeto mixto al mismo (con np.vstack), funciona.

 train['x'] = train['x'].apply(literal_eval) train['y'] = train['y'].apply(literal_eval) Features,labels = train,train.pop('type') dataset = tf.data.Dataset.from_tensor_slices(((np.vstack(Features['x']), np.vstack(Features['y'])), labels)) iterator = dataset.make_initializable_iterator() next_element = iterator.get_next() with tf.Session() as sess: sess.run(iterator.initializer) print(sess.run(next_element)) print(sess.run(next_element)) 

Salida:

 ((array([1, 2, 3]), array([2, 3, 4])), b'A') ((array([2, 7, 9]), array([0, 1, 2])), b'B') 

Vea la otra respuesta para hacer un conjunto de datos. Si las features should be a dictionary of `Tensor`s. se encuentra un error usa lo siguiente:

 def dfToFeature(df): result = {} for key in df.keys(): result[key] = np.vstack(df[key]) return result