-
Notifications
You must be signed in to change notification settings - Fork 337
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【第2章】損失関数クラス MultiBoxLoss intersect関数でのエラー #190
Comments
@bo0221 さま 本書をご活用いただき、ありがとうございます。 今回手持ちのデータをご使用とのことですが、このあたりが気になります。 デバッグ方法ですが、 [1] まず本書の通りに、本書で使用しているデータで動作するかを確認する [2] 本書で使用しているデータで動作し、独自データで動作しない場合は、独自データの問題の可能性あり お手数ですが、ひとつずつ原因候補を潰してみてください。 どうぞよろしくお願い致します。 |
小川様へ ですが,また損失関数のところで別のエラーが出てしまいました.以下の「IndexError: Target 2 is out of bounds.」ですが,調べたところネットワークの出力を変える必要があるのかなと思ったのですが,もしそうだとしたら,どこを変える必要があるのでしょうか. ーーーーーーーーーーーーーーーーーーーーーーーーーーーー in train_model(net, dataloaders_dict, criterion, optimizer, num_epochs) ~\anaconda3\lib\site-packages\torch\nn\modules\module.py in _call_impl(self, *input, **kwargs) D:\Pytorch\第2章\utils\ssd_model.py in forward(self, predictions, targets) ~\anaconda3\lib\site-packages\torch\nn\functional.py in cross_entropy(input, target, weight, size_average, ignore_index, reduce, reduction) IndexError: Target 2 is out of bounds. |
@bo0221 さま 1つ問題が解決し前進したとのことで、ありがとうございます。 着眼点として「クラス数が違うから今動かないよね」は正しいと思います。 本書の実装コードは物体数を可変にするコードにしていないので、修正が面倒です。 現在のクラスラベル数21や、それと同等のコード部分を、全部2に直していけば良いと思うのですが、 面倒ですが、コードを追いながら、どこを直すべきか修正してみてください。 回答になっておらず、申し訳ございませんが、どうぞよろしくお願い致します。 |
お忙しい中,ご返信ありがとうございます. 新たに感じたのは,今回多クラス分類ではなく二値分類なのでBinaryEntropyLossをラベルのLossのみに適用してみましたが,inputサイズとtargetのサイズが合わないといわれてダメでした. Target 2 is out of bounds.という損失関数でのエラーは,ネットを見ると例えば2クラスの分類で本当は[0,1]と名前を付けなければならないところを,[1,2]のようにしているときに出ると記載がありました. |
@bo0221 さま 私も上記のnum_classesで変わると思うのですが、アノテーション時に使用するデータのクラスに1を与えていないでしょうか? 本書ではデータを用意した段階では、データのクラスは0から始まっていた?(で途中の処理だけ背景を0にして、クラス番号をずらしていた?) それとも、1から始まっていた? 申し訳ございません。ぱっと、どっちだったか思い出せないのですが(自著なのに)、 |
小川様へ, ご返答ありがとうございました.確認したところ,小川様のおっしゃる通りで,本書のコードによるとdataloaderの時点では背景はラベル0ではありませんでした.つまり,その時点では0から物体ラベルが始まっていました. 後から見返してみて,背景の0ラベルはおそらくjaccard係数が0.5以下だった場合にBBoxに教師データとして初めてつけられるという風に書いてあったので,そのときにつけられたのだと思ってpyファイルをみていたんですが,以下のそれっぽいコードを見つけました. また,もしわからないことが出てきたときにはご相談させてください. |
@bo0221 さま とんでもないです。本書を活用し、新たな挑戦をしていただけていること、本当に著者冥利につきます。 私の、大雑把な回答・アドバイス?にも関わらず、どしどし前に進められていて凄いです。 |
すいません,さっそく質問で申し訳ないです. |
以下のように損失が不安定になっていて,途中からnanが出てきます. |
@bo0221 さま クロスエントロピーはlogを計算するため、マイナスを入れると計算が破綻します。 そのため、例えば、
は、
のように、1e-8のような少しの正の値を足します。 ただ、損失がすごい勢いで増加しているので、 [1] 学習率が高すぎる? あたりが気になるところです。 |
ご返信ありがとうございます. 度々すみません,もう一度本書のコードを実行して何が違うのか確かめてみたんですが,locの情報を規格化するのを忘れておりました. もう少し,確認する癖をつけようと思います.お忙しい中,質問に答えていただいてありがとうございました. |
何度もすいません.cross_entropyのところで1e-8を入れて今度こそうまくいったと思ったのですが,なぜか途中からlossがnanになってしまいます.ほかの小さい値を入れてみたり,学習率を変えてみたりしているのですが変わりません. loss_l: tensor(5.0545, grad_fn=) loss_c tensor(12.4402, grad_fn=) loss_l: tensor(5.6490, grad_fn=) loss_c tensor(11.7182, grad_fn=) loss_l: tensor(5.0131, grad_fn=) loss_c tensor(11.2012, grad_fn=) loss_l: tensor(6.9989, grad_fn=) loss_c tensor(10.9804, grad_fn=) loss_l: tensor(4.8557, grad_fn=) loss_c tensor(10.0007, grad_fn=) loss_l: tensor(6.6621, grad_fn=) loss_c tensor(10.2895, grad_fn=) loss_l: tensor(5.7157, grad_fn=) loss_c tensor(7.4265, grad_fn=) loss_l: tensor(8.5623, grad_fn=) loss_c tensor(8.2928, grad_fn=) loss_l: tensor(nan, grad_fn=) loss_c tensor(1.8583, grad_fn=) loss_l: tensor(nan, grad_fn=) loss_c tensor(nan, grad_fn=) |
@bo0221 さま 少しずつ前進していて良いですね。 クロスエントロピーは途中で計算がnanにふっとぶことがあります。 まず対策としては、学習率を下げてみるのが良いと思います。 そしてその前に、lossが1.8とか10くらいのときで訓練を止めて、モデルを実際に動かしてみてどういう挙動になっているのかを確認すると良いと思います。 lossが10のときと、lossが1.8のときとを比べて、望んだ方向に訓練が進んでいるのかなど、実際の挙動もぜひ確認してみてください。 一般的なアドバイスでしかないですが、参考になれば幸いです |
ご返答ありがとうございます. nanを示すまでのモデルを保存して,それについて推論を試みようとしました. ですが,ほかのIssueにも挙げられている通り,推論の際にはPytorchのバージョンを1.5未満にする必要があるようでした.Anacondaの環境で行っているのですが,新しい環境を作るまえに,誤って自分の環境を消してしまいました. 調べ方が悪いだけなのかネットで検索しても原因がヒットしないのですが,なにか解決法はありますでしょうか. |
@bo0221 さま https://pytorch.org/get-started/locally/ https://pytorch.org/get-started/previous-versions/#via-pip
などでインストールしてみてください。 またAnaconda自体を一度アンインストールして、完全にPC上から消してやり直すのも良いです。 参考) このあたりで、まずAnacondaを完全に消して、インストールし直し、 |
@bo0221 さま 環境を再構築できたとのことで、良かったです。 面白い取り組みですね! SSDは対象が とうまく機能しづらい、デメリットはあります。 上記のepoch発展の様子を見ていると、「うまく、教師データが作れていない?」 例えば、教師データのアノテーションの単位が(確か)0から1の範囲で正規化した座標で、かつ、 一度、正解例で上記のような画像を描画してみるのが良いかもしれません。 独自の取り組みは大変ですが、上記参考になれば、幸いです。どうぞよろしくお願い致します。 |
ご返信ありがとうございます。 小川様のいう通りで,データの中に消したと思っていたNanが入り込んでいたので,これが原因だと思われます.申し訳ございません。 google colabのGPUの都合上 10epochのモデルしか保存できなかったのですが,ちゃんと学習させることができました.本当にありがとうございました。 ですが,そのモデルを自分の環境で読み込もうとする(torch.loadの箇所)とエラーが発生します.(自分のjupyterlabで学習させてときにはエラーはおきませんでした.) UnpicklingError Traceback (most recent call last) ~\anaconda3\envs\pytorchtest2\lib\site-packages\torch\serialization.py in load(f, map_location, pickle_module) ~\anaconda3\envs\pytorchtest2\lib\site-packages\torch\serialization.py in _load(f, map_location, pickle_module) UnpicklingError: A load persistent id instruction was encountered, |
@bo0221 さま 前に進めることができており、私も嬉しいです。 モデルの読み込み部分ですが、これは、何が原因なんでしょうか。。。 https://pytorch.org/tutorials/beginner/saving_loading_models.html にて、以下に記載があるように、PyTorchの1.6以上で通常のoptionで保存したファイルは、v1.5以下では読めなくなっています。
ローカルとGoogle Colabでバージョンを合わしているとのことですが、Google ColabのデフォルトのPyTorchのバージョンは1.6以上だと思います。 お手元の環境は、推論時にエラーがでないように、v1.5以下にしている? いかがでしょうか? |
すみません、google colabではpytorchをバージョン変更した後はランタイムを再起動させなければ、いけなかったらしいのですが、忘れておりました。
とは、言ってもGPUの上限を超えてしまったので、学習は低いエポック数でやってみます
|
@bo0221 さま いえいえ、まったく問題ございません。 |
@bo0221 さま 成果のご報告をいただき、誠にありがとうございます。 面白いですね!複雑な形ですが、しっかりと検出できている!
いえいえ、応用しようとすると誰もが一度は踏みそうなミスばかりだったので、本Issueは他の多くの読者の方にもとても参考になると思います。 さすがにIssueにて、手取り足取り詳細にアシストまではできないので、アドバイスしかできないのですが、 こちらこそ、誠にありがとうございました! |
小川様へ
今,第2章で手持ちのデータで物体検出を試みておりまして,本書を見ながら流れに沿って進め,最後の訓練のところまで来ました.
なのですが,実行してみても以下のように損失関数のところでエラーが出てしまいます.損失関数のところについては,本書のコードから自分の手で変更はしておりません.また,私にとってこのあたりのコードが難解なため,どこが問題で,どこを直せばよいのかわからず,手が止まっています.
こういった相談をするのは初めてで,情報が不十分なところがあると思いますが,よろしくお願いいたします。
ValueError Traceback (most recent call last)
in
1 num_epochs = 50
----> 2 train_model(net, dataloaders_dict, criterion, optimizer, num_epochs=num_epochs)
in train_model(net, dataloaders_dict, criterion, optimizer, num_epochs)
62
63 # 損失の計算
---> 64 loss_l, loss_c = criterion(outputs, targets)
65 loss = loss_l + loss_c
66
~\anaconda3\lib\site-packages\torch\nn\modules\module.py in _call_impl(self, *input, **kwargs)
1049 if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks
1050 or _global_forward_hooks or _global_forward_pre_hooks):
-> 1051 return forward_call(*input, **kwargs)
1052 # Do not call functions when jit is used
1053 full_backward_hooks, non_full_backward_hooks = [], []
in forward(self, predictions, targets)
878 variance = [0.1, 0.2]
879 # このvarianceはDBoxからBBoxに補正計算する際に使用する式の係数です
--> 880 match(self.jaccard_thresh, truths, dbox,
881 variance, labels, loc_t, conf_t_label, idx)
882
in match(threshold, truths, priors, variances, labels, loc_t, conf_t, idx)
83 """
84 # jaccard index
---> 85 overlaps = jaccard(
86 truths,
87 point_form(priors)
in jaccard(box_a, box_b)
56 jaccard overlap: (tensor) Shape: [box_a.size(0), box_b.size(0)]
57 """
---> 58 inter = intersect(box_a, box_b)
59 area_a = ((box_a[:, 2]-box_a[:, 0]) *
60 (box_a[:, 3]-box_a[:, 1])).unsqueeze(1).expand_as(inter) # [A,B]
in intersect(box_a, box_b)
15
16 def intersect(box_a, box_b):
---> 17 max_xy = np.minimum(box_a[:, 2:], box_b[2:])
18 min_xy = np.maximum(box_a[:, :2], box_b[:2])
19 inter = np.clip((max_xy - min_xy), a_min=0, a_max=np.inf)
ValueError: operands could not be broadcast together with shapes (25,2) (8730,4)
The text was updated successfully, but these errors were encountered: