[英]how do I implement Salt& Pepper layer in Keras?
我需要像高斯噪声一样在 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()))
回溯(最近一次调用最后一次):
文件“”,第 125 行,在 decoded_noise=SaltAndPepper(0.5)(decoded)
文件“D:\\software\\Anaconda3\\envs\\py36\\lib\\site-packages\\keras\\engine\\base_layer.py”,第457行,调用输出= self.call(inputs, **kwargs)
文件“”,第 57 行,在调用中返回 K.in_train_phase(noised(), inputs, training=training)
文件“”,第 52 行,噪声 n = int( s * r/10 )
类型错误:不支持 / 的操作数类型:'Dimension' 和 'int'
更新:
我使用了@today 的解决方案并编写了以下代码:
decoded_noise=call(0.05,bncv11)#16
其中 bncv11 是它之前的批归一化层的输出。
但它会产生这个错误,为什么会发生?
回溯(最近一次调用最后一次):
文件“”,第 59 行,在 decoded_noise=call(0.05,bncv11)#16
文件“”,第 34 行,在调用中返回 K.in_train_phase(noised(), inputs, training=training)
文件“”,第 29 行,噪声掩码选择 = K.random_binomial(shape=shp, p=self.ratio)
AttributeError: 'float' 对象没有属性 'ratio'
保存模型并使用它后会产生此错误:
回溯(最近一次调用最后一次):
文件“”,第 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 list(custom_objects.items())))
文件“D:\\software\\Anaconda3\\envs\\py36\\lib\\site-packages\\keras\\engine\\network.py”,第1022行,from_config process_layer(layer_data)
文件“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)
注意,在上面的代码中,我假设了一些事情:
假设salt的值为1,胡椒的值为0。不过,可以通过如下更改mask_noise
的定义,轻松地将salt的值更改为x
,将胡椒的值更改为y
:
mask_noise = K.random_binomial(shape=shp, p=0.5) * (xy) + y
相同的噪声模式将应用于批次中的所有样本(但是,批次之间会有所不同)。
我认为不可能在模型中使用这些图层,但是在深度学习中,总会有一个称为图像预处理的过程,其中包括消除噪声,调整图像大小等,因此您可以在将图像输入神经元之前进行预处理。
开放式简历库最适合解决此类问题
检查: https : //docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_filtering/py_filtering.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.