BatchDataset не подлежит подписке при попытке отформатировать словарь Python как таблицу - PullRequest
0 голосов
/ 06 мая 2020

Я работаю с TensorFlow Load pandas .DataFrame tutorial , и я пытаюсь изменить вывод фрагмента кода, который создает фрагменты словаря:

dict_slices = tf.data.Dataset.from_tensor_slices((df.to_dict('list'), target.values)).batch(16)

for dict_slice in dict_slices.take(1):
     print (dict_slice)

Я считаю следующий вывод неаккуратным и хочу преобразовать его в более читаемый формат таблицы.

Dictionary output from TensorFlow Tutorial

Я попытался отформатировать для l oop, на основе этой рекомендации Trying a basic for loop

Это дало мне ошибку о том, что BatchDataset не поддерживает индексирование

Error messages from for loop modification

Затем я попытался использовать функцию range и leng для dict_slices, чтобы я был целочисленным индексом, а не срезом Modifying dict_slices with range and len

Что дало мне следующую ошибку (насколько я понимаю, потому что dict_slices по-прежнему является массивом, и каждая итерация представляет собой один вектор массива, а не один индекс вектора):

enter image description here

1 Ответ

0 голосов
/ 06 мая 2020

BatchDataset - это экземпляр tf.data.Dataset, который был пакетным путем вызова его метода .batch(..). Вы не можете «проиндексировать» набор данных тензорного потока или вызвать для него функцию len. Я предлагаю повторить его, как в первом фрагменте кода.

Однако в вашем наборе данных вы используете .to_dict('list'), что означает, что ключ в вашем словаре отображается в список как значение. В основном у вас есть «столбцы» для каждого ключа, а не строки, вы этого хотите? Это значительно усложнит построчную печать (показанную в примере печати таблицы, который вы связали), поскольку у вас нет разных функций в строке. Также он отличается от примера в официальном коде Tensorflow, где точка данных состоит из нескольких функций, а не из одной функции с несколькими значениями.

Объединение кода Tensorflow и красивой печати:

columns = list(df.columns.values)+['target']
dict_slices = tf.data.Dataset.from_tensor_slices((df.values, target.values)).batch(1) # batch = 1 because otherwise you will get multiple dict_slice - target pairs in one iteration below!

print(*columns, sep='\t') 
for dict_slice, target in dict_slices.take(1):
     print(*dict_slice.numpy(), target.numpy(), sep='\t')

Это требует небольшого форматирования, потому что ширина столбцов не равна.

...