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

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

ただいまの
回答率

87.37%

validation loss が上昇している原因を知りたい。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 106

score 0

前提・実現したいこと

現在、以下のコードを参考にしてデータセットを置き換えて学習を行っています。

trainingはうまく進んでいるように見えますが、validationはうまくいっていません。元コードとの変更点はデータセットの変更を通すために少し変更した程度です。

いろいろ調べましたが、似たような例は見つからず困っている次第です。

よろしくお願いします。

使用しているデータセットは2048*4096,training:10400枚,validation:373枚です。(training dataは水増ししています。)

追記:とりあえず学習を進めてみているので何かあったら報告します。
・ReduceLP0nPlateauを追加して学習した結果、Epoch3以降val lossが上昇
・学習率を下げて学習した結果、地道にlossが下がるもののlossが4ほどで停滞する

参考にしているコード

以下の画像はデータを水増しする前の結果です。

水増し方法(わかりずらかったら申し訳ありません。)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Muchpomp

    2021/11/26 12:23

    jbpb0さん
    ご回答ありがとうございます。
    画像に関してですが、現在パノラマ画像をデータセットとして使っており、0度から360度までが移っている画像です。
    例えば左端が0度で右端が360度であるとしたら切り取った左端と右端をくっつけても、もともとつながっている位置関係にあるため見切れるというようなことは起こっていません。
    念のため水増しデータをいくつか見てみましたが、どこで切り取ったかわからないくらい違和感はありませんでした。

    キャンセル

  • jbpb0

    2021/11/26 13:18

    なるほど、360°つながってる(円筒を内側から見てるような)画像を、どこか一ヶ所で切って展開した画像になっていて、元々は同じ画像から切る場所がいろいろ違う画像を作ってるのですか
    それなら、画像としては問題無いでしょうね

    ただ、それだと実質同じ(切るところだけ違う)画像が10枚くらいあることになるような気がしますので、水増ししてもあまりバリエーションは増えてないような

    キャンセル

  • Muchpomp

    2021/11/26 15:45

    jbpb0さん
    ご回答ありがとうございます。
    たしかにバリエーションは増えませんね。
    バリエーションを増やすには画像の都合上、回転や拡大はvalidationのデータと離れてしまいそうなのでHRCo4さんがおっしゃられている明度や彩度の変換をやってみようと考えています。

    キャンセル

回答 1

+1

傾向は過学習っぽいですが、2エポック目からその傾向がみられるのは少し変ですね。
極端にデータ数が少ない場合は2エポック目から過学習が起こる可能性もありますが、今回のようなある程度データ数を揃えた場合、ある程度学習が進んで train, val 共に一旦下がってから乖離していくはずです。

ぱっと思いつく原因は3点あります。

  1. 水増し方法が悪影響しており、普通では起こりえない画像になっている可能性。
    水増しでどのくらい増やしているのかわかりませんが、例えば水増しに回転処理を入れており、範囲を0~360度としてしまっているとします。入力画像が風景などの場合、回転により空が下、地面が上といった普通では起こりえない画像が生成して、さらに10400枚の内、大半がそういった画像となっており、validation とかけ離れたものになってしまっている。

  2. trainとvalidationの画像がそもそも類似したものでない可能性。
    例えば、trainは街並み(建物や道路、人など)の画像で学習しているが、validationでは風景(山や海、川など)の画像としてしまっている。

  3. 入力サイズがそのネットワーク(DeepLabV3+)に適していない。
    参考元を見てみましたが、入力サイズが 512x512 を使用しているのに対して、試されているのが 2048x4096 と大分大きい画像となっています。そのため、受容野(receptive field)の画像に対する比率が変わり参考元と違う傾向となってしまっている。ただし、この推測はデータ自体によるものなので、trainとvalidationが乖離している直接的な原因の可能性は低いです。

一度、水増し後の画像を出力して確認するところから始めるといいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/11/26 12:28

    HRCo4さん
    ご回答ありがとうございます。
    画像に関してですが、現在パノラマ画像をデータセットとして使っており、0度から360度までが移っている画像です。
    例えば左端が0度で右端が360度であるとしたら切り取った左端と右端をくっつけても、もともとつながっている位置関係にあるため見切れるというようなことは起こっていないと考えています。
    実際、いくつか水増しデータを見ましたが見切れるような画像は確認できませんでした。
    いただいた解決策を試してみようと思います。
    ご丁寧に説明してくださり本当にありがとうございます。

    キャンセル

  • 2021/11/26 17:36

    HRCo4さん
    現在、教えていただいた水増し方法を試しているのですが、2点気になることがあります。

    ・色相の回転はする必要があるか

    ・255を超えてしまうときの処理として計算前にuint16に型変更を行い、計算後にuint8に戻すという風に処理をしているのですがこのような処理で正しいでしょうか。

    答えていただけると幸いです。

    キャンセル

  • 2021/11/26 17:49 編集

    >・色相の回転はする必要があるか
    色相は色合いが変わってしまうため非推奨です。(例えばリンゴ[赤]の色相が数度変わって[黄]になってしまうとか)
    彩度や明度も極端に変えてしまうと悪くなる原因ですので 0.8~1.2 の数値は調整してください。

    >・255を超えてしまうときの処理として計算前にuint16に型変更を行い、計算後にuint8に戻すという風に処理をしているのですがこのような処理で正しいでしょうか。
    uint16 であればまずオーバーフローすることがないためそれでも問題ありません。
    自分は以下のような処理をしています。(もっと効率的・高速なやり方があるかもしれませんが、、、)

    s = random.uniform(0.80, 1.20) # 彩度
    v = random.uniform(0.80, 1.20) # 明度
    img_hsv[:,:,1] = np.where(img_hsv[:,:,1] * s < 255, img_hsv[:,:,1] * s, 255)
    img_hsv[:,:,2] = np.where(img_hsv[:,:,2] * v < 255, img_hsv[:,:,2] * v, 255)
    ※ img_hsv が uint8 なので255未満は *s(v) しても uint8 に変換されます。

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る