【发布时间】:2019-09-03 08:31:42
【问题描述】:
我需要在 keras 中实现盐和胡椒层,例如高斯噪声,我尝试使用以下代码,但它产生了几个错误。你能告诉我有什么问题吗?您对实施标准普尔层还有其他建议吗?谢谢。
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 行,在 decoded_noise=SaltAndPepper(0.5)(解码)
文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\base_layer.py", 第 457 行,在 调用 output = self.call(inputs, **kwargs)
文件“”,第 57 行,调用中 return K.in_train_phase(noised(), inputs, training=training)
文件“”,第 52 行,噪声 n = int(s * r/10)
TypeError: /: 'Dimension' 和 'int' 的操作数类型不受支持
更新:
我用@today的解决方案,写了如下代码:
decoded_noise=call(0.05,bncv11)#16
which bncv11 是它之前的批量归一化层的输出。
但它会产生这个错误,为什么会发生?
Traceback(最近一次调用最后一次):
文件“”,第 59 行,在 decoded_noise=call(0.05,bncv11)#16
文件“”,第 34 行,调用中 return K.in_train_phase(noised(), inputs, training=training)
文件“”,第 29 行,噪声 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 中 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 返回反序列化(配置,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())))
文件 "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 中 ': ' + 类名)
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()))
【问题讨论】:
-
堆栈跟踪表明您的比率是 Dimension 对象而不是数字变量。
-
这是什么意思?因为我是初学者,我不知道这段代码是做什么的。我应该怎么解决?
-
是否可以使用 lambda 层实现 s&p 噪声,或者我们应该生成这样的层?
-
说实话,我对标普层了解不多。但是您遇到的错误是一个非常基本的 python 错误。在您的代码中,您尝试执行以下除法
r/10,错误消息告诉您这是不可能的,因为r变量不是数字。r值来自比率(创建图层时使用的第二个参数。它应该是一个数字,我想它不是。您能提供用于创建图层的代码吗?
标签: python tensorflow image-processing keras noise