Как использовать TensorFlow tf.data.Dataset flat_map для создания производного набора данных? - PullRequest
1 голос
/ 23 мая 2019

У меня есть Pandas DataFrame, и я загружаю его часть в набор данных tf.data:

dataset = tf.data.Dataset.from_tensor_slices((
    df.StringColumn.values,
    df.IntColumn1.values,
    df.IntColumn2.values,
))

Теперь я хотел бы использовать что-то вроде flat_map для создания производного набора данных, который берет данные в каждой строке и создает набор строк в производном наборе данных для каждой строки в оригинале.

Но flat_map, кажется, просто передает мне тензоры-заполнители в функции lambda.

Я использую TensorFlow 2.0 alpha 0, если это имеет значение.

Изменить:

Мне бы хотелось написать что-то вроде этого:

derived = dataset.flat_map(replicate)

def replicate(s, i1, i2):
    return [[0, s, i1, i2],
        [0.25, s, i1, i2],
        [0.5, s, i1, i2],
        [0.75, s, i1, i2]]

... и тогда derived будет набором данных с четырьмя столбцами и в четыре раза больше строк, чем dataset.

Но когда я пытаюсь это сделать, s - это не значение, а тензор-заполнитель строк.

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

Хорошо, я имел в виду, что функция replicate должна знать значения реплицируемой строки:

slice_count = 16

def price(frac, total, size0, price0, size1, price1, size2, price2, size3, price3):
    total_per_slice = total / slice_count
    start = frac * total_per_slice
    finish = start + total_per_slice
    price = \
        (price0 * (min(finish, size0) - max(start, 0) if 0 < finish and start < size0 else 0)) + \
        (price1 * (min(finish, size1) - max(start, size0) if size0 < finish and start < size1 else 0)) + \
        (price2 * (min(finish, size2) - max(start, size1) if size1 < finish and start < size2 else 0)) + \
        (price3 * (min(finish, size3) - max(start, size2) if size2 < finish and start < size3 else 0))

def replicate(size0, price0, size1, price1, size2, price2, size3, price3):
    total = size0 + size1 + size2 + size3
    return [[
        price(frac, total, size0, price0, size1, price1, size2, price2, size3, price3),
        frac / slice_count] for frac in range(slice_count)]

derived = dataset.flat_map(replicate)

Недостаточно просто иметь возможность передавать заполнители. Это то, что я могу сделать, или это выполнимо, если я могу каким-то образом перевести это в расчетные графики TensorFlow, или это просто нереально, как я пытаюсь это сделать?

1 Ответ

0 голосов
/ 23 мая 2019

Возможно длинный путь, но вы также можете использовать .concatenate() с apply() для достижения "плоского отображения"

как то так:

def replicate(ds):
  return (ds.map(lambda s,i1,i2: (s, i1, i2, tf.constant(0.0)))
          .concatenate(ds.map(lambda s,i1,i2: (s, i1, i2, tf.constant(0.25))))
          .concatenate(ds.map(lambda s,i1,i2: (s, i1, i2, tf.constant(0.5))))
          .concatenate(ds.map(lambda s,i1,i2: (s, i1, i2, tf.constant(0.75)))))

derived = dataset.apply(replicate)

должен дать вам ожидаемый результат

...