Covert pandas df to tensorflow tf.record файл, где 1-й столбец pandas имеет один int, а 2-й - несколько int

У меня есть Pandas DF, где 1 столбец содержит один int, а другой столбец содержит от 2 до 50 int.

Вот пример ниже

           EmbedID                          MappedC
1911    3096611        [610580, 1396024, 1383000, 2480745, 751823, 97...
1912    3096612        [365607, 917990]
1913    3096613      [1067171, 638200, 2192752, 1609109, 1984544, 3...
1914    3096614       [521163, 217279, 347655]
1915    3096615      [1139429, 1254616, 3034840, 2312074, 68243]

Цифры EmbedID служат меткой, а два случайных числа, выбранных из столбца MappedC, служат соответствующими входными числами.

Как лучше всего преобразовать это в файл tf.record?

Я вижу руководства по преобразованию одного столбца numpy в файл tf.record, например эти

https://gist.github.com/swyoon/8185b3dcf08ec728fb22b99016dd533f

Numpy to TFrecords: есть ли более простой способ обработки пакетного ввода из tfrecords?

http://www.machinelearninguru.com/deep_learning/tensorflow/basics/tfrecord/tfrecord.html

Однако у всех есть проблемы, когда столбец / массив имеет разное количество целых чисел.

Редактировать:

Если это что-то изменит, вот более подробная информация о том, что именно я делаю с данными.

Для обучения на Tensorflow единственный столбец int содержит индекс для вектора в матрице внедрения. Этот вектор будет использоваться как метка.

Столбец с несколькими целыми числами содержит «входные данные». Для каждой метки из столбца, содержащего одно целое число, случайным образом будут выбраны 2 числа из столбца, содержащего несколько целых чисел.

Я в основном занимаюсь обучением word2vec Cbow

Вы счастливы просто взять первые два значения из MappedC в качестве двух «случайных» значений, или вам действительно нужен случайный выбор? Если вам действительно нужна рандомизация, можно ли выбрать одно и то же значение MappedC дважды или нет?

John Zwinck 28.10.2018 05:35

Мне нужно будет выбрать случайный выбор из MappedC. Что касается вашего второго вопроса, на самом деле я не думал о возможности использовать одно и то же значение MappedC в разные эпохи. . .Если возможно, я бы предпочел использовать разные значения для каждой эпохи, пока все значения не будут использованы, а затем все начнется заново.

SantoshGupta7 28.10.2018 05:43
0
2
702
1

Ответы 1

Сначала перемешайте значения MappedC:

import random
df.MappedC.apply(random.shuffle)

Затем возьмите первое и второе значения:

df.MappedC.str[0]
df.MappedC.str[1]

df.MappedC.str выглядит как что-то о строках, что может сбивать с толку, но Series.str работает как со списками, так и со строками, поэтому это позволяет нам выбирать первый и второй элементы каждого списка и эффективно создавать из них новую серию.

Теперь вы можете использовать обычные методы для помещения данных в TensorFlow, так как теперь у вас есть две простые серии целых чисел.

В качестве альтернативы, это даст вам серию случайно выбранных пар:

df.MappedC.map(lambda row: random.sample(row, 2))

Это решение работает, но мне пришлось бы либо хранить фрейм данных в памяти и создавать новые массивы tf.records каждый раз, когда эпоха заканчивается, либо предварительно создавать наборы данных для каждой эпохи, которую я хочу запустить, что нарушит цель использования tf .records в первую очередь (экономия оперативной памяти, экономия места, удобство).

SantoshGupta7 28.10.2018 06:35

@ SantoshGupta7: Я не уверен, что вам нужно. Вам нужно решение, которое работает на квантовых компьютерах? Я думаю, тогда мы могли бы выполнять все вычисления без загрузки данных.

John Zwinck 29.10.2018 13:02

Я ищу способ для файла tf.record хранить массив, в котором количество целых чисел в каждом слоте варьируется.

SantoshGupta7 30.10.2018 00:32

Затем вам нужно будет дополнить более короткие списки, чтобы данные были прямоугольными. См. datascience.stackexchange.com/questions/15056/…

John Zwinck 30.10.2018 02:00

Другие вопросы по теме