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

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

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

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

深層学習

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

機械学習

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

Python

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

Q&A

解決済

1回答

4382閲覧

自作モデルで転移学習をするにはどうしたら良いですか.

kohei_0730

総合スコア1

Keras

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

深層学習

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/09/20 13:11

前提・実現したいこと

pythonにて,kerasを用いて自作モデルをもとに転移学習をしようとしています.

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

VGG16などの提供されているモデルでは,転移学習を行う際にモデルを読み込む時,

base_model = VGG16(include_top=False,weights='imagine',input_shape=input_shape)

のように引数なども提供されており,比較的簡単に実装することができます.

これと同様のことを,自作モデルで記述する方法を知りたいです.

試したこと

現在試した方法として,以下のように

base_model = load_model('モデル名',include_top,・・・) #・・・は先ほどのVGG16の際に記述した内容と同様

を試しましたが,以下のエラーが吐かれました.

base_model = base_model(input_shape=input_shape,include_top=False,weights="imagenet")

TypeError: call() missing 1 required positional argument: 'inputs'

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

tensorflow=1.14.0=gpu_py36h305fd99_0
keras=2.2.4=0
keras-applications=1.0.8=py_1
keras-base=2.2.4=py36_0
keras-preprocessing=1.1.0=py_1
opencv-python=4.4.0.46=pypi_0

解決して欲しいこと

自作モデルにおいても,転移学習を実行するためにinclude_top=Falseを行うにはどうしたら良いでしょうか.
転移学習をする方法など,教えていただきたいです.

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

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

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

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

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

guest

回答1

0

ベストアンサー

VGG16は、関数として定義されています。

参考: GitHubのVGG16のソース

この中で、if include_top:などの処理が愚直に記載されているに過ぎません。

質問者様が利用したload_modelはモデルをまるごとロードする関数であり、include_topなどのオプション機能はありません。

ですので、def MyModelといった形でinclude_topを引数に持つ新たな関数を作成し、その中でload_modelを呼び出し、if include_top:などと処理を自分で実装していくしかありません。

投稿2021/09/23 04:24

toast-uz

総合スコア3266

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

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

kohei_0730

2021/09/23 11:05

回答ありがとうございます. VGG16などの提供されているモデルそれぞれに独自に実装されているものなのですね. VGG16のコードを確認したところ,include_topの部分では,FalseかTrueかで全統合層を含んでいるモデルか,含んでいないモデルをロードするのかを切り替えているようでした. ここで,疑問が二つできたのでよろしければ教えていただきたいです. ①VGG16のように,そもそものモデルに全統合層を構築していないモデルを構築し,それを利用すれば良いのでしょうか. ②もしくは,呼び出したモデルから全統合層以外のみを利用するように実装できる方法があるのでしょうか. お時間がある時で構わないので,よろしければ回答していただけると幸いです.
toast-uz

2021/09/23 11:29 編集

両方可能です。学習済ウエイトも用意することを考えると、②の方が簡便でしょう。 全結合層は、Sequentialでモデル本体に結合されているかと思います。これはLayerのリストとして表現されていますので、以下のようにすれば、最後の方の層を削除したモデルが生成できます。 new_model = tf.keras.models.Sequential(base_model.layers[:-1]) 既存のモデルから転移学習やファイチューチングをする際、include_topといった便利なオプションが無い場合、上記のテクニックを使って全結合層を取り除きます。逆に、このテクニックを知っていれば、自作モデルにわざわざinclude_topオプションを作らなくても用が足りるかもしれません。
kohei_0730

2021/09/23 12:14

なるほど. とてもわかりやすく,助かります. 変にinclude_topオプションを制作するよりも,ご教授いただいたテクニックを利用する方が確実な方法と言えそうですね. 最後にこのテクニックについてなのですが,こちらは構築した既存のモデルであれば,どのようなモデルに対しても(CNN,NNなど)活用できるものでしょうか. 予想としては,VGG16自体がCNNだったと記憶しているので,CNNで構築してあるものには使えるのではと思っています. 最後まで,どうかよろしくお願いします.
toast-uz

2021/09/23 12:24

全結合層をSequentialで接続していれば、どんなモデルでも(もちろんCNNでも)使えます。なお、Sequentialで接続していない場合でも、方法は異なりますが、何からの方法で同様に全結合層以外を取り出すことも、できる場合が多いです。学習モデルは、Pythonのリストや辞書の組み合わせで表現されますので。Sequentialで接続している=リスト構造である、というだけです。
kohei_0730

2021/09/23 12:54

基本的にモデルのoutputとなっている部分を除いてモデルを取り出すことができれば良いという認識でしょうか.
toast-uz

2021/09/23 13:12 編集

はい。こちらで類似質問回答をしていますので、参考にしてください。Functional APIの記述を覚えると、モデルの再利用が容易になります。 https://teratail.com/questions/349871
kohei_0730

2021/09/24 02:30

ありがとうございます!! とても助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問