質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1440閲覧

TensorFlowのカスタム損失で学習パラメータを取得したい

aiueo12345

総合スコア41

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/06 09:45

編集2021/12/07 03:02

質問

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問