Почему я не могу использовать tf.nn.conv2d, когда я вызываю его через другую функцию?

#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 решает проблему.

эта ссылка помогла мне решить проблему.