Могу ли я выполнить увеличение данных с помощью размытия по Гауссу в моем tf.Dataset, используя мой графический процессор?

#tensorflow #tensorflow-datasets #gaussianblur

#tensorflow #tensorflow-datasets #gaussianblur

Вопрос:

Я хотел бы изменить свой старый конвейер на основе очереди на новый dataset API в tensorflow по соображениям производительности. Однако, как только мой код изменился, он выполняется через 8 часов вместо 2.

Использование моего графического процессора составляло около 30/40%, и сейчас оно составляет от 0 до 6%.

Я нашел строку, которая делает это настолько медленным, и это когда я применяю размытие по Гауссу к своему набору данных :

 def gaussian_blur(imgs,lbls):
   imgs = tf.nn.conv2d(imgs,k_conv,
                                   strides=[1, 1, 1, 1], 
                                   padding='SAME',
                                   data_format='NHWC'
                                   )
   return imgs, lbls

ds = ds.map(gaussian_blur)
  

С моим старым конвейером на основе очередей эта строка почти не замедляет мою программу.

Я думаю, это потому, что эта строка раньше выполнялась на графическом процессоре, но новый API dataset заставляет его работать на процессоре, который намного медленнее и уже используется на 100%.

Есть ли у вас какие-либо идеи о том, как я могу применить размытие по Гауссу без значительного снижения производительности? Должен ли я сохранить свой старый конвейер на основе очереди?

Комментарии:

1. Можете ли вы перенести операцию в свою модель? Прямо сейчас кажется, что вы делаете это, когда генерируете данные, что должно происходить на процессоре, чтобы это можно было выполнять параллельно с обучением.

2. Спасибо! Это единственный способ, который я нашел, чтобы вычислить его на моем графическом процессоре. К сожалению, это действительно неудобно, и я в конце концов отказался от применения gaussian blur.

Ответ №1:

Хотя я не пробовал это на наборе данных tf, это должно быть применимо. Я обнаружил, что эта комбинация очень производительна и упрощена:

 import tensorflow as tf
import tensorflow_addons as tfa

dummy_dataset = tf.ones((1000, 224, 224, 3))
blurred_dummy_dataset = tf.map_fn(tfa.image.gaussian_filter2d, dummy_dataset)
# ~ 3 second runtime in Google Colab on a Tesla K80
  

https://www.tensorflow.org/addons/api_docs/python/tfa/image/gaussian_filter2d
https://www.tensorflow.org/api_docs/python/tf/map_fn