Как реализовать гауссово размытие слоя в Keras? - PullRequest
1 голос
/ 12 апреля 2019

У меня есть авто-кодер, и мне нужно добавить слой гауссовского шума после моего вывода. Мне нужен собственный слой для этого, но я действительно не знаю, как его создать, мне нужно создать его с помощью тензоров. enter image description here

что мне делать, если я хочу реализовать приведенное выше уравнение в части вызова следующего кода?

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=None):
        def noised():
            shp = K.shape(inputs)[1:]

         **what should I put here????**            
                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()))

Я также пытаюсь реализовать, используя лямбда-слой, но он не работает.

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Если вы ищете аддитив или мультипликативный гауссов шум, то они уже были реализованы в виде слоя в Керасе: GuassianNoise (аддитив) и GuassianDropout (мультипликативный).

Однако, если вы специально ищете эффект размытия, как в Гауссово размытие фильтры при обработке изображений, то вы можете просто использовать слой свертывания по глубине (чтобы применить фильтр к каждому входному каналу независимо ) с фиксированными весами, чтобы получить желаемый результат (обратите внимание, что вам нужно сгенерировать весы ядра Гаусса, чтобы установить их в качестве весов слоя DepthwiseConv2D. Для этого вы можете использовать функцию, представленную в этом ответить ):

import numpy as np
from keras.layers import DepthwiseConv2D

kernel_size = 3  # set the filter size of Gaussian filter
kernel_weights = ... # compute the weights of the filter with the given size (and additional params)

# assuming that the shape of `kernel_weighs` is `(kernel_size, kernel_size)`
# we need to modify it to make it compatible with the number of input channels
in_channels = 3  # the number of input channels
kernel_weights = np.expand_dims(kernel_weights, axis=-1)
kernel_weights = np.repeat(kernel_weights, in_channels, axis=-1) # apply the same filter on all the input channels
kernel_weights = np.expand_dims(kernel_weights, axis=-1)  # for shape compatibility reasons

# define your model...

# somewhere in your model you want to apply the Gaussian blur,
# so define a DepthwiseConv2D layer and set its weights to kernel weights
g_layer = DepthwiseConv2D(kernel_size, use_bias=False, padding='same')
g_layer_out = g_layer(the_input_tensor_for_this_layer)  # apply it on the input Tensor of this layer

# the rest of the model definition...

# do this BEFORE calling `compile` method of the model
g_layer.set_weights([kernel_weights])
g_layer.trainable = False  # the weights should not change during training

# compile the model and start training...
0 голосов
/ 12 апреля 2019

В качестве ошибки: AttributeError: 'float' object has no attribute 'dtype', просто измените K.sqrt на math.sqrt, тогда оно будет работать.

...