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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

10180閲覧

Kerasで学習済みのモデルを使って別のデータを学習したい

SuzuAya

総合スコア71

Keras

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2019/08/05 06:43

編集2019/08/05 08:05

前提・実現したいこと

kerasで学習済みのモデルを使って新しいデータの学習を行いたいのですが、うまくいっていないためこちらで質問させていただきます。
学習済みモデルの下5層を削除し、Flatten層と全結合層を追加したいのですが、以下のコードを実行し、model.summaryを確認すると学習済みモデルがそのまま表示されます。
どうすれば上記のやりたいことを実現できるかご教示いただけないでしょうか。
初めての試みのため、説明や理解に不足があるかと思いますが、ご確認いただけますと幸いです。

該当のソースコード

Python

1from glob import glob 2import warnings 3 4import keras 5from keras.datasets import mnist 6from keras.models import Sequential, load_model, Model 7from keras.layers import Dense, Dropout, Activation, Flatten 8from keras.layers import Conv2D, MaxPooling2D 9from keras.models import load_model 10from keras.optimizers import SGD, Adam 11from keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau, CSVLogger, LearningRateScheduler 12from keras.utils import np_utils 13 14import h5py 15 16#学習済みモデルの読み込み 17model = load_model('./models/mnist_vgg8_arcface_3d/original_model.hdf5', custom_objects={'ArcFace': ArcFace}) 18 19#学習済みモデルの下から5層を削除(うまくいっていない) 20model.layers.pop() 21model.layers.pop() 22model.layers.pop() 23model.layers.pop() 24model.layers.pop() 25 26#学習済みモデルの23層までは再学習を行わない(これはうまくいっている様子) 27for i in range(24): 28 model.layers[i].trainable=False 29 30#Flatten層と全結合層の追加(うまくいっていない) 31input_shape=(28, 28, 1) 32image = Input(shape=input_shape, name='model_input') 33x = Flatten()(image) 34Dense(1, activation='sigmoid', name='ALOCC')(x) 35model = Model(inputs=model.input, outputs=model.output) 36 37model.summary()

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

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

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

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

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

0kcal

2019/08/05 10:20

model = Model(inputs=model.input, outputs=model.output) あたりも、全然、その前の何行かを 引き込めてない書き方だと思います。
SuzuAya

2019/08/05 11:35

0kal様、ご指摘ありがとうございました。
guest

回答1

0

ベストアンサー

Keras の使い方として layers 属性を書き換えたりするのは想定していないと思います。

model.layers.pop()

すでにあるモデルの途中の層から新たに層を追加してモデルを作りたい場合は以下のようにします。

python

1from tensorflow.keras.layers import Activation, Conv2D, Dense, Flatten, MaxPooling2D 2from tensorflow.keras.models import Sequential, Model 3 4# LeNetを構築する 5model = Sequential( 6 [ 7 Conv2D( 8 20, 9 kernel_size=3, 10 padding="same", 11 activation="relu", 12 input_shape=(28, 28, 3), 13 ), 14 MaxPooling2D(), 15 Conv2D(50, kernel_size=3, padding="same", activation="relu"), 16 MaxPooling2D(), 17 Flatten(), 18 Dense(500, activation="relu"), 19 Dense(10, activation="softmax"), 20 ] 21) 22model.summary() 23# Model: "sequential" 24# _________________________________________________________________ 25# Layer (type) Output Shape Param # 26# ================================================================= 27# conv2d (Conv2D) (None, 28, 28, 20) 560 28# _________________________________________________________________ 29# max_pooling2d (MaxPooling2D) (None, 14, 14, 20) 0 30# _________________________________________________________________ 31# conv2d_1 (Conv2D) (None, 14, 14, 50) 9050 32# _________________________________________________________________ 33# max_pooling2d_1 (MaxPooling2 (None, 7, 7, 50) 0 34# _________________________________________________________________ 35# flatten (Flatten) (None, 2450) 0 36# _________________________________________________________________ 37# dense (Dense) (None, 500) 1225500 38# _________________________________________________________________ 39# dense_1 (Dense) (None, 10) 5010 40# ================================================================= 41# Total params: 1,240,120 42# Trainable params: 1,240,120 43# Non-trainable params: 0 44# _________________________________________________________________ 45model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) 46 47# すでにあるモデルの途中から新しいモデルを作る。 48flatten = model.layers[-3].output 49print(flatten.name) 50 51fc1 = Dense(100, activation="relu")(flatten) 52fc2 = Dense(20, activation="softmax")(fc1) 53new_model = Model(inputs=model.inputs, outputs=fc2) 54new_model.summary() 55# Model: "model" 56# _________________________________________________________________ 57# Layer (type) Output Shape Param # 58# ================================================================= 59# conv2d_input (InputLayer) [(None, 28, 28, 3)] 0 60# _________________________________________________________________ 61# conv2d (Conv2D) (None, 28, 28, 20) 560 62# _________________________________________________________________ 63# max_pooling2d (MaxPooling2D) (None, 14, 14, 20) 0 64# _________________________________________________________________ 65# conv2d_1 (Conv2D) (None, 14, 14, 50) 9050 66# _________________________________________________________________ 67# max_pooling2d_1 (MaxPooling2 (None, 7, 7, 50) 0 68# _________________________________________________________________ 69# flatten (Flatten) (None, 2450) 0 70# _________________________________________________________________ 71# dense_2 (Dense) (None, 100) 245100 72# _________________________________________________________________ 73# dense_3 (Dense) (None, 20) 2020 74# ================================================================= 75# Total params: 256,730 76# Trainable params: 256,730 77# Non-trainable params: 0 78# _________________________________________________________________ 79 80# 再度コンパイルが必要 81new_model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

投稿2019/08/05 08:44

tiitoi

総合スコア21956

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

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

SuzuAya

2019/08/05 11:34

>tiitoi様 いつもわかりやすいご回答を本当にありがとうございます。教えていただいた内容でうまくいきました!ちなみに、Flatten層より前の層は学習させたくない場合は、以下の2行を記載しておけば良いという理解で合っていますでしょうか。 for i in range(24):# 23層目(Flatten層の1つ前)までは再学習させない model.layers[i].trainable=False
tiitoi

2019/08/05 11:43

それであってますが、model は元のモデルではなく、新しく作成したモデルオブジェクトである必要があります。
SuzuAya

2019/08/05 11:52

>tiitoi様 早速ありがとうございます!新しいモデルオブジェクトで試してみましたが問題なさそうです。大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問