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

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

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

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

深層学習

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

機械学習

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

Python

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

Q&A

解決済

1回答

2789閲覧

【Keras】学習済みEfficientNetB0+全結合層に対して、model.summary()で全結合層の詳細を表示したい

asdf1016

総合スコア14

Keras

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

深層学習

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/07/16 12:45

編集2021/07/17 03:21

前提・実現したいこと

Kerasで作成したモデル(学習済みEfficientNetB0 + 全結合層)について以下の2つを実現したいです。

  1. model.summary()で全結合層の詳細を表示したい

model.summary()すると、EfficientNetの構造は表示される一方で全結合層はひとまとめにSequentialと表示されます。
こちらも同程度の粒度(Conv2DやActivation単位)で表示したいです。
2. 全結合層のうち出力側の一部の層を取り除きたい
下記の通り、全結合層はFlatten→Dense→Dropout→Denseから構成されていますが、このうち出力側のDropout,Denseを取り除きたいです。
現状model.layers.pop()するとSequentialごと削除されてしまいます。

###モデル
モデルは以下のように作成しました。

from keras.models import Sequential, Model, load_model from keras.layers import Flatten, Dense,Input, Dropout from efficientnet.keras import EfficientNetB0 from keras import optimizers input_shape = (9, 128, 3) input_tensor = Input(shape=input_shape) # EfficientNetB0 main_model = EfficientNetB0(include_top=False, weights='imagenet',input_tensor=input_tensor) # 全結合層 top_model = Sequential() top_model.add(Flatten(input_shape=main_model.output_shape[1:])) top_model.add(Dense(256, activation='relu')) top_model.add(Dropout(0.5)) top_model.add(Dense(2, activation='softmax')) top_model = Model(inputs=main_model.input, outputs=top_model(main_model.output)) top_model.compile(loss='categorical_crossentropy',optimizer=optimizers.SGD(lr=1e-3, momentum=0.9),metrics=['accuracy']) path_model = "./models/EfficientNetB0_FC_not_work.h5" top_model.save(path_model)

発生している問題・エラーメッセージ

1について

上で作成したモデルを読み込みmodel.summary()を表示したところ、以下のように全結合層はひとまとめにSequentialとなりました。

path_model = "./models/EfficientNetB0_FC_not_work.h5" model = load_model(path_model, compile=False) print(model.summary())
Model: "model_1" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) (None, 9, 128, 3) 0 __________________________________________________________________________________________________ stem_conv (Conv2D) (None, 5, 64, 32) 864 input_1[0][0] __________________________________________________________________________________________________ stem_bn (BatchNormalization) (None, 5, 64, 32) 128 stem_conv[0][0] __________________________________________________________________________________________________ stem_activation (Activation) (None, 5, 64, 32) 0 stem_bn[0][0] __________________________________________________________________________________________________ (中略) __________________________________________________________________________________________________ block7a_project_conv (Conv2D) (None, 1, 4, 320) 368640 block7a_se_excite[0][0] __________________________________________________________________________________________________ block7a_project_bn (BatchNormal (None, 1, 4, 320) 1280 block7a_project_conv[0][0] __________________________________________________________________________________________________ top_conv (Conv2D) (None, 1, 4, 1280) 409600 block7a_project_bn[0][0] __________________________________________________________________________________________________ top_bn (BatchNormalization) (None, 1, 4, 1280) 5120 top_conv[0][0] __________________________________________________________________________________________________ top_activation (Activation) (None, 1, 4, 1280) 0 top_bn[0][0] __________________________________________________________________________________________________ sequential_1 (Sequential) (None, 2) 1311490 top_activation[0][0] ================================================================================================== Total params: 5,361,054 Trainable params: 5,319,038 Non-trainable params: 42,016 __________________________________________________________________________________________________ None

2について

model.layers.pop()のあとmodel.summary()を表示したところ、以下のようにSequentialごと削除されました。

model.layers.pop() print(model.summary())
Model: "model_1" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) (None, 9, 128, 3) 0 __________________________________________________________________________________________________ stem_conv (Conv2D) (None, 5, 64, 32) 864 input_1[0][0] __________________________________________________________________________________________________ stem_bn (BatchNormalization) (None, 5, 64, 32) 128 stem_conv[0][0] __________________________________________________________________________________________________ stem_activation (Activation) (None, 5, 64, 32) 0 stem_bn[0][0] __________________________________________________________________________________________________ (中略) __________________________________________________________________________________________________ block7a_project_conv (Conv2D) (None, 1, 4, 320) 368640 block7a_se_excite[0][0] __________________________________________________________________________________________________ block7a_project_bn (BatchNormal (None, 1, 4, 320) 1280 block7a_project_conv[0][0] __________________________________________________________________________________________________ top_conv (Conv2D) (None, 1, 4, 1280) 409600 block7a_project_bn[0][0] __________________________________________________________________________________________________ top_bn (BatchNormalization) (None, 1, 4, 1280) 5120 top_conv[0][0] __________________________________________________________________________________________________ top_activation (Activation) (None, 1, 4, 1280) 0 top_bn[0][0] Total params: 4,049,564 Trainable params: 4,007,548 Non-trainable params: 42,016 __________________________________________________________________________________________________ None

補足情報

私は機械学習初心者でプログラミング歴もコンピュータの知識も浅いため、初心者にもわかりやすい説明をいただけると非常にありがたいです。

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

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

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

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

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

toast-uz

2021/07/16 23:22

まずは動くコードを提示お願いします。Modelの引数は、input、outputではなく、inputs、outputsが正しいので、提示されたコードを動かしていないものと思われます。
asdf1016

2021/07/17 03:23

大変失礼しました。 修正いたしましたのでよろしければご確認ください。
guest

回答1

0

ベストアンサー

質問者様の環境と版数が違うのか、そのまま実行するとエラーが出ますが、質問されているポイントについては確認できましたので、回答します。

先に全結合層を組み上げてから、base_modelに結合しているため、質問者様がレポートされている状況になってしまっています。

以下のFunctional API構文で、base_modelに追加すべき層を順次追加すると、うまくいきます。

Python

1x = main_model.output 2x = Flatten(input_shape=main_model.output_shape[1:])(x) 3x = Dense(256, activation='relu')(x) 4x = Dropout(0.5)(x) 5predictions = Dense(2, activation='softmax')(x) 6model = Model(inputs=main_model.input, outputs=predictions)

これで、model.summary()を確認いただければ、質問者様の要望する形になっていると思います。

参考: Keras公式ドキュメント - Functional APIのガイド

functional APIを利用することで,訓練済みモデルの再利用が簡単になります

また、質問者様の環境では問題無いものと思いますが、最近のtensorflow.kerasの環境では、model.layers.pop()では最終層を削除できませんので、ご注意ください。
参考: tf.keras.layers.pop() doesn't work, but tf.keras._layers.pop() does

投稿2021/07/17 05:11

編集2021/07/17 05:44
toast-uz

総合スコア3266

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

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

asdf1016

2021/07/18 00:18

解決しました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問