web-dev-qa-db-ja.com

Keras / Tensorflowでトレーニング可能な一般化されたバンプ関数レイヤーを実装する

コンポーネントごとに適用される Bump function の次のバリアントをコーディングしようとしています:

generalized bump function equation

ここで、σはトレーニング可能です。しかし、機能していません(エラーは以下に報告されています)。


私の試み:

これが私がこれまでにコーディングしたものです(役立つ場合)。たとえば、2つの関数があるとします。

  def f_True(x):
    # Compute Bump Function
    bump_value = 1-tf.math.pow(x,2)
    bump_value = -tf.math.pow(bump_value,-1)
    bump_value = tf.math.exp(bump_value)
    return(bump_value)

  def f_False(x):
    # Compute Bump Function
    x_out = 0*x
    return(x_out)

class trainable_bump_layer(tf.keras.layers.Layer):

    def __init__(self, *args, **kwargs):
        super(trainable_bump_layer, self).__init__(*args, **kwargs)

    def build(self, input_shape):
        self.threshold_level = self.add_weight(name='threshlevel',
                                    shape=[1],
                                    initializer='GlorotUniform',
                                    trainable=True)

    def call(self, input):
        # Determine Thresholding Logic
        The_Logic = tf.math.less(input,self.threshold_level)
        # Apply Logic
        output_step_3 = tf.cond(The_Logic, 
                                lambda: f_True(input),
                                lambda: f_False(input))
        return output_step_3

エラーレポート:

    Train on 100 samples
Epoch 1/10
WARNING:tensorflow:Gradients do not exist for variables ['reconfiguration_unit_steps_3_3/threshlevel:0'] when minimizing the loss.
WARNING:tensorflow:Gradients do not exist for variables ['reconfiguration_unit_steps_3_3/threshlevel:0'] when minimizing the loss.
 32/100 [========>.....................] - ETA: 3s

...

tensorflow:Gradients do not exist for variables 

さらに、(トレーニング不可能な問題を除いて)コンポーネント単位で適用されているようには見えません。何が問題でしょうか?

7
AnnieLeKatsu

バンプの代わりに正規分布を試すことをお勧めします。ここでの私のテストでは、このバンプ機能はうまく動作していません(バグを見つけることはできませんが破棄しませんが、グラフには2つの非常に鋭いバンプがあり、ネットワークには適していません)。

正規分布では、高さ、幅、中心を制御できる規則的で区別可能なバンプが得られます。

したがって、この関数を試すことができます:

y = a * exp ( - b * (x - c)²)

グラフで試してみて、動作を確認してください。

このため:

class trainable_bump_layer(tf.keras.layers.Layer):

    def __init__(self, *args, **kwargs):
        super(trainable_bump_layer, self).__init__(*args, **kwargs)

    def build(self, input_shape):

        #suggested shape (has a different kernel for each input feature/channel)
        shape = Tuple(1 for _ in input_shape[:-1]) + input_shape[-1:]

        #for your desired shape of only 1:
        shape = Tuple(1 for _ in input_shape) #all ones

        #height
        self.kernel_a = self.add_weight(name='kernel_a ',
                                    shape=shape
                                    initializer='ones',
                                    trainable=True)

        #inverse width
        self.kernel_b = self.add_weight(name='kernel_b',
                                    shape=shape
                                    initializer='ones',
                                    trainable=True)

        #center
        self.kernel_c = self.add_weight(name='kernel_c',
                                    shape=shape
                                    initializer='zeros',
                                    trainable=True)

    def call(self, input):
        exp_arg = - self.kernel_b * K.square(input - self.kernel_c)
        return self.kernel_a * K.exp(exp_arg)

3
Daniel Möller