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
См. Также этот связанный вопрос .Это, вероятно, будет работать медленнее, чем варианты, перечисленные выше.