前提
深層学習を勉強中です.
以前こちらで質問させていただいた,深層距離学習において出力画像の信頼度を数値で取得する方法について,自分なりに方法を考察してみました.
この方法が,目的に対して筋が通っている方法かどうか,実現可能か,その他技術的なご指摘なども含めアドバイスいただけますと幸いです.
実現したいこと
Siamese Networkを使用した深層距離学習において,入力画像に対する出力画像がどれだけ確信の持てる結果かを信頼度(%)として数値化したい.
今まで使用していたモデル
従来のモデルでは,作成した2枚1組のペア画像を一枚ずつベースネットワーク(ResNet50V2)に入力し,それぞれから算出される特徴ベクトルを特徴量空間に埋め込み,両者の適切な距離を学習していくという2入力1出力の構成になっています.
python
1# model定義 2from tensorflow.keras.applications.resnet_v2 import ResNet50V2 3(その他のimportは省略) 4 5def create_model(input_shape): 6 # ResNet50V2の入力層の前に独自の入力層を追加 7 input_model = Sequential() 8 input_model.add(InputLayer(input_shape=input_shape)) 9 input_model.add(Conv2D(3, (7, 7), padding='same')) 10 input_model.add(BatchNormalization()) 11 input_model.add(Activation('relu')) 12 base_network = ResNet50V2(include_top=False, weights=None, input_tensor=input_model.output) 13 14 # DLしてある重みの読み込み 15 base_network.load_weights('save_model_weights/weights_imagenet.hdf5', by_name=True) 16 17 # 2入力 18 input_a = Input(shape=input_shape) 19 input_b = Input(shape=input_shape) 20 21 processed_a = base_network(input_a) 22 processed_b = base_network(input_b) 23 24 # 距離の計算 25 distance = Lambda(euclidean_distance, # 独自に定義したユークリッド距離関数 26 output_shape=eucl_dist_output_shape)([processed_a, processed_b]) 27 28 model = Model([input_a, input_b], distance) 29 30 return model
試したこと
入力画像に対する出力画像の信頼度を数値化するうえで,一般的な多クラス分類同様「① 入力されるペア画像のラベル(類似ペア→1,非類似ペア→0)に対応する出力層を作成し最終的に得られるsoftmax関数の確率値」と「② 従来のモデル通り,最終的に出力される両者の距離の値」の両方を併用してを用いる方法を考えました.
➀を用いる理由:softmax関数によって類似(ラベル1),非類似(ラベル0)の確率値が得られるため,どのくらい類似しているのか(していないのか)が数値として確認できること.
②を用いる理由:現在は類似ペアの距離は0,非類似ペアはできるだけと遠くなるように(現在は小さくとも距離1以上になるよう)学習されるため,最終的に出力された距離の値がそれらを基準としてどれだけ収束しているか(離れているか)の割合を数値化することで,類似度の強弱を表せる.
(上記➀②が同じ意味合いではという懸念があるため,そうでしたらご指摘ください.)
現在は先述のモデルの通り距離の取得は可能です.しかし,2つの入力画像に対して一つのsoftmax関数を適用して➀の値を得るにはどのように実装したらよいでしょうか.
要は学習後のモデルから入力ペア画像のsoftmaxの値➀と距離の値②を受け取れるようなモデルにしたいです.
また,現在は20クラスのデータを用いているため,クラス単位でみた信頼度,すなわち多クラス分類のsoftmaxの値のように,入力画像が一番類似するとみなされた出力画像のクラスとそれ以外の19個のクラス間での信頼度的なものを数値として受け取りたいです.
自分ではその方法を思いつけませんでしたのでどうかお力をお貸しいただけますと幸いです(多少チカラワザでも構いません.)
この他ご指摘や,信頼度を導く有力な方法がありましたら,どうかお知恵をお貸しいただけないでしょうか.
補足情報(FW/ツールのバージョンなど)
ubuntu 20.04
Python 3.8.10
tensorflow-gpu 2.5.3
keras 2.8.0
numpy 1.19.5
jupyter lab 2.3.2
あなたの回答
tips
プレビュー