Как создать набор данных тензорного потока из DataFrame с векторными столбцами? - PullRequest
0 голосов
/ 01 июня 2018

Итак, у меня есть некоторые данные поезда в CSV-файле train.csv в следующем формате:

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

Этот файл анализируется как pd.DataFrame со следующим:

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)

Пока все хорошо.Функция literal_eval применяется, поэтому x и y обрабатываются как массив.Следующим шагом является создание DataSet со следующим:

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

И вот где он ломается :( Он выдает следующие ошибки:

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

Почему двоичный илиожидается строка в кодировке Юникод? Разрешены ли векторные столбцы объектов? Или я делаю что-то не так? Пожалуйста, пролите немного света

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Смотрите другой ответ для создания набора данных.Если обнаружена ошибка features should be a dictionary of `Tensor`s., используйте следующее:

def dfToFeature(df):
    result = {}
    for key in df.keys():
        result[key] = np.vstack(df[key])
    return result
0 голосов
/ 01 июня 2018

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...