Способ решения этой проблемы заключается в следующих шагах:
- создание объекта набора данных, содержащего путь к каждому файлу
- отображение функции python на каждый элементНабор данных для распаковки, загрузки данных и удаления разархивированной папки (которую, я полагаю, вам больше не нужно разархивировать)
- вернитесь к коду тензорного потока для дальнейшей обработки
Вот пример того, как должен выглядеть код:
from scipy import misc
import os
# ----------------------------
# Parsing function with standard python:
def zip_data_parser(zip_fname):
os.system('unzip {0}'.format(zip_fname)) # unzip
folder_name = zip_fname.rsplit('.zip')[0]
# load data:
x_stack = []
y_stack = []
for i in range(n_images):
x_stack.append(misc.imread(folder_name + '/image-{0}.png'.format(i)))
y_stack.append(misc.imread(folder_name + '/mask-{0}.png'.format(i)))
x = np.array(x_stack)
y = np.array(y_stack)
os.system('rm -rf {0}'.format(folder_name)) # remove unzipped folder
return x, y
# ----------------------------
# Dataset pipeline:
all_zip_paths = ['file1.zip', 'file2.zip', 'file3.zip'] # list of paths for each zip file
train_data = tf.constant(all_zip_paths)
train_data = tf.data.Dataset.from_tensor_slices(train_data)
train_data = train_data.map(
lambda filename: tf.py_func( # Parse the record into tensors
zip_data_parser,
[filename],
[tf.float32, tf.float32]), num_parallel_calls=num_threads)
# un-batch first, then batch the data again to have dimension [batch_size, N, M, C]
train_data = train_data.apply(tf.data.experimental.unbatch())
train_data = train_data.batch(b_size, drop_remainder=True)
Конечно, вам может потребоваться привести x и y к np.float32, прежде чем возвращать их из zip_data_parser
в объект Dataset. Я также предположил, что маски в моем примере уже закодированы горячим способом.