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

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

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

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

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Python

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

Q&A

解決済

1回答

1221閲覧

pytorchの推論時に学習データを入力して、学習時と同じ認識精度(Accuracy)とlossを得ることは可能ですか?

masaX

総合スコア30

深層学習

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

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/11/16 12:49

編集2021/11/16 12:54

pytorchでクラス分類を行っています。訳がありまして、推論時に学習データを入力して学習時と同じ認識精度とlossが得られるか確認しているのですが、学習時と推論時でlossと認識精度(Accuracy)が大きく異なります。
モデルには、ResNetを使用しており、評価時はmodel.eval()で評価モードに切り替えて推論しています。
学習データの入力の前処理は、学習時と推論時で以下の通りで同様の処理となっています。
lossには、クロスエントロピーロスを用いています。

python

1transforms.Resize((224, 224)), 2transforms.ToTensor(), 3transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),

ResNetなので、評価時はBatch Normalizationがoffになっているので、認識精度とlossが変化するのは何となく理解できるのですが、学習時と評価時でlossと認識精度は大きく異なるものなのでしょうか?
また、推論時に学習時と同じlossと認識精度を獲得することは可能なのでしょうか?
同じような事例をご経験された方、詳しい方がいましたら、ご教授頂けると嬉しいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

学習のループでは、
examples/mnist/main.py
の「def train(...」のように、「loss」を計算した後に「optimizer.step()」でネットワークの重みを更新するのが普通です
最終のエポックでもそうなので、最終のエポックで学習データで「loss」(や「Accuracy」)が計算された時と、学習が終了した時のネットワークの重みは違います

しかも、ミニバッチ学習の場合は、エポック内で一つのミニバッチでの「loss」計算後に都度重み更新が行われるので、最終のエポックで最初の方のミニバッチに選ばれたデータは、それを使った「loss」計算後に(ミニバッチ数分)何度も重みが更新されてますので、「loss」が計算された時と、学習が終了した時のネットワークの重みの違いはさらに大きくなります

なので、学習のループの最終エポックの最後の、全ミニバッチでの重み更新が済んだ後で、全部の学習データを使って再度「loss」(や「Accuracy」)を計算し直し、それを「学習時」の精度とするのであれば、

推論時に学習時と同じlossと認識精度を獲得することは可能

になるはずです
ただし、再度「loss」(や「Accuracy」)を計算する際は、当然「optimizer.step()」はしてはいけません

また、再度「loss」(や「Accuracy」)を計算する際に「model.eval()」で評価モードに切り替えなければ、それによる差異は残ります
「model.eval()」で評価モードに切り替えたら、ピッタリ合うはずです

投稿2021/11/17 03:06

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問