Я вижу, что моя текущая реализация фида данных не оптимальна, и wi sh, чтобы получить несколько советов, как сделать это быстрее (это мое узкое место).
Моя обработка данных включает чтение из npz файлы, похожие на следующие (но более сложные, которые здесь не актуальны ..):
def load_data_classification(file, param1):
file_str = file.numpy()
mesh_data = np.load(file_str, encoding='latin1', allow_pickle=True)
n = 10
features = mesh_data['vertices'][n:n + param1]
label = mesh_data['label']
name = str(mesh_data['dataset_name']) + ':' + file_str.decode()
return name, features, label
Мое определение tf.dataset выглядит следующим образом:
param1 = 20
batch_size = 16
shuffle_size = 1000
def _gen_ds_for_inter(filenames):
ds_ = tf.data.Dataset.from_tensor_slices(filenames)
ds_ = ds_.map(lambda file: tf.py_function(func=load_data_classification,
inp=[file, param1],
Tout=(tf.string, tf.float32, tf.int32)))
return ds_
n_chunks = 8
len_cut = int(len(filenames) / n_chunks) * n_chunks
filenames = filenames[:len_cut]
filenames_chunks = np.array_split(np.array(filenames), n_chunks)
ds = tf.data.Dataset.from_tensor_slices(filenames_chunks)
ds = ds.interleave(_gen_ds_for_inter, cycle_length=4, block_length=16, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds = ds.shuffle(shuffle_size)
ds = ds.batch(batch_size, drop_remainder=False)
Мои вопросы :
Можно ли лучше определить набор данных для ускорения? (Я вижу, что это не оптимально, когда я параллельно запускаю некоторые процессы обучения, и время выполнения каждого индивидуума не увеличивается)
У меня есть много параметров, которые мне нужно отправить, как param1
. Не все из них являются числами, и я не нашел хорошего способа обернуть все это в класс Python, поэтому я могу установить различные параметры для каждого экземпляра набора данных.
Есть идеи?