Я хочу реализовать расширение в наборе 3D-данных с помощью модели тензорного потока.
функция увеличения выглядит так:
def augmentation(img, label):
p = .5
print('augmentation')
if random.random() > p:
img = tf.numpy_function(augment_noise, [img], tf.double)
if random.random() > p:
img = tf.numpy_function(flip_x, [img], tf.double)
if random.random() > p:
img = tf.numpy_function(augment_scale, [img], tf.double)
if random.random() > p:
img = tf.numpy_function(distort_elastic_cv2, [img], tf.double)
img = tf.image.convert_image_dtype(img, tf.float32)
return img, label
В тензорном потоке функции дополнения не реализованы.
Код Tensorflow для использования этой функции следующий:
ds_train = tf.data.Dataset.from_tensor_slices((image_train, label_train))
ds_valid = tf.data.Dataset.from_tensor_slices((image_val, label_val))
batch_size = 16
repeat_count = int((1000 * batch_size)/len(image_train))
# AUTOTUNE = tf.data.experimental.AUTOTUNE # tf.data.AUTOTUNE
AUTOTUNE = 16
# Augment the on the fly during training.
ds_train = (
ds_train.shuffle(len(ds_train)).repeat(repeat_count)
.map(augmentation, num_parallel_calls=AUTOTUNE)
.batch(batch_size)
.prefetch(buffer_size=AUTOTUNE)
)
ds_valid = (
ds_valid.batch(batch_size)
.prefetch(buffer_size=AUTOTUNE)
)
initial_epoch = 0
epochs = 1000
H = model.fit(ds_train, validation_data=ds_valid,initial_epoch=initial_epoch,
epochs = epochs,
callbacks = chkpts, use_multiprocessing=False, workers=1, verbose=2)
Я хочу, чтобы в каждую эпоху случайным образом выбирал около 1000 пакетов из набора данных, а затем увеличивал их в. Я рассчитываю repeat_count
для создания 1000 пакетов размером batch_size
.
Проблема в том, что я не знаю, является ли функция увеличения вызова модели в каждую эпоху и подразумевает ее для каждого изображения пакета (я имею в виду 16 1000 изображений в каждую эпоху), поэтому я добавил print
в функцию augmentation
, что он печатался только один раз, не в каждую эпоху или для каждого изображения. Вызов функции увеличения 16 1000 раз в каждую эпоху?
Кроме того, использование процессора и графического процессора зависит от каждого запуска кода. Некоторое время загрузка процессора составляет около 25%, а графического процессора - 30, но почти во всех прогонах оно составляет 100% и 5.
Как решить две проблемы?