teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

Q&A

解決済

2回答

430閲覧

ViTモデルの出力値について

sci

総合スコア1

Python

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

0グッド

0クリップ

投稿2023/10/25 01:26

0

0

機械学習初心者です。
現在、Vision transformerをベースとした画像分類モデルを実装しようとしております。
2値分類モデルなのですが、人が見ても違いがわかるような画像であるため、テストデータセットでも良好なAcc, lossが得られています。
次のステップとして、作成したモデルに未知の画像をインプットして出力スコアを確認しようとしておりますが、出力スコアが-6から5の範囲で出力されており、この出力が正常なのか判断できずにおります。

・ViTモデルでは活性化関数で非線形のGELUが用いられていること
・ReLUと違い、負の要素を含んでいること

上記については、調べて情報は得られているのですが、どのように解釈すればよいか助言をいただけますと幸甚です。よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ps_aux_grepさん
ありがとうございます。
コメントの内容の「Transformer Encoder内のMLPの箇所で動作する活性化関数」と「実際に値を叩き出すのはMLP Headerに付随する最後の活性化関数」を同一のもの勘違いしていたのだと思います。
以下にモデルの実装するコードを示しますが、「実際に値を叩き出すのはMLP Headerに付随する最後の活性化関数」が設定されていないという理解で正しいでしょうか。

model = timm.create_model('vit_base_patch16_224', pretrained=True, num_classes=2) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=lr) scheduler = StepLR(optimizer, step_size=1, gamma=gamma)

投稿2023/10/25 03:58

編集2023/10/25 04:00
sci

総合スコア1

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

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

PondVillege

2023/10/25 05:26 編集

timm.create_model('vit_base_patch16_224', pretrained=True, num_classes=2) の中身次第ですね.これだけではモデルを読み込んでるだけなので実装がわからずなんとも言えないです が,慣例で最後のレイヤはLinearでそのままの値が出されていると思われます. これをLogitに変換するためにはSoftmax関数を通すのが良いでしょう.そうしたらお望みの0~1の確率値が得られるはずです.
sci

2023/10/26 12:27

softmax関数を入れて実行したところ、無事に問題を解決することができました。 迅速かつ的確な回答をいただき、ありがとうございました。
guest

0

ベストアンサー

出力層の活性化関数次第なので実装を見ないとなんとも言えないです.

ViTモデルでは活性化関数で非線形のGELUが用いられていること
ReLUと違い、負の要素を含んでいること

これはあくまでViTのTransformer Encoder内のMLPの箇所で動作する活性化関数の話だと思います.
が,実際に値を叩き出すのはMLP Headerに付随する最後の活性化関数でしかなく
そこを示していただかないことにはこちらも正常か判断しかねます.

ちなみに2値分類ということで1出力のレイヤにして使っているなら,
そのままのBCELossかBCEWithLogitsLossのどちらかを採用することになると思います(2出力でも同様です).
後者であれば出力が値域-6 ~ 5を示すのは何ら不思議ではありません.

投稿2023/10/25 01:43

編集2023/10/25 03:27
PondVillege

総合スコア1581

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問