Python 我如何实施Salt&;凯拉斯的胡椒层?

Python 我如何实施Salt&;凯拉斯的胡椒层?,python,tensorflow,image-processing,keras,noise,Python,Tensorflow,Image Processing,Keras,Noise,我需要在keras中实现salt&pepper层,就像Gaussian noise一样,我尝试使用以下代码,但它产生了几个错误。你能告诉我有什么问题吗?对于实施标准普尔层,您还有其他建议吗?多谢各位 from keras.engine.topology import Layer class SaltAndPepper(Layer): def __init__(self, ratio, **kwargs): super(SaltAndPepper, self).__in

我需要在keras中实现salt&pepper层,就像Gaussian noise一样,我尝试使用以下代码,但它产生了几个错误。你能告诉我有什么问题吗?对于实施标准普尔层,您还有其他建议吗?多谢各位

from keras.engine.topology import Layer

class SaltAndPepper(Layer):

    def __init__(self, ratio, **kwargs):
        super(SaltAndPepper, self).__init__(**kwargs)
        self.supports_masking = True
        self.ratio = ratio

    def call(self, inputs, training=None):
        def noised():
            r = self.ratio*10
            s = inputs.shape[1]
            n = int( s * r/10 )
            perm = np.random.permutation(r)[:n]
            inputs[perm] = (np.random.rand(n) > 0.5)
            return inputs

        return K.in_train_phase(noised(), inputs, training=training)

    def get_config(self):
        config = {'ratio': self.ratio}
        base_config = super(SaltAndPepper, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))
回溯(最近一次呼叫最后一次):

文件“”,第125行,在 解码噪声=SaltAndPepper(0.5)(解码)

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\engine\base\u layer.py”, 第457行,在呼叫中 输出=自调用(输入,**kwargs)

文件“”,第57行,待命 返回K.在训练阶段(有噪(),输入,训练=训练)

文件“”,第52行,带噪 n=int(s*r/10)

TypeError:/:“Dimension”和“int”的操作数类型不受支持

更新:

我使用@today的解决方案并编写了以下代码:

decoded_noise=call(0.05,bncv11)#16
哪一个bncv11是它之前的批处理规范化层的输出

但是它产生了这个错误,为什么会发生呢

回溯(最近一次呼叫最后一次):

文件“”,第59行,在 解码噪音=呼叫(0.05,bncv11)#16

文件“”,第34行,呼叫中 返回K.在训练阶段(有噪(),输入,训练=训练)

文件“”,第29行,带噪 遮罩选择=K.随机二项(形状=shp,p=自身比率)

AttributeError:“float”对象没有属性“ratio”

保存模型并使用后,会产生以下错误:

回溯(最近一次呼叫最后一次):

文件“”,第1行,在 b=加载模型('Desktop/los4x4\u con\u tile\u convalw\u FBN\u SigAct\u SandPAttack05.h5',自定义对象={'tf':tf})

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\engine\saving.py”, 第419行,在load_模型中 model=\反序列化\模型(f,自定义\对象,编译)

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\engine\saving.py”, 第225行,在反序列化模型中 模型=来自配置的模型(模型配置,自定义对象=自定义对象)

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\engine\saving.py”, 第458行,来自配置的模型中 返回反序列化(配置,自定义对象=自定义对象)

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\layers\uuuuu init\uuuuuu.py”, 第55行,反序列化 可打印\u模块\u name='layer')

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\utils\generic\u utils.py”, 第145行,反序列化\u keras\u对象中 列表(自定义对象.项())

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\engine\network.py”, 第1022行,从_config开始 处理层(层数据)

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\engine\network.py”, 第1008行,过程中\u层 自定义对象=自定义对象)

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\layers\uuuuu init\uuuuuu.py”, 第55行,反序列化 可打印\u模块\u name='layer')

文件 “D:\software\Anaconda3\envs\py36\lib\site packages\keras\utils\generic\u utils.py”, 第138行,反序列化\u keras\u对象中 “:”+类名)

ValueError:未知层:SaltAndPepper

我将此代码放在我的程序中,在其中我定义了我的网络结构:

from keras.engine.topology import Layer

class SaltAndPepper(Layer):

    def __init__(self, ratio, **kwargs):
        super(SaltAndPepper, self).__init__(**kwargs)
        self.supports_masking = True
        self.ratio = ratio

    # the definition of the call method of custom layer
    def call(self, inputs, training=True):
        def noised():
            shp = K.shape(inputs)[1:]
            mask_select = K.random_binomial(shape=shp, p=self.ratio)
            mask_noise = K.random_binomial(shape=shp, p=0.5) # salt and pepper have the same chance
            out = inputs * (1-mask_select) + mask_noise * mask_select
            return out

        return K.in_train_phase(noised(), inputs, training=training)

    def get_config(self):
        config = {'ratio': self.ratio}
        base_config = super(SaltAndPepper, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

在图像处理中,salt和pepper噪声基本上将随机选择的像素比率的值改变为salt(即白色,通常为1或255,取决于图像值的范围)或pepper(即黑色,通常为0)。尽管如此,除了图像处理之外,我们还可以在其他领域使用相同的思想。因此,您必须首先指定三件事:

  • 应该更改多少像素?(噪音比率)
  • 应该选择和更改哪些像素
  • 选择的像素中哪一个应该加盐(另一个加胡椒)
  • 由于Keras后端中有一个函数,可以从具有给定概率的二项分布(即0或1)生成随机值,我们可以通过生成两个掩码轻松完成上述所有步骤:一个用于选择具有给定比率的像素,另一个用于将盐或胡椒粉应用于所选像素。以下是如何做到这一点:

    from keras import backend as K
    
    # NOTE: this is the definition of the call method of custom layer class (i.e. SaltAndPepper)
    def call(self, inputs, training=None):
        def noised():
            shp = K.shape(inputs)[1:]
            mask_select = K.random_binomial(shape=shp, p=self.ratio)
            mask_noise = K.random_binomial(shape=shp, p=0.5) # salt and pepper have the same chance
            out = inputs * (1-mask_select) + mask_noise * mask_select
            return out
    
        return K.in_train_phase(noised(), inputs, training=training)
    
    注意,在上面的代码中,我假设了一些事情:

    • 给定噪声比的值在[0,1]范围内
    • 如果使用此层直接将其应用于图像,则必须注意,它假定图像为灰度(即单色通道)。要将其用于RGB图像(即三个颜色通道),您可能需要稍微修改它,以便选择一个像素及其所有通道来添加噪波(尽管这取决于您如何定义和使用椒盐噪波)
    • 它假定盐的值为1,胡椒的值为0。不过,通过如下更改
      mask_noise
      的定义,您可以轻松地将salt的值更改为
      x
      ,将pepper的值更改为
      y

      mask_noise = K.random_binomial(shape=shp, p=0.5) * (x-y) + y
      
    • 相同的噪声模式应用于批次中的所有样本(但是,不同批次的噪声模式不同)


    stacktrace说您的比率是一个维度对象,而不是一个数字变量。这是什么意思?因为我是一个初学者,我不知道这段代码做什么。我该怎么解决呢?是可以用lambda层实现s&p噪声,还是我们应该生成这样一个层?老实说,我对s&p层了解不多。但是您的错误是一个非常基本的python错误。在代码中,您尝试执行以下除法
    r/10
    ,错误消息告诉您这是不可能的,因为
    r
    变量不是数字。
    r
    值来自比率(您在创建