Импортировать строку CSV как массив в тензорном потоке
У меня есть CSV-файл, содержащий большое количество N
из столбцов: первый столбец содержит метку, другой N-1
числовое представление моих данных (функции Chroma из записи музыки).
Моя идея состоит в том, чтобы представить входные данные в виде массива. На практике я хочу эквивалент стандартного представления данных в компьютерном зрении. Так как мои данные хранятся в CSV, внутри определения функции ввода данных мне нужен анализатор CSV. Я делаю это таким образом
def parse_csv(line):
columns = tf.decode_csv(line, record_defaults=DEFAULTS) # take a line at a time
features = {'songID': columns[0], 'x': columns[1:]} # create a dictionary out of the features
labels = features.pop('songID') # define the label
return features, labels
def train_input_fn(data_file=fp, batch_size=128):
"""Generate an input function for the Estimator."""
# Extract lines from input files using the Dataset API.
dataset = tf.data.TextLineDataset(data_file)
dataset = dataset.map(parse_csv)
dataset = dataset.shuffle(1_000_000).repeat().batch(batch_size)
return dataset.make_one_shot_iterator().get_next()
Однако это возвращает ошибку, которая не очень значима: AttributeError: 'list' object has no attribute 'get_shape'
, Я знаю, что виновником является определение x
внутри словаря функций, но я не знаю, как это исправить, потому что, по сути, я пока не очень понимаю структуры данных тензорного потока.
2 ответа
Как оказалось, особенности должны быть тензорами. Тем не менее, каждый столбец является тензор сам по себе и принимая columns[1:]
приводит к списку тензоров. Для создания многомерного тензора, который хранит информацию из N-1
столбцы следует использовать tf.stack
:
features = {'songID': columns[0], 'x': tf.stack(columns[1:])} # create a dictionary out of the features
tf.stack должен решить.
Полный пример кода доступен в следующей теме.