Kerasカスタムレイヤーの仕組みを理解しようとしていました。スカラーの入力を受け取り、それを被乗数で乗算する乗算層を作成しようとしています。ランダムなデータを生成し、被乗数を知りたい。私は10の数字で試してみると、うまく動作します。しかし、私が20の数字で試してみると、その損失は爆発するだけです。Kerasカスタムレイヤーが異常な結果をもたらす
from keras import backend as K
from keras.engine.topology import Layer
from keras import initializers
class MultiplicationLayer(Layer):
def __init__(self, **kwargs):
super(MultiplicationLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='multiplicand',
shape=(1,),
initializer='glorot_uniform',
trainable=True)
self.built = True
def call(self, x):
return self.kernel*x
def compute_output_shape(self, input_shape):
return input_shape
TensorFlowバックエンドの使用。 10の数字
from keras.layers import Input
from keras.models import Model
# input is a single scalar
input = Input(shape=(1,))
multiply = MultiplicationLayer()(input)
model = Model(input, multiply)
model.compile(optimizer='sgd', loss='mse')
import numpy as np
input_data = np.arange(10)
output_data = 2 * input_data
model.fit(input_data, output_data, epochs=10)
#print(model.layers[1].multiplicand.get_value())
print(model.layers[1].get_weights())
と
試験モデル1エポック1/10 10/10 [======================= =======] - 7秒 - 損失:257.6145 エポック2/10 10/10 [============ ====] - 0秒 - 損失:47.6329 エポック3/10 10/10 [=============== =] - 0 - 損失:8.8073 エポック4/10 10/10 [===============] 0秒 - 損失:1.6285 エポック5/10 10/10 [===============] - 0秒 - 損失: 0.3011 エポック6/10 10/10 [==============] - 0秒 - 損失:0.0557 エポック7/10 10/10 [================] - 0秒 - 損失:0.0103 エポック8/10 10/10 [==============] - 0秒 - 損失:0.0019 エポック9/10 10/10 [===============] - 0秒 - 損失:3.5193e-04 エポック10/10 10/10 [=================== 0 - 損失:6.5076e-05
[array([ 1.99935019]、dtype = float32)]
モデル2を20個テストするS
from keras.layers import Input
from keras.models import Model
# input is a single scalar
input = Input(shape=(1,))
multiply = MultiplicationLayer()(input)
model = Model(input, multiply)
model.compile(optimizer='sgd', loss='mse')
import numpy as np
input_data = np.arange(20)
output_data = 2 * input_data
model.fit(input_data, output_data, epochs=10)
#print(model.layers[1].multiplicand.get_value())
print(model.layers[1].get_weights())
エポック1/10 20/20 [==============================] - 0 - 損失:278.2014 エポック2/10 20/20 [==============] - 0秒 - 損失: 601.1653 エポック3/10 20/20 [==============] - 0秒 - 損失:1299.0583 エポック4/10 20/20 [===============] - 0秒 - 損失:2807.1353 エポック5/10 20/20 [=============] - 0秒 - 損失:6065.9375 エポック6/10 20/20 [===============] - 0 - 損失:1310 7.8828 エポック7/10 20/20 [==============] - 0秒 - 損失:28324.8320 エポック8/10 20/20 [==============] - 0秒 - 損失:61207.1250 エポック9/10 20/20 [=============] - 0秒 - 損失:132262.4375 エポック10/10 20/20 [===============] - 0秒 - 損失:285805.9688
[配列([ - 68.71629333] 、dtype = float32)]
これはなぜ起こるのか?
が面白いですね....しかし、あなたは( 'superを呼び出していません。.. ..)。ビルド() '....それは、いくつかの奇妙な振る舞いの原因になる可能性がありますか? –
@DanielMöller私はself.built = Trueは同じことだと思います。私はsuper(...)。build()を使ってみましたが、同じ動作をしました。 – SidML