オートエンコーダーがあり、出力の後にガウスノイズレイヤーを追加する必要があります。これを行うにはカスタムレイヤーが必要ですが、実際にはそれを作成する方法がわかりません。テンソルを使用して作成する必要があります。
次のコードの呼び出し部分に上記の式を実装する場合はどうすればよいですか?
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()))
ラムダレイヤーを使用して実装しようとしましたが、機能しません。
additiveまたはmultiplicativeガウスノイズを探している場合は、 Kerasのレイヤーとしてすでに実装されています: GuassianNoise
(加法)および GuassianDropout
(乗法)。
ただし、画像処理で ガウスぼかし フィルターのようにぼかし効果を具体的に探している場合は、深さ方向の畳み込みレイヤーを使用できます(各入力チャネルにフィルターを個別に適用するため)。 fixed重みを使用して、目的の出力を取得します(DepthwiseConv2Dレイヤーの重みとして設定するには、ガウスカーネルの重みを生成する必要があることに注意してください。これで導入された関数を使用できます answer ):
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...
エラーとして:AttributeError: 'float' object has no attribute 'dtype'
、変更するだけですK.sqrt
からmath.sqrt
、それからそれは働きます。