Python 我如何实施Salt&;凯拉斯的胡椒层?
我需要在keras中实现salt&pepper层,就像Gaussian noise一样,我尝试使用以下代码,但它产生了几个错误。你能告诉我有什么问题吗?对于实施标准普尔层,您还有其他建议吗?多谢各位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
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)。尽管如此,除了图像处理之外,我们还可以在其他领域使用相同的思想。因此,您必须首先指定三件事:
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。不过,通过如下更改
的定义,您可以轻松地将salt的值更改为mask_noise
,将pepper的值更改为x
:y
mask_noise = K.random_binomial(shape=shp, p=0.5) * (x-y) + y
- 相同的噪声模式应用于批次中的所有样本(但是,不同批次的噪声模式不同)
r/10
,错误消息告诉您这是不可能的,因为r
变量不是数字。r
值来自比率(您在创建