Tensorflow: カスタムレイヤー内で別のレイヤーの重みを取得したい

実現したいこと

Tensorflow で、あるレイヤーの学習対象の重みを用いて計算した値を損失に加えたいと考えています。

損失に値を加える点は、カスタムレイヤー内でself.add_loss()という関数を用いることで実現できるようです。
あとはカスタムレイヤーで、対象の重みを受け取って損失を計算することができれば実現できそうです。
しかしながら、カスタムレイヤー内で他のレイヤーの重みにアクセスする方法がわからず困っています。

※最終的には、同じ構造の二つのレイヤーの重みを取得して、これらの差を正則化項として損失に加えたいと考えています。
そのため、通常のL2ノルム等ではなく、self.add_loss()を用いる方法を考えています。

試したこと

重みをレイヤーの出力・入力として受け渡すことを試みましたがうまくいきませんでした。
おそらく、レイヤーの重みはtf.keras.Input()で生成した値ではないため上手くいかないのではないかと思います。

試したコードとエラーメッセージを以下に示します。

python

import tensorflow as tf import numpy as np class my_layer(tf.keras.layers.Layer): def __init__(self, units, **kwargs): super().__init__(**kwargs) self.units = units def build(self, input_shape): self.w = self.add_weight(shape=(input_shape[-1], self.units), initializer='random_normal', trainable=True) def call(self, inputs): return tf.matmul(inputs, self.w), self.w # 重みを送り出す class AddLossLayer(tf.keras.layers.Layer): def call(self, inputs, weights): # 重みを受け取る self.add_loss(0.001 * np.sum(weights)) # ここでは例として重みの和に0.001を掛けた値を損失に足している return inputs inputs = tf.keras.Input((4,))x, weights = my_layer(1)(inputs)outputs = AddLossLayer()(x, weights)model = tf.keras.Model(inputs=inputs, outputs=outputs)

↓エラーメッセージ

Traceback (most recent call last): File "C:\Users\user\Desktop\sample.py", line 27, in <module> outputs = AddLossLayer()(x, weights) File "C:\Users\user\anaconda3\envs\tf_tutorial\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 773, in __call__ outputs = call_fn(cast_inputs, *args, **kwargs) File "C:\Users\user\anaconda3\envs\tf_tutorial\lib\site-packages\tensorflow_core\python\autograph\impl\api.py", line 237, in wrapper raise e.ag_error_metadata.to_exception(e) NotImplementedError: in converted code: C:\Users\user\Desktop\sample.py:21 call * self.add_loss(0.001 * np.sum(weights)) # 0.001 * np.sum(weights) <__array_function__ internals>:6 sum C:\Users\user\anaconda3\envs\tf_tutorial\lib\site-packages\numpy\core\fromnumeric.py:2242 sum initial=initial, where=where) C:\Users\user\anaconda3\envs\tf_tutorial\lib\site-packages\numpy\core\fromnumeric.py:87 _wrapreduction return ufunc.reduce(obj, axis, dtype, out, **passkwargs) C:\Users\user\anaconda3\envs\tf_tutorial\lib\site-packages\tensorflow_core\python\framework\ops.py:728 __array__ " array.".format(self.name)) NotImplementedError: Cannot convert a symbolic Tensor (my_layer/Identity_1:0) to a numpy array. 2022-06-12 01:26:48.038504: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2

最後に

不足している情報等ございましたら、お知らせ頂けますと助かります。
ご回答よろしくお願いします。

コメントを投稿

0 コメント