#tensorflow #tensorflow-datasets
#tensorflow #tensorflow-datasets
Вопрос:
Я пытаюсь выполнить увеличение данных по набору данных. У меня есть разные модификаторы, один из них — размытие по Гауссу. Раньше я сопоставлял его с tf.nn.conv3d
, но для ускорения я изменил его на tf.nn.conv2d
(использование 3d не было оптимальным). Однако теперь, когда я запускаю его, я получаю
tensorflow.python.framework.errors_impl.UnimplementedError: Generic conv implementation only supports NHWC tensor format for now.
Я не понимаю, почему, потому что я уже пытаюсь запустить его data_format='NHWC'
.
Вот код :
my current file :
with tf.name_scope('DataAugmentation'):
for modifier in modifiers:
def apply_modifier(t_imgs,t_lbls,t_ranges,t_img_paths):
t_imgs, t_lbls = modifier.apply_to(t_imgs, t_lbls)
return t_imgs,t_lbls,t_ranges,t_img_paths
ds = ds.map(apply_modifier)
В другом файле метод модификатора, который вызывает проблему :
self.k_conv = ........
def apply_to(self, t_imgs, t_lbls):
with tf.name_scope('GaussianBlur'):
t_imgs = tf.nn.conv2d(t_imgs,self.k_conv,
strides=[1, 1, 1, 1],
padding='SAME',
data_format='NHWC'
)
return (t_imgs, t_lbls)
Очень странный момент заключается в том, что я могу запустить программу, если я объявлю функцию в своем текущем файле, а не в другом файле, где я определяю модификатор класса :
with tf.name_scope('DataAugmentation'):
for modifier in modifiers:
if modifier.m.NAME=='GaussianBlur':
k_conv = create.random_k_conv()
def apply_modifier(t_imgs,t_lbls,t_ranges,t_img_paths):
t_imgs = tf.nn.conv2d(t_imgs,k_conv,
strides=[1,1,1,1],
padding='SAME'
)
return t_imgs,t_lbls,t_ranges,t_img_paths
else:
def apply_modifier(t_imgs,t_lbls,t_ranges,t_img_paths):
t_imgs, t_lbls = modifier.apply_to(t_imgs, t_lbls)
return t_imgs,t_lbls,t_ranges,t_img_paths
ds = ds.map(apply_modifier)
Тип моего набора данных
<BatchDataset shapes: ((?, 500, 500, 1), (?, 6, 6, 5), (?, 2), (?,)), types (tf.float32, tf.float32, tf.float32, tf.string)>```
I really have no idea why the second code runs but not the first one, it s been a few days I am stuck.
Thank you for reading, I hope someone could help.
Комментарии:
1. Пожалуйста, добавьте свой тип входных данных и форму. Также зачем определять функцию внутри цикла for ?
2. Я определил функцию внутри цикла, потому что она зависит от модификатора. Итак, для каждого модификатора модификаторов списка я определяю apply_modifier и использую его для сопоставления набора данных.
3. Суть определения функции в том, что вы можете передавать ей аргумент и повторно использовать его в разных случаях
4. Я хотел бы это сделать, но я не могу передать ни одного аргумента в аргументе map_fun из map
Ответ №1:
Я нашел, почему это не сработало, поэтому я отвечаю на свой собственный вопрос для всех, у кого есть подобная проблема.
В случае, когда у меня возникает ошибка, архитектура моего кода заставляет tf.nn.conv2d запускаться на процессоре, в то время как layer_optimizer изменяет версию tf.nn.conv2d на версию, которая может работать только на GPU.
Добавление config.graph_options.rewrite_options.layout_optimizer = 2
решает проблему.
эта ссылка помогла мне решить проблему.