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

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

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

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

深層学習

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

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

Python

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

Q&A

0回答

756閲覧

[深層距離学習] 画像間の類似度から,出力画像の信頼度を数値で表現する方法

harug

総合スコア28

Keras

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

深層学習

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

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

Python

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

0グッド

0クリップ

投稿2022/12/11 15:12

前提

深層学習を勉強中です.
以前こちらで質問させていただいた,深層距離学習において出力画像の信頼度を数値で取得する方法について,自分なりに方法を考察してみました.
この方法が,目的に対して筋が通っている方法かどうか,実現可能か,その他技術的なご指摘なども含めアドバイスいただけますと幸いです.

実現したいこと

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/12/11 22:40

> 入力画像が一番類似するとみなされた出力画像のクラスとそれ以外の19個のクラス間での信頼度的なものを数値として受け取りたい Deep One-class Classificationと入力して探すといいかも?(ただ、20クラスのネットワークを使って19クラスとそれ以外を検出するようなやり方なのでもったいないですよね)
harug

2022/12/12 08:39

ご回答いただきありがとうございます. One-class SVM について調べてみました. そこで2点ほど気になる点がありました. こちらはすべてのデータを用いた学習によって,高次元空間上に写像し得られた境界面を基準に正常・異常データを識別するのか,一番類似するとみなされた出力画像のクラスのデータを訓練データとして識別するのかどちらでしょうか. もし後者である場合,上記の距離学習用のモデルによって出力結果を得たのち,別途One-class SVMによって異常値かを調べるという流れになるのでしょうか.
退会済みユーザー

退会済みユーザー

2022/12/12 11:58

One-class SVMはSVMのカーネルを使って空間を捻じ曲げて異常検知する方法です。たとえば良品だけ学習させて、良品ぽく無い物が出現したら異常(不良とは限らない)と判定する方法です。 Deep-one class classificationは、たとえば20クラスの画像を学習させて19クラスがダミー、1クラスが本物、さあどれに近い?という方法です。 > もし後者である場合,上記の距離学習用のモデルによって出力結果を得たのち,別途One-class SVMによって異常値かを調べるという流れになるのでしょうか. あやふやな回答ですが。DOCそのままでもよいですし、One-class SVMに突っ込んでも良いと思います。どうやるのがよいかはタスク次第ではないでしょうか。
harug

2022/12/14 10:11

> Deep-one class classificationは、たとえば20クラスの画像を学習させて19クラスがダミー、1クラスが本物、さあどれに近い?という方法です。 DOCではラベルは19クラスのデータと1クラスのデータの二つにつけて学習を行うということでしょうか. また最終的には出力結果の信頼度を数値として取得したいのですが,DCOをそのまま用いる場合,距離学習同様に最終的な距離データを取得することはできるのでしょうか.
退会済みユーザー

退会済みユーザー

2022/12/14 15:27

> DOCではラベルは19クラスのデータと1クラスのデータの二つにつけて学習を行うということでしょうか. DOCではクラス情報をそのまま学習させるはずです。MNISTであれば0は0、9は9という具合です。仮に0が良品だとして、9を処理するとembeddingsのところで0の集団から遠いよ、みたいな感じだったと思います。 > 距離学習同様に最終的な距離データを取得することはできるのでしょうか. 正解クラスの雲の中に何かしらの値がポッとプロットされるので、最寄りの雲までの距離として出すのか、近傍ベースの異常検知(kNN)を使うか、密度ベースの異常検知(DBSCAN)を使うか、と思います。何にせよ、ニューラルネットワークを使って●次元まで埋め込んでしまえば、あとは●次元のデータをどう異常検知するかという話になるので、そこから先は普通の機械学習の取り組み方で捌けるはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問