前提
こちらを参考に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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。