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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

0回答

787閲覧

[深層距離学習] 一番類似する出力画像の信頼度を数値で定義する方法

harug

総合スコア28

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2022/12/07 06:19

前提

現在,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

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問