Идеальный способ чтения данных в пакетах данных, хранящихся в корзине, для обучения Keras ML в Google Cloud Platform? - PullRequest
0 голосов
/ 17 февраля 2019

Это моя первая попытка обучить модель в облаке, и я борюсь со всеми маленькими внутризубцами.У меня есть данные тренировок, хранящиеся в корзине на облачной платформе Google, по линии gs://test/train Набор данных составляет около 100 КБ.В настоящее время данные распределены в отдельных папках в соответствии с их ярлыками.

Я не знаю идеального способа получить доступ к данным.Обычно в Keras я использую ImageDataGenerator с flow_from_directory, и он автоматически создает генератор, который я могу использовать в своей модели.

Есть ли такая функция для Python для Google Cloud Platform?

Если нет, то каков идеальный способ доступа к данным через генератор, чтобы я мог передать их на Keras model.fit_generator

Спасибо.

1 Ответ

0 голосов
/ 17 февраля 2019

ImageDataGenerator.flow_from_directory() в настоящее время не позволяет вам передавать данные непосредственно из корзины GCS.Я думаю, у вас есть несколько вариантов:

1 / Скопируйте ваши данные из GCS на диск, локальный для виртуальной машины, которую вы используете для запуска вашего скрипта.Я полагаю, вы делаете это либо через ML Engine, либо на экземпляре Compute Engine.В любом случае вы можете скопировать данные в начале учебного сценария, используя gsutil или API облачного хранилища Python .Здесь есть и обратная сторона: это будет стоить вам некоторое время в начале вашего сценария, особенно когда набор данных большой.

2 / При использовании tf.keras вы можете обучить свою модель на наборе данных tf.data.Приятно то, что утилиты TensorFlow io позволяют вам читать напрямую из GCS-блоков.Если вы захотите преобразовать ваши данные в TFRecords, вы можете создать экземпляр объекта Dataset без предварительной загрузки данных на локальный диск:

# Construct a TFRecordDataset
ds_train tf.data.TFRecordDataset('gs://') # path to TFRecords on GCS
ds_train = ds_train.shuffle(1000).batch(32)

# Fit a tf.keras model
model.fit(ds_train)

См. этот вопрос для получения дополнительной информации о параметре TFRecord.Это также прекрасно работает с объектом набора данных, который создается непосредственно из изображений в GCS с Dataset.from_tensor_slices, поэтому вам не нужно сначала сохранять данные в формате TFRecords:

def load_and_preprocess_image(path):
"""Read an image GCS path and process it into an image tensor

Args:
    path (tensor): string tensor, pointer to GCS or local image path

Returns:
    tensor: processed image tensor
"""

    image = tf.read_file(path)
    image = tf.image.decode_jpeg(image, channels=3)
    return image

image_paths = ['gs://my-bucket/img1.png',
               'gs://my-bucket/img2/png'...]
path_ds = tf.data.Dataset.from_tensor_slices(image_paths)
image_ds = path_ds.map(load_and_preprocess_image)
label_ds = tf.data.Dataset.from_tensor_slices(labels) # can be a list of labels    
model.fit(tf.data.Dataset.zip((images_ds, labels_ds)))

См. учебники на веб-сайте TF для получения дополнительных примеров.

3 / Наконец, также должна быть возможность написать собственный генератор Python или адаптировать исходный код ImageDataGenerator так, чтобы изображениясчитываются с помощью функции TensorFlow io.Опять же, они прекрасно работают с gs:// путями:

import tensorflow as tf
tf.enable_eager_execution()
path = 'gs://path/to/my/image.png'
tf.image.decode_png(tf.io.read_file(path)) # this works

См. Также этот связанный вопрос .Это, вероятно, будет работать медленнее, чем варианты, перечисленные выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...