Мне нужно реализовать слой соли и перца в кератах, таких как гауссовский шум, я пытался использовать следующий код, но он выдает несколько ошибок.не могли бы вы сказать мне, в чем проблема?Есть ли у вас какие-либо другие предложения по внедрению уровня 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) (декодированный)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ base_layer.py", строка 457, в вызов output = self.call (входные данные, ** kwargs)
Файл "", строка 57, при возврате вызова K.in_train_phase (noised (), входы, обучение = обучение)
Файл "", строка 52, в шуме n =int (s * r / 10)
Ошибка типа: неподдерживаемые типы операндов для /: 'Размер' и 'int'
Обновление:
Я использовал сегодняшнее решение и написал следующий код:
decoded_noise=call(0.05,bncv11)#16
, который bncv11 - это выход уровня пакетной нормализации перед ним.
но выдает эту ошибку, почему это происходит?
Traceback (последний вызов был последним):
File "", строка 59,in decoded_noise = call (0.05, bncv11) # 16
Файл "", строка 34, в вызове return K.in_train_phase (noised (), входы, обучение = обучение)
файл "", строка 29, в зашумленном mask_select = 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 \ save.py", строка 419, в модели load_model= _deserialize_model (f, custom_objects, compile)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ save.py", строка 225, в _deserialize_model model = model_from_config (model_config, custom_objects = custom_objects)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ save.py", строка 458, в model_from_configreturn deserialize (config, custom_objects = custom_objects)
Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ layer__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 \ layer__init __. Py ", строка 55, в десериализованном принтабеle_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()))