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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

1046閲覧

狙ったタイミングで深層学習の損失に付加する重みを変える方法(keras/tensorflow)

Anonymous2020

総合スコア7

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/07/13 04:33

編集2021/07/13 08:05

前提・実現したいこと

深層学習をkeras/tensorflowで行っているものです
狙ったタイミングで深層学習の損失に付加する重みを変えるためにtf.keras.losses.Lossのサブクラスを使って
自作関数を作成しています

計算ごとに関数内でself.stepを積み上げ、epochが5になったら変化するようにしたいのですが、
うまくいっておりません
(下記ではわかりやすいように0割して発散するようにしている)

狙ったエポック数で深層学習の損失に付加する重みを変えることができるよう、下記のコードをどのように
修正してよいかご教示いただけますと幸いです。

該当のソースコード

python

1class CategoricalCrossentropy1(keras.losses.Loss): 2 def __init__(self, steps_per_epoch=None, end_epoch=None, name="example"): 3 super().__init__(name=name) 4 self.steps_per_epoch, self.end_epoch = steps_per_epoch, end_epoch 5 6 self.step = 0 7 def call(self, y_true, y_pred): 8 9 epoch = self.step/self.steps_per_epoch 10 11 if epoch < self.end_epoch: 12 weight=1 13 else: 14 weight=1/0 #Note that extreme number was put here to check how this code work 15 16 loss = -tf.reduce_sum(weight*y_true*tf.math.log(y_pred)) #impose weight on CategoricalCrossentropy 17 18 self.step += 1 # add to step 19 20 return loss 21 22################ main part 23batch_size = 10 24steps_per_epoch = 4 25end_epoch = 5 26 27#... 28model.compile(loss=CategoricalCrossentropy1(steps_per_epoch, end_epoch), 29 optimizer=keras.optimizers.SGD(),) 30 31#... 32model.fit(generater_train, 33 batch_size = batch_size, 34 steps_per_epoch = steps_per_epoch, 35 epochs=100000, 36 )

結果

Epoch 5 付近でlossが発散(nan)してほしいのですが、計算が続行されてしまいます

Epoch 1/100000 4/4 [==============================] - 72s 3s/step - loss: 2.9023 Epoch 2/100000 4/4 [==============================] - 11s 3s/step - loss: 2.0072 Epoch 3/100000 4/4 [==============================] - 11s 3s/step - loss: 1.7888 Epoch 4/100000 4/4 [==============================] - 11s 3s/step - loss: 2.5708 Epoch 5/100000 4/4 [==============================] - 11s 3s/step - loss: 2.0668 Epoch 6/100000 4/4 [==============================] - 11s 3s/step - loss: 1.9443 Epoch 7/100000 4/4 [==============================] - 11s 3s/step - loss: 2.7553 Epoch 8/100000 4/4 [==============================] - 11s 3s/step - loss: 2.6547 Epoch 9/100000 4/4 [==============================] - 11s 3s/step - loss: 2.7103 Epoch 10/100000 3/4 [=====================>........] - ETA: 2s - loss: 2.3025

その他

stackoverflowで同様の質問中
リンク

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1class CategoricalCrossentropy1(keras.losses.Loss): 2 def __init__(self, steps_per_epoch=None, end_epoch=None, name="example"): 3 super().__init__(name=name) 4 self.steps_per_epoch, self.end_epoch = steps_per_epoch, end_epoch 5 6 self.step = tf.Variable(0.) 7 def call(self, y_true, y_pred): 8 epoch = self.step/self.steps_per_epoch 9 10 if epoch < self.end_epoch: 11 weight=1.0 12 else: 13 weight=-1.0 #Note that extreme number was put here to check how this code work 14 15 loss = -tf.reduce_sum(weight*y_true*tf.math.log(y_pred)) #impose weight on CategoricalCrossentropy 16 17 self.step.assign(self.step + 1) # add to step 18 19 return loss

どうでしょうか

Python

1loss_weight = tf.Variable(1.0) 2model.compile(loss=CategoricalCrossentropy1(steps_per_epoch, end_epoch),optimizer=keras.optimizers.SGD(),loss_weights=(loss_weight,)) 3 4loss_weight.assign(1.5)#値の更新方法

loss_weightsにテンソルを渡して、それを更新するという方法もあるかと思います。
値の更新はkeras.callbacks.Callbackを継承したクラスに更新処理を書いてmodel.fit時に渡す。または、model.train_on_batchで書き換えて、iter処理中に書くかという方法があるかと思います。

投稿2021/07/25 23:34

編集2021/07/26 00:06
37458

総合スコア70

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

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

Anonymous2020

2021/07/30 01:17

回答ありがとうございます。 上記を参考にしたのですが、 self.step.assign(self.step + 1) # add to step の箇所でエラーが出ました AttributeError: 'int' object has no attribute 'assign' 現在他の迂回方法がないか調査中です
37458

2021/07/30 01:37

self.step = tf.Variable(0.) が抜けていないでしょうか?
37458

2021/07/30 01:42

簡単に説明すると、tfが計算グラフを構築する際に普通の変数は定数として組み込まれます。 そのため、tfが計算グラフを構築するとその変数を変更しても反映されません。 変数として扱うためにはtf.Variableで定義する必要があります。
Anonymous2020

2021/07/30 02:17

おっしゃる通り原理を理解していなかったため、 self.step = 0 にしていました。 解説までしていただき、おかげさまで解決しました。 本当に助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問