問題タブ [efficientnet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
pytorch - train-acc 0.99 と val-acc 0.99 でトレーニングされた effectivenet-v2-b3 は、テスト データセットの予測には非常に優れていますが、train & val データセットでは不十分です。
「https://github.com/rwightman/pytorch-image-models」の事前トレーニング済みの EfficientNet-v2-b3 モデルと pytorch フレームワークを使用して、シガレット ボックスをトレーニングしました。列車は次のとおりです。
タバコ1本仕様で1100クラスあります。すべての画像は、original_dataset_20210805 という名前のディレクトリに保存されます。各サブディレクトリには、画像のクラスが含まれます。
それぞれの画像が 50 未満しかないクラスを削除します。959 クラスが残っています。
クラスごとに、「valData」という名前の検証データセットに 10 枚の画像をランダムに選択し、「testData」という名前のテスト データセットに約 1/10 の画像をランダムに選択し、残りの画像を「trainData」という名前のトレーニング データセットに選択します。
各画像のサイズを w×h = 200×300 に変更します。
データを拡張するには、各画像を 90° の角度で回転させ、各クラスの 90° 回転したすべての画像を 1 つのクラスに選択します。たとえば、たばこの仕様 A が 1 つある場合、A のすべての画像を 90° 回転し、回転したすべての画像に新しいクラス A-rot1 という名前を付けます。次に、180° 回転して A-rot2 を取得し、270° 回転して A-rot3 を取得します。すべてのクラスでローテーションを行うと、959×4=3836 クラスになります。
「trainData」には 502172 枚の画像があり、「valData」には 38360 枚の画像があり、「testData」には 21463 枚の画像があります。
事前トレーニング済みのモデルを使用してトレーニングを開始します。次のように最適なモデルを保存します。
電車を降りるif train_acc >= 0.99 and val_acc >= 0.99
エポック 121 で、列車は train_acc 0.9911 と val_acc 0.9902 で終了します。
最適なモデルを使用して testData を推測すると、精度は 0.981 です。最良のモデルを使用して trainData を推測すると、精度は 0.99 を超えるはずですが、実際には 0.84 です。valData でモデルを使用すると、実際の精度は 0.82 です。これは非常に奇妙です。次に、上記の original_dataset_20210805 とは異なる別の original_dataset_20210709 で最適なモデルを使用します。また、original_dataset_20210709 の画像は w×h=200×300 にサイズ変更されていません。精度は 0.969 です。
推論コードは次のとおりです。
- 私はpythonコードをチェックし、モデルにフィードされる前の画像の変換からの可能性のある理由を見つけました。変換コードは次のとおりです。
私の推測を検証するために、推論データセット 'valData' (時間がかかりすぎるため 'trainData' は使用しないでください) について、変換を から に変更transform_test = build_transforms(cfg.img_height, cfg.img_width, 'test')
しtransform_test = build_transforms(cfg.img_height, cfg.img_width, 'train')
ます。予想どおり、精度は 0.9918 です。
私の質問は:
- 参考までに、トレーニング済みモデルの testData の精度は 0.989 ですが、trainData の精度は約 0.84、valData の精度は約 0.82 です。
- 変換で何が間違っていますか?
- それとも、このような奇妙な現象を引き起こす別の理由がありますか?</li>
質問に答えてくれるすべての人に感謝します。
追加 1: 12) 検証コードは次のとおりです。
- load_data コードは次のとおりです。
- クラス「TheDataset」は次のように定義されます。
追加 2: 15) train.py 全体は次のとおりです。
python - ValueError: レイヤー モデルは 5 つの入力を想定していますが、3035 の入力テンソルを受け取りました
5 つの EfficientNetB3 モデルのスタック モデルがあります。そこから予想を導き出そうとしています。以下は、データセットとモデルの構築です。
データセット:
積み上げモデル:
次のコード セグメントを使用して予測を試みています。
しかし、次のエラーが発生します。
ValueError: レイヤー モデルは 5 つの入力を想定していますが、3035 の入力テンソルを受け取りました。受け取った入力: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 300, 300, 3) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(None, 300, 300, 3) dtype =float32>, <tf.Tensor 'IteratorGetNext:2' shape=(なし, 300, 300, 3) dtype=float32>, <tf.Tensor 'IteratorGetNext:3' shape=(なし, 300, 300, 3) dtype =float32>, <tf.Tensor 'IteratorGetNext:4' shape=(なし, 300, 300, 3) dtype=float32>, <tf.Tensor 'IteratorGetNext:5' shape=(なし, 300, 300, 3) dtype =float32>, <tf.Tensor 'IteratorGetNext:6' shape=(なし, 300, 300, 3) dtype=float32>, <tf.Tensor 'IteratorGetNext:7' shape=(なし, 300, 300, 3) dtype =float32>, <tf.Tensor 'IteratorGetNext:8' shape=(なし, 300, 300,
このエラーを解決するにはどうすればよいですか? ところで、データセットには 1214 枚の画像があります。前もって感謝します。