我需要像高斯噪声一样在keras中实现盐和胡椒层,我尝试使用以下代码,但它会产生几个错误。你能告诉我这是什么问题吗?你对实施S&P层有什么其他建议吗?谢谢。
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()))
Traceback(最近一次调用最后一次):
文件“”,第125行,在decoding_noise中= SaltAndPepper(0.5)(已解码)
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ base_layer.py”,第457行,在call output = self.call中(输入,** kwargs)
文件“”,第57行,在呼叫返回K.in_train_phase(noised(),输入,训练=训练)
文件“”,第52行,noised n = int(s * r / 10)
TypeError:/:'Dimension'和'int'的不支持的操作数类型
更新:
我使用@ today的解决方案并编写了以下代码:
decoded_noise=call(0.05,bncv11)#16
其中bncv11是批量标准化层的输出。
但它产生了这个错误,为什么会发生?
Traceback(最近一次调用最后一次):
文件“”,第59行,在decoding_noise = call(0.05,bncv11)#16
文件“”,第34行,在通话中返回K.in_train_phase(noised(),输入,训练=训练)
文件“”,第29行,noised mask_select = K.random_binomial(shape = shp,p = self.ratio)
AttributeError:'float'对象没有属性'ratio'
保存模型并使用它后会产生此错误:
Traceback(最近一次调用最后一次):
文件“”,第1行,b = load_model('Desktop / los4x4_con_tile_convolw_FBN_SigAct_SandPAttack05.h5',custom_objects = {'tf':tf})
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ saving.py”,第419行,在load_model中模型= _deserialize_model(f,custom_objects,compile)
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ saving.py”,第225行,在_deserialize_model model = model_from_config(model_config,custom_objects = custom_objects)
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ saving.py”,第458行,在model_from_config中返回deserialize(config,custom_objects = custom_objects)
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ layers__init __。py”,第55行,反序列化printable_module_name ='layer')
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ utils \ generic_utils.py”,第145行,在deserialize_keras_object列表中(custom_objects.items())))
在from_config process_layer(layer_data)中输入文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py”,第1022行
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py”,第1008行,在process_layer custom_objects = custom_objects中)
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ layers__init __。py”,第55行,反序列化printable_module_name ='layer')
文件“D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ utils \ generic_utils.py”,第138行,在deserialize_keras_object'中:'+ class_name)
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()))
在图像处理中,盐和胡椒噪声基本上将随机选择的像素比率的值改变为盐(即白色,通常为1或255,取决于图像值的范围)或胡椒(即黑色)通常是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)
请注意上面的代码我假设了一些事情:
x
的定义,轻松地将salt的值更改为y
和pepper to mask_noise
,如下所示:
mask_noise = K.random_binomial(shape=shp, p=0.5) * (x-y) + y
我不认为可以在模型中使用图层,但在深度学习中,总是有一个称为图像预处理的过程,其中包括去除噪声,图像大小调整等等,这样您就可以在将图像输入神经元之前预处理图像。 。
open cv library是最好的做这样的问题
检查:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_filtering/py_filtering.html