为什么通过其他函数调用tf.nn.conv2d时无法使用它?

时间:2019-04-11 08:31:10

标签: 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 个答案:

答案 0 :(得分:0)

我发现了为什么它不起作用,所以我回答有类似问题的任何人。

在发生错误的情况下,我的代码体系结构迫使tf.nn.conv2d在CPU上运行,而layer_optimizer将tf.nn.conv2d的版本更改为只能在CPU上运行的版本GPU。

添加config.graph_options.rewrite_options.layout_optimizer = 2可解决问题。

this link帮助我解决了这个问题。