Чтение файлов NPY / NPZ из GCP в TPU - PullRequest
0 голосов
/ 06 августа 2020

Можно ли читать файлы NPY или NPZ из хранилища Google Cloud Platform (GCP) и получать данные функций, хранящиеся в этих numpy файлах, в наборы данных при использовании TPU?

Основное требование для TPU - это использовать данные из Google Cloud по наборам данных. Функции моих изображений, извлеченные из InceptionV3, хранятся в файлах numpy, и, поскольку TPU требует, чтобы эти файлы читались из облака, я сохранил эти данные в хранилище GCP.

Теперь я пытаюсь сделать - У меня есть список путей к файлам, которые я передаю в функцию map (), откуда я хочу, чтобы файлы numpy, указанные в этом пути, загружались и эти numpy данные (функции изображения) были добавлены в набор данных.

Исходный код не использовал TPU, поэтому он использовал следующие операторы для загрузки numpy.

def map_func(img_name, cap):
  img_tensor = np.load(img_name.decode('utf-8')+'.npy')
  return img_tensor, cap

и для вызова функции карты в наборе данных был использован следующий код -

dataset = dataset.map(lambda item1, item2: tf.numpy_function(
  map_func, [item1, item2], [tf.float32, tf.int32]),
  num_parallel_calls=tf.data.experimental.AUTOTUNE)

Но для TPU я не могу использовать этот код, поскольку он использует функцию np.load(), которая не работает с типом URL gs://. Кроме того, вызов numpy_function генерирует ошибки для реализаций TPU.

Итак, я сделал следующее - я преобразовал этот numpy вызов функции в простой вызов функции следующим образом:

dataset = tf.data.Dataset.from_tensor_slices(filenames)
dataset = dataset.map(map_func, num_parallel_calls=tf.data.experimental.AUTOTUNE)

Итак, это чистый тип вызова функции с тензорным потоком, в котором мы получаем тензоры внутри map_fun c (). Поэтому я внес следующие изменения в map_fun c ():

f = BytesIO(file_io.read_file_to_string('gs://my-bucket/data.npz', binary_mode=True))
data = np.load(f)

Вышеупомянутая функция работает с путем в Google Cloud, однако, когда я вызываю np.load(), он говорит, что вы не установили allow_pickle значение True. Однажды я установил для этого флага значение True, он выдает ошибку, что рассол для типа данных BytesIO недоступен.

У меня есть другой код для чтения этих файлов из Google Cloud, который работает при прямом вызове, но не работает с функцией обратного вызова map_fun c (), поскольку все переменные становятся тензорами.

f_stream = file_io.FileIO('image_file.npz', 'rb')
d = np.load( BytesIO(f_stream.read()) )

Пожалуйста, предложите, есть ли какой-либо стандартный способ загрузки функций из файлов NPY / NPZ, хранящихся в хранилище GCP под TPU.

...