TF может автоматически создавать тензор из фрейма данных, если у него только один тип данных, в этом случае, похоже, он имеет разные типы данных.
Без literal_eval
код работает, так как каждая из функций является строковой, а не смешанного типа:
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))
Вывод:
({'y': b'[2, 3, 4]', 'x': b'[1, 2, 3]'}, b'A')
({'y': b'[0, 1, 2]', 'x': b'[2, 7, 9]'}, b'B')
На основе этого решения: ( Как преобразовать двумерный массив Numpy с объектом dtype в обычный двумерный массив с плавающей точкой ), если мы преобразуем смешанный тип объекта в тот же (с помощью np.vstack), это работает.
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))
Вывод:
((array([1, 2, 3]), array([2, 3, 4])), b'A')
((array([2, 7, 9]), array([0, 1, 2])), b'B')