質問
TensorFlowで、学習パラメータを用いて損失を計算したいと考えています。
しかしながら、カスタム損失関数の中からパラメータを取得しようとするとエラーが発生します。
ネットワークモデル
python
1import tensorflow as tf 2 3inputs = tf.keras.Input(shape=(28, 28)) 4x = tf.keras.layers.Flatten()(inputs) 5x = tf.keras.layers.Dense(128, activation='relu', name='layer001')(x) 6x = tf.keras.layers.Dropout(0.2)(x) 7outputs = tf.keras.layers.Dense(10, activation='softmax')(x) 8 9model = tf.keras.Model(inputs=inputs, outputs=outputs) 10```例として↑のようなモデルがあったとします。 11 12###### カスタム損失関数 13```python 14def my_loss(y_true, y_pred): 15 layer = model.get_layer('layer001') 16 weights = layer.get_weights()[0] # 学習パラメータの取得 17 18 # weightsを用いてlossを計算したい 19 loss = tf.keras.losses.SparseCategoricalCrossentropy()(y_true, y_pred) 20 return loss 21```このとき、カスタム損失関数my_lossを↑のように定義したとします。 22my_lossの中ではmodelの学習パラメータを取得します。(本当は取得したパラメータを損失の計算に用いたい。) 23 24###### 学習実行 25```python 26model.compile(optimizer='adam', 27 loss=my_loss, 28 metrics=['accuracy']) 29 30(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() 31history = model.fit(x_train, y_train, batch_size=4, epochs=20)
エラー
ERROR
1Traceback (most recent call last): 2 3 File "C:\Users\ユーザー名\Desktop\sample.py", line 25, in <module> 4 5 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler 6 raise e.with_traceback(filtered_tb) from None 7 8 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py", line 1129, in autograph_handler 9 raise e.ag_error_metadata.to_exception(e) 10 11RuntimeError: in user code: 12 13 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 878, in train_function * 14 return step_function(self, iterator) 15 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 867, in step_function ** 16 outputs = model.distribute_strategy.run(run_step, args=(data,)) 17 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 860, in run_step ** 18 outputs = model.train_step(data) 19 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\training.py", line 809, in train_step 20 loss = self.compiled_loss( 21 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\compile_utils.py", line 201, in __call__ 22 loss_value = loss_obj(y_t, y_p, sample_weight=sw) 23 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\losses.py", line 141, in __call__ 24 losses = call_fn(y_true, y_pred) 25 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\losses.py", line 245, in call ** 26 return ag_fn(y_true, y_pred, **self._fn_kwargs) 27 File "C:\Users\ユーザー名\Desktop\sample.py", line 13, in my_loss ** 28 29 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\engine\base_layer.py", line 1906, in get_weights 30 return backend.batch_get_value(output_weights) 31 File "C:\Users\ユーザー名\anaconda3\lib\site-packages\keras\backend.py", line 3872, in batch_get_value 32 raise RuntimeError('Cannot get value inside Tensorflow graph function.') 33 34 RuntimeError: Cannot get value inside Tensorflow graph function. 35```例としてMNISTデータセットでモデル学習を以下のように実行すると、エラーが発生します。 36※windowsのユーザー名は「ユーザー名」に置き換えました。 37※また、プログラム13行目は「layer.get_weights()」の行に対応しています。 38 39「layer.get_weights()」でエラーが発生しているようです。 40ちなみに、my_lossの外(モデル作成直後など)では学習パラメータを取得することができました。 41 42損失関数内でパラメータを取得することはできないのでしょうか。 43可能であるならば、どのようにすればよいでしょうか。 44 45ご回答何卒よろしくお願いいたします。 46 47 48### プログラム全体 49```python 50import tensorflow as tf 51 52inputs = tf.keras.Input(shape=(28, 28)) 53x = tf.keras.layers.Flatten()(inputs) 54x = tf.keras.layers.Dense(128, activation='relu', name='layer001')(x) 55x = tf.keras.layers.Dropout(0.2)(x) 56outputs = tf.keras.layers.Dense(10, activation='softmax')(x) 57 58model = tf.keras.Model(inputs=inputs, outputs=outputs) 59 60def my_loss(y_true, y_pred): 61 layer = model.get_layer('layer001') 62 weights = layer.get_weights()[0] # 学習パラメータの取得 63 64 # weightsを用いてlossを計算したい 65 loss = tf.keras.losses.SparseCategoricalCrossentropy()(y_true, y_pred) 66 return loss 67 68model.compile(optimizer='adam', 69 loss=my_loss, 70 metrics=['accuracy']) 71 72(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() 73 74history = model.fit(x_train, y_train, batch_size=4, epochs=20)
あなたの回答
tips
プレビュー