Как реализовать увеличение на лету в тензорном потоке?

Я хочу реализовать расширение в наборе 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.

Как решить две проблемы?


person Tavakoli    schedule 05.02.2021    source источник


Ответы (1)


Ваша строка печатается один раз, потому что она вызывает один раз, чтобы построить граф Tensorflow. Если вы используете tf.print для печати, он будет частью графика, поэтому он будет печататься каждый раз.

Скопируйте / вставьте это:

import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.datasets import load_sample_image
import numpy as np
import random

imgs = np.stack([load_sample_image('flower.jpg') for i in range(4*4)], axis=0)

def augmentation(img):      
        p = .5
        tf.print('augmentation successful!')  
        img = tf.image.convert_image_dtype(img, tf.float32)
        return img 
    

ds_train = tf.data.Dataset.from_tensor_slices(imgs)


batch_size = 16
repeat_count = 10
AUTOTUNE = 16

ds_train = (
    ds_train.shuffle(len(ds_train)).repeat(repeat_count)
    .map(augmentation, num_parallel_calls=AUTOTUNE)
    .batch(batch_size)
    .prefetch(buffer_size=AUTOTUNE)
)

for i in ds_train:
    pass
augmentation successful!
augmentation successful!
augmentation successful!
augmentation successful!
augmentation successful!
augmentation successful!
augmentation successful!
augmentation successful!
augmentation successful!
person Nicolas Gervais    schedule 05.02.2021