Как использовать 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=...
),
])
Единственный недостаток - дополнительная сложность. Более подробную информацию вы можете найти здесь .