前提
現在,ResNet50V2をベースネットワークとした2入力の深層距離学習を行っています.
学習時には2枚1組のペア画像(同じクラス同士 or 違うクラス同士)とそれに対応したラベル(同じクラス同士なら1,違うクラス同士なら0)を使用します.
損失関数はcontrastive lossを使用しており,類似する画像同士の距離は0に近づけ類似しない画像同士の距離は遠くなるように最適な距離を学習し,最終的にその距離を出力します.(Siamese Network)
実現したいこと
入力された画像に対して一番類似しているとして出力された画像の信頼度的なものを数値として取得したいです.
現在は,推論の際に一枚の入力画像に対して,それとのペア画像として入力された画像群の中から一番距離の値が小さい画像(最類似画像とする)をピックアップし,その画像を一番類似する画像としています.
一般的な多クラス分類では,ニューラルネットワーク出力層のsoftmaxの確率値を取ってこれば,入力データがどれくらいの信頼度でこのクラスに分類されたのかということが一応定義できるかと思います.
しかし今回のような深層距離学習のような場合では入力画像のクラスラベルは使用せず,ただ入力されたペア画像が類似しているか否かのラベル(0 or 1)を使用するためこの方法はかなわないと思います.(間違っていればご指摘ください.)
そこで,出力された最類似画像の信頼度を定義するいい方法(実装や数式など)があればアドバイスいただきたいです.
なお,入力画像に対する最類似画像のクラスは確認可能とします.
使用したモデル
以下に使用したモデルを記載します.
※しかし,ソースコード中の(★)部分は,最近までクラス数分の出力をsoftmaxで得ることができれば多クラス分類同様に信頼度を定義可能だと勘違いしていたため,不要な部分かもしれません(間違っていればご指摘ください.)が,すでに学習済みのモデルを使用したいため,可能であればモデルの構成はこのままであると助かります.
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 #=== 出力層の追加(★) === 15 flat1 = Flatten()(base_network.layers[-1].output) 16 dense1 = Dense(512, name="hidden")(flat1) # ここの層の出力を出力したい 17 acti = Activation('relu')(dense1) 18 dense = Dense(20, activation="softmax")(acti) # 20クラス分の出力 19 base_network = Model(base_network.inputs, dense) 20 # ===================== 21 22 # DLしてある重みの読み込み 23 base_network.load_weights('save_model_weights/weights_imagenet.hdf5', by_name=True) 24 25 # 2入力 26 input_a = Input(shape=input_shape) 27 input_b = Input(shape=input_shape) 28 29 processed_a = base_network(input_a) 30 processed_b = base_network(input_b) 31 32 # 距離の計算 33 distance = Lambda(euclidean_distance, # 独自に定義したユークリッド距離関数 34 output_shape=eucl_dist_output_shape)([processed_a, processed_b]) 35 36 model = Model([input_a, input_b], distance) 37 38 return model
試したこと
出力される距離の値,最類似画像のクラスにおける誤分類数…などが使用できるのではないかと私自身は考えています.
また,前述の通り,多クラス分類同様クラス数分のユニットをsoftmaxから得ようと,一度上記のモデルで学習させていますが,その後これでは意図通りの結果は得られないと気づき質問させていただいております.
よろしくお願いします.
補足情報(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
プレビュー