Как использовать tf.data.Dataset с kedro?

Я использую tf.data.Dataset для подготовки набора данных потоковой передачи, который используется для обучения модели tf.kears. С помощью kedro есть способ создать узел и вернуть созданныйtf.data.Dataset использовать его в следующем обучающем узле?

В MemoryDataset вероятно не будет работать, потому что tf.data.Dataset нельзя мариновать (deepcopyневозможно), см. также этот вопрос SO. Согласно выпуску №91 глубокая копия вMemoryDatasetсделано, чтобы избежать изменения данных каким-либо другим узлом. Может ли кто-нибудь подробнее рассказать, почему / как может произойти эта одновременная модификация?

Из документов, похоже, естьcopy_mode = "assign". Можно ли использовать эту опцию, если данные не поддаются обработке?

Другое решение (также упомянутое в выпуске 91) - использовать только функцию для генерации потокового tf.data.Datasetвнутри обучающего узла, не имея предыдущего узла генерации набора данных. Однако я не уверен, каковы будут недостатки этого подхода (если они есть). Было бы здорово, если бы кто-нибудь мог привести несколько примеров.

Кроме того, я хотел бы избежать сохранения полного вывода набора данных потоковой передачи, например, используя tfrecords или tf.data.experimental.save поскольку эти параметры потребуют много места на диске.

Есть ли способ передать только созданные tf.data.Dataset объект использовать его для обучающего узла?

1 ответ

Здесь предлагается обходной путь для пользы сообщества, хотя он представлен в kedro.community @DataEngineerOne.

Согласно @DataEngineerOne.

Есть ли способ с помощью kedro создать узел и вернуть созданный tf.data.Dataset, чтобы использовать его в следующем обучающем узле?

Да, конечно!

Может кто-нибудь подробнее рассказать, почему / как может произойти эта одновременная модификация?

Из документов похоже, что есть copy_mode = "assign". Можно ли использовать эту опцию, если данные не поддаются обработке?

Я еще не пробовал этот вариант, но теоретически он должен работать. Все, что вам нужно сделать, это создать новую запись набора данных в catalog.yml файл, который включает copy_mode вариант.

Бывший:

      # catalog.yml
tf_data:
  type: MemoryDataSet
  copy_mode: assign

# pipeline.py
node(
  tf_generator,
  inputs=...,
  outputs="tf_data",
)

Я не могу поручиться за это решение, но попробуйте и дайте мне знать, работает ли оно для вас.

Другое решение (также упомянутое в выпуске 91) - использовать только функцию для генерации потокового tf.data.Dataset внутри обучающего узла без наличия предыдущего узла генерации набора данных. Однако я не уверен, каковы будут недостатки этого подхода (если таковые будут). Было бы здорово, если бы кто-нибудь мог привести несколько примеров.

Это также отличное альтернативное решение, и я думаю (предполагаю), что MemoryDataSet будет автоматически использовать assign в этом случае, а не в обычном deepcopy, так что все должно быть в порядке.

      # node.py

def generate_tf_data(...):
  tensor_slices = [1, 2, 3]
  def _tf_data():
    dataset = tf.data.Dataset.from_tensor_slices(tensor_slices)
    return dataset
  return _tf_data

def use_tf_data(tf_data_func):
  dataset = tf_data_func()

# pipeline.py
Pipeline([
node(
  generate_tf_data,
  inputs=...,
  outputs='tf_data_func',
),
node(
  use_tf_data,
  inputs='tf_data_func',
  outputs=...
),
])

Единственный недостаток - дополнительная сложность. Более подробную информацию вы можете найти здесь .

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