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

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

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

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

深層学習

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

CNN (Convolutional Neural Network)

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

機械学習

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

Python

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

Q&A

2回答

1105閲覧

任意の層を取り出すための,ファインチューニングを前提としたモデルの定義方法

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/11/02 15:16

前提

こちらを参考にResNet50V2を元とした2入力の距離学習を行うようなモデルを定義し,ファインチューニングを行います.

使用したソースコード

最終的にUmapにより中間層の出力を可視化するためにこちらを参考に,出力を取り出したい層に 
name="hidden"
と名前を付けました.

まずは,以下に定義したモデルと実際のソースコードを記載します.

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 # 出力層の追加(ここで29クラス分の出力ができるよう設定) 15 flat1 = Flatten()(base_network.layers[-1].output) 16 dense1 = Dense(512, name="hidden")(flat1) # ここの層の出力を出力したい 17 acti = Activation('relu')(dense1) 18 dense = Dense(29, activation="softmax")(acti) # 29クラス分の出力 19 base_network = Model(base_network.inputs, dense) 20 21 # DLしてある重みの読み込み 22 base_network.load_weights('save_model_weights/weights_imagenet.hdf5', by_name=True) 23 24 # 2入力 25 input_a = Input(shape=input_shape) 26 input_b = Input(shape=input_shape) 27 28 processed_a = base_network(input_a) 29 processed_b = base_network(input_b) 30 31 # 距離の計算 32 distance = Lambda(euclidean_distance, # 独自に定義したユークリッド距離関数 33 output_shape=eucl_dist_output_shape)([processed_a, processed_b]) 34 35 model = Model([input_a, input_b], distance) 36 37 return model

次を実行し,"hidden"と名前を付けた層を取り出そうとすると実際にエラーが吐かれました.

python

1input_shape = (110, 110, 1) #110×110の二値画像(チャネル数1)を入力 2 3model = create_model(input_shape) 4# ファインチューニングによる学習後の重みを読み込む 5model.load_weights('weights.hdf5') 6 7layer_name = "hidden" 8hidden_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output)

エラー内容

実際に吐かれたエラー内容です.

ValueError: No such layer: hidden. Existing layers are: ['input_2', 'input_3', 'model', 'lambda'].

"hidden"と名前のついた層はないと怒られました.
恐らく上記で定義したcreate_model()の中のbase_networkがmodelという名前の層にまとめられてしまっているため,"hidden"と名前のついた層を取り出せないといった認識です.

具体的な原因が分からないため質問させていただきました.
"hidden"と名前のついた層を取り出すためにはどのようにコードを書き換えるとよいでしょうか.
ご教授いただければ幸いです.

補足情報(FW/ツールのバージョンなど)

model.summary() の実行結果です.

Model: "model_1" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_2 (InputLayer) [(None, 110, 110, 1 0 [] )] input_3 (InputLayer) [(None, 110, 110, 1 0 [] )] model (Functional) (None, 29) 40357567 ['input_2[0][0]', 'input_3[0][0]'] lambda (Lambda) (None, 1) 0 ['model[0][0]', 'model[1][0]'] ================================================================================================== Total params: 40,357,567 Trainable params: 40,312,121 Non-trainable params: 45,446 __________________________________________________________________________________________________

バージョン

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

回答2

0

学習用のモデルと推論用のモデルを別にする。
学習時は学習用のモデルで学習を行い、推論時は推論用のモデルで推論を行う。

diff:create_model

1- model = Model([input_a, input_b], distance) 2+ t_model = Model([input_a, input_b], distance) # 学習用モデル 3+ p_model = Model([input_a, input_b], [distance, processed_a, processed_b]) # 推論用モデル 4 5- return model 6+ return t_model, p_model

学習時

python:train.py

1input_shape = (224, 224, 3) 2t_model, _ = create_model(input_shape) 3 4# data_x, data_y = load_dataset() 5# t_model.fit(data_x, data_y, epoch=10, batch_size=4) 6t_model.save_weights("weights.hdf5")

推論時

計算グラフは異なっていても使用しているレイヤーは同じである

python:predict.py

1input_shape = (224, 224, 3) 2t_model, p_model = create_model(input_shape) 3 4t_model_base_network = t_model.get_layer('model') 5p_model_base_network = p_model.get_layer('model') 6 7print(t_model_base_network) 8print(p_model_base_network)

console

1<keras.engine.functional.Functional object at 0x7f89d04e9d00> 2<keras.engine.functional.Functional object at 0x7f89d04e9d00>

これによりモデル間で重みが共有される。
学習用のモデルで重みをロードすれば推論用のモデルでも重みがロードされる。

python:predict.py

1t_model.load_weights("weights.hdf5") 2 3is_equal_weight = t_model_base_network.layers[-1].weights[0] == p_model_base_network.layers[-1].weights[0] 4print(is_equal_weight)

console

1<tf.Tensor: shape=(512, 29), dtype=bool, numpy= 2array([[ True, True, True, ..., True, True, True], 3 [ True, True, True, ..., True, True, True], 4 [ True, True, True, ..., True, True, True], 5 ..., 6 [ True, True, True, ..., True, True, True], 7 [ True, True, True, ..., True, True, True], 8 [ True, True, True, ..., True, True, True]])>

よってsoftmax出力が取得できる。

python:predict.py

1img1 = load_img() 2img2 = load_img() 3distance, pred1, pred2 = p_model.predict([img1, img2])

投稿2022/12/07 00:09

編集2022/12/07 00:11
kenhara

総合スコア11

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

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

0

layer_name = "hidden" base_network = model.get_layer("model") hidden_layer = base_network.get_layer(hidden_name)

2 追記 (2022-12-06)

学習しないのであれば以下のようにすることでsoftmax出力が取得できると思います。

diff:create_model

1- model = Model([input_a, input_b], distance) 2+ model = Model(inputs=[input_a, input_b], outputs=[distance, processed_a, processed_b])

2.1 モデルの出力の確認

python

1input_shape = (224, 224, 3) 2model = create_model(input_shape) 3 4import pprint 5pprint.pprint(model.output)

console

1[<KerasTensor: shape=(None, 29) dtype=float32 (created by layer 'lambda_2')>, 2 <KerasTensor: shape=(None, 29) dtype=float32 (created by layer 'model_3')>, 3 <KerasTensor: shape=(None, 29) dtype=float32 (created by layer 'model_3')>]

2.2 テスト

python

1import numpy as np 2 3img1 = np.random.random((1, 224, 224, 3)).astype("float32") 4img2 = np.random.random((1, 224, 224, 3)).astype("float32") 5outs = model.predict([img1, img2]) 6distance, pred1, pred2 = outs

投稿2022/11/08 00:13

編集2022/12/06 06:50
kenhara

総合スコア11

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

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

harug

2022/12/03 07:08

ご回答ありがとうございます. ”model”レイヤーを経由する必要があるのですね. 1つ質問なのですが,もし出力層のsoftmaxの確率値を得るためにはlayer_nameの部分を”softmax”に変更すれば同様に値を得ることができるのでしょうか.
kenhara

2022/12/06 06:36

```git - dense = Dense(29, activation="softmax")(acti) # 29クラス分の出力 + dense = Dense(29, activation="softmax", name='softmax_dense')(acti) # 29クラス分の出力 ``` ```python layer_name = "softmax_dense" softmax_layer = base_network.get_layer(layer_name) print(softmax_layer.name) print(softmax_layer.output) ``` 上記でレイヤーは取得できます
harug

2022/12/06 18:14

ご丁寧なご回答ありがとうございます. 言葉が足りませんでした. 前提として質問時のモデルの構成で学習を行い,それで得られた重みをロードした学習済みモデルを使用しsoftmaxの値を得るのも上記で可能でしょうか.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問