Можно ли читать файлы 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.