2017-05-04 4 views
0

実際にKerasでVGG16のSequentialモデルバージョンを取得しようとしています。機能バージョンがで得ることができます。KerasでVGG機能モデルをシーケンシャルモデルに変換

from __future__ import division, print_function 

import os, json 
from glob import glob 
import numpy as np 
from scipy import misc, ndimage 
from scipy.ndimage.interpolation import zoom 

from keras import backend as K 
from keras.layers.normalization import BatchNormalization 
from keras.utils.data_utils import get_file 
from keras.models import Sequential 
from keras.layers.core import Flatten, Dense, Dropout, Lambda 
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D 
from keras.layers.pooling import GlobalAveragePooling2D 
from keras.optimizers import SGD, RMSprop, Adam 
from keras.preprocessing import image 
import keras 
import keras.applications.vgg16 
from keras.layers import Input 

input_tensor = Input(shape=(224,224,3)) 
VGG_model=keras.applications.vgg16.VGG16(weights='imagenet',include_top= True,input_tensor=input_tensor) 

その概要は次のようになります:

VGG_model.summary() 

Layer (type)      Output Shape   Param #  Connected to      
==================================================================================================== 
input_1 (InputLayer)    (None, 224, 224, 3) 0            
____________________________________________________________________________________________________ 
block1_conv1 (Convolution2D)  (None, 224, 224, 64) 1792  input_1[0][0]      
____________________________________________________________________________________________________ 
block1_conv2 (Convolution2D)  (None, 224, 224, 64) 36928  block1_conv1[0][0]    
____________________________________________________________________________________________________ 
block1_pool (MaxPooling2D)  (None, 112, 112, 64) 0   block1_conv2[0][0]    
____________________________________________________________________________________________________ 
block2_conv1 (Convolution2D)  (None, 112, 112, 128) 73856  block1_pool[0][0]     
____________________________________________________________________________________________________ 
block2_conv2 (Convolution2D)  (None, 112, 112, 128) 147584  block2_conv1[0][0]    
____________________________________________________________________________________________________ 
block2_pool (MaxPooling2D)  (None, 56, 56, 128) 0   block2_conv2[0][0]    
____________________________________________________________________________________________________ 
block3_conv1 (Convolution2D)  (None, 56, 56, 256) 295168  block2_pool[0][0]     
____________________________________________________________________________________________________ 
block3_conv2 (Convolution2D)  (None, 56, 56, 256) 590080  block3_conv1[0][0]    
____________________________________________________________________________________________________ 
block3_conv3 (Convolution2D)  (None, 56, 56, 256) 590080  block3_conv2[0][0]    
____________________________________________________________________________________________________ 
block3_pool (MaxPooling2D)  (None, 28, 28, 256) 0   block3_conv3[0][0]    
____________________________________________________________________________________________________ 
block4_conv1 (Convolution2D)  (None, 28, 28, 512) 1180160  block3_pool[0][0]     
____________________________________________________________________________________________________ 
block4_conv2 (Convolution2D)  (None, 28, 28, 512) 2359808  block4_conv1[0][0]    
____________________________________________________________________________________________________ 
block4_conv3 (Convolution2D)  (None, 28, 28, 512) 2359808  block4_conv2[0][0]    
____________________________________________________________________________________________________ 
block4_pool (MaxPooling2D)  (None, 14, 14, 512) 0   block4_conv3[0][0]    
____________________________________________________________________________________________________ 
block5_conv1 (Convolution2D)  (None, 14, 14, 512) 2359808  block4_pool[0][0]     
____________________________________________________________________________________________________ 
block5_conv2 (Convolution2D)  (None, 14, 14, 512) 2359808  block5_conv1[0][0]    
____________________________________________________________________________________________________ 
block5_conv3 (Convolution2D)  (None, 14, 14, 512) 2359808  block5_conv2[0][0]    
____________________________________________________________________________________________________ 
block5_pool (MaxPooling2D)  (None, 7, 7, 512)  0   block5_conv3[0][0]    
____________________________________________________________________________________________________ 
flatten (Flatten)    (None, 25088)   0   block5_pool[0][0]     
____________________________________________________________________________________________________ 
fc1 (Dense)      (None, 4096)   102764544 flatten[0][0]      
____________________________________________________________________________________________________ 
fc2 (Dense)      (None, 4096)   16781312 fc1[0][0]       
____________________________________________________________________________________________________ 
predictions (Dense)    (None, 1000)   4097000  fc2[0][0]       
==================================================================================================== 
Total params: 138,357,544 
Trainable params: 138,357,544 
Non-trainable params: 0 
____________________________________________________________________________________________________ 

このウェブサイトhttps://github.com/fchollet/keras/issues/3190によれば、

Sequential(layers=functional_model.layers) 

がシーケンシャルモデルに機能モデルをひそかでし言います。私がしなければしかし、:

model = Sequential(layers=VGG_model.layers) 
model.summary() 

それは

Layer (type)      Output Shape   Param #  Connected to      
==================================================================================================== 
input_1 (InputLayer)    (None, 224, 224, 3) 0            
____________________________________________________________________________________________________ 
block1_conv1 (Convolution2D)  (None, 224, 224, 64) 1792  input_1[0][0]      
                    input_1[0][0]      
                    input_1[0][0]      
____________________________________________________________________________________________________ 
block1_conv2 (Convolution2D)  (None, 224, 224, 64) 36928  block1_conv1[0][0]    
                    block1_conv1[1][0]    
                    block1_conv1[2][0]    
____________________________________________________________________________________________________ 
block1_pool (MaxPooling2D)  (None, 112, 112, 64) 0   block1_conv2[0][0]    
                    block1_conv2[1][0]    
                    block1_conv2[2][0]    
____________________________________________________________________________________________________ 
block2_conv1 (Convolution2D)  (None, 112, 112, 128) 73856  block1_pool[0][0]     
                    block1_pool[1][0]     
                    block1_pool[2][0]     
____________________________________________________________________________________________________ 
block2_conv2 (Convolution2D)  (None, 112, 112, 128) 147584  block2_conv1[0][0]    
                    block2_conv1[1][0]    
                    block2_conv1[2][0]    
____________________________________________________________________________________________________ 
block2_pool (MaxPooling2D)  (None, 56, 56, 128) 0   block2_conv2[0][0]    
                    block2_conv2[1][0]    
                    block2_conv2[2][0]    
____________________________________________________________________________________________________ 
block3_conv1 (Convolution2D)  (None, 56, 56, 256) 295168  block2_pool[0][0]     
                    block2_pool[1][0]     
                    block2_pool[2][0]     
____________________________________________________________________________________________________ 
block3_conv2 (Convolution2D)  (None, 56, 56, 256) 590080  block3_conv1[0][0]    
                    block3_conv1[1][0]    
                    block3_conv1[2][0]    
____________________________________________________________________________________________________ 
block3_conv3 (Convolution2D)  (None, 56, 56, 256) 590080  block3_conv2[0][0]    
                    block3_conv2[1][0]    
                    block3_conv2[2][0]    
____________________________________________________________________________________________________ 
block3_pool (MaxPooling2D)  (None, 28, 28, 256) 0   block3_conv3[0][0]    
                    block3_conv3[1][0]    
                    block3_conv3[2][0]    
____________________________________________________________________________________________________ 
block4_conv1 (Convolution2D)  (None, 28, 28, 512) 1180160  block3_pool[0][0]     
                    block3_pool[1][0]     
                    block3_pool[2][0]     
____________________________________________________________________________________________________ 
block4_conv2 (Convolution2D)  (None, 28, 28, 512) 2359808  block4_conv1[0][0]    
                    block4_conv1[1][0]    
                    block4_conv1[2][0]    
____________________________________________________________________________________________________ 
block4_conv3 (Convolution2D)  (None, 28, 28, 512) 2359808  block4_conv2[0][0]    
                    block4_conv2[1][0]    
                    block4_conv2[2][0]    
____________________________________________________________________________________________________ 
block4_pool (MaxPooling2D)  (None, 14, 14, 512) 0   block4_conv3[0][0]    
                    block4_conv3[1][0]    
                    block4_conv3[2][0]    
____________________________________________________________________________________________________ 
block5_conv1 (Convolution2D)  (None, 14, 14, 512) 2359808  block4_pool[0][0]     
                    block4_pool[1][0]     
                    block4_pool[2][0]     
____________________________________________________________________________________________________ 
block5_conv2 (Convolution2D)  (None, 14, 14, 512) 2359808  block5_conv1[0][0]    
                    block5_conv1[1][0]    
                    block5_conv1[2][0]    
____________________________________________________________________________________________________ 
block5_conv3 (Convolution2D)  (None, 14, 14, 512) 2359808  block5_conv2[0][0]    
                    block5_conv2[1][0]    
                    block5_conv2[2][0]    
____________________________________________________________________________________________________ 
block5_pool (MaxPooling2D)  (None, 7, 7, 512)  0   block5_conv3[0][0]    
                    block5_conv3[1][0]    
                    block5_conv3[2][0]    
____________________________________________________________________________________________________ 
flatten (Flatten)    (None, 25088)   0   block5_pool[0][0]     
                    block5_pool[1][0]     
                    block5_pool[2][0]     
____________________________________________________________________________________________________ 
fc1 (Dense)      (None, 4096)   102764544 flatten[0][0]      
                    flatten[1][0]      
                    flatten[2][0]      
____________________________________________________________________________________________________ 
fc2 (Dense)      (None, 4096)   16781312 fc1[0][0]       
                    fc1[1][0]       
                    fc1[2][0]       
____________________________________________________________________________________________________ 
predictions (Dense)    (None, 1000)   4097000  fc2[0][0]       
                    fc2[1][0]       
                    fc2[2][0]       
==================================================================================================== 
Total params: 138,357,544 
Trainable params: 138,357,544 
Non-trainable params: 0 
_ 

これは、新しい層が前の層3回に接続されているので、元の機能モデルと異なっているにつながります。人々は、機能モデルを使用する方がより強力であると言います。しかし、私がしたいのは、最終的な予測レイヤをポップすることだけです。そして、機能モデルは、これを行うことができない...

あなただけの出力として、前の層を取って別の Modelをdefininingによる「ポップ」最終層をすることができます
+0

なぜシーケンシャルモデルが必要ですか? –

答えて

1

poppedModel = Model(VGG_model.input,VGG_model.layers[-2].output) 

このモデルは、全く同じ重みを共有します元のモデル、トレーニングは両方のモデルに影響します。 、あなたはVGGの重みに影響を与えることなく、anotherModelに新しいレイヤーを養成しようとする場合には、しかし、重要なのです

popOut = poppedModel(input_tensor) 
newLayOut = SomeKerasLayer(blablabla)(popOut) 

anotherModel = Model(input_tensor, newLayOut) 
#anotherModel will also share weights with poppedModel and VGG_model in the layers they have in common. 

こと:

あなたは、poppedModel後に何の問題を自分自身の層(あるいはモデル)を追加することはできませんpoppedModel.trainable = Falseとその中の各レイヤーをpoppedModel.layers[i].trainable = FalseにしてからanotherModelをコンパイルします。

1

私もこれに苦労していましたが、以前のポスターはほとんどそこにありましたが、前に私に悩まされていた特定の細部は除外されました。 実際、Functional APIで作成されたモデルでも「ポップ」を行うことはできますが、もう少し作業はあります。ここで

#Get the last but one layer/tensor from the old model 
last_layer = model.layers[-2].output 

#Define the new layer/tensor for the new model 
new_model = Dense(2, activation='softmax', name='Binary_predictions')(last_layer) 

#Create the new model, with the old models input and the new_model tensor as the output 
new_model = Model(model.input, new_model, name='Finetuned_VGG16') 

#Set all layers,except the last one to not trainable 
for layer in new_model.layers[:-1]: layer.trainable=False 

#Compile the new model 
new_model.compile(optimizer=Adam(lr=learning_rate), 
       loss='categorical_crossentropy', metrics=['accuracy']) 

#now train with the new outputs (cats and dogs!) 

は、これが作成されます、そして、私は最後の層を "ポップ" が、ポップを使用していない私のモデル(単なるバニラVGG16)

model.summary() 
 
____________________________________________________________________________________________________ 
Layer (type)      Output Shape   Param #  Connected to      
==================================================================================================== 
input_6 (InputLayer)    (None, 224, 224, 3) 0            
____________________________________________________________________________________________________ 
block1_conv1 (Convolution2D)  (None, 224, 224, 64) 1792  input_6[0][0]      
____________________________________________________________________________________________________ 
block1_conv2 (Convolution2D)  (None, 224, 224, 64) 36928  block1_conv1[0][0]    
____________________________________________________________________________________________________ 
block1_pool (MaxPooling2D)  (None, 112, 112, 64) 0   block1_conv2[0][0]    
____________________________________________________________________________________________________ 
block2_conv1 (Convolution2D)  (None, 112, 112, 128) 73856  block1_pool[0][0]     
____________________________________________________________________________________________________ 
block2_conv2 (Convolution2D)  (None, 112, 112, 128) 147584  block2_conv1[0][0]    
____________________________________________________________________________________________________ 
block2_pool (MaxPooling2D)  (None, 56, 56, 128) 0   block2_conv2[0][0]    
____________________________________________________________________________________________________ 
block3_conv1 (Convolution2D)  (None, 56, 56, 256) 295168  block2_pool[0][0]     
____________________________________________________________________________________________________ 
block3_conv2 (Convolution2D)  (None, 56, 56, 256) 590080  block3_conv1[0][0]    
____________________________________________________________________________________________________ 
block3_conv3 (Convolution2D)  (None, 56, 56, 256) 590080  block3_conv2[0][0]    
____________________________________________________________________________________________________ 
block3_pool (MaxPooling2D)  (None, 28, 28, 256) 0   block3_conv3[0][0]    
____________________________________________________________________________________________________ 
block4_conv1 (Convolution2D)  (None, 28, 28, 512) 1180160  block3_pool[0][0]     
____________________________________________________________________________________________________ 
block4_conv2 (Convolution2D)  (None, 28, 28, 512) 2359808  block4_conv1[0][0]    
____________________________________________________________________________________________________ 
block4_conv3 (Convolution2D)  (None, 28, 28, 512) 2359808  block4_conv2[0][0]    
____________________________________________________________________________________________________ 
block4_pool (MaxPooling2D)  (None, 14, 14, 512) 0   block4_conv3[0][0]    
____________________________________________________________________________________________________ 
block5_conv1 (Convolution2D)  (None, 14, 14, 512) 2359808  block4_pool[0][0]     
____________________________________________________________________________________________________ 
block5_conv2 (Convolution2D)  (None, 14, 14, 512) 2359808  block5_conv1[0][0]    
____________________________________________________________________________________________________ 
block5_conv3 (Convolution2D)  (None, 14, 14, 512) 2359808  block5_conv2[0][0]    
____________________________________________________________________________________________________ 
block5_pool (MaxPooling2D)  (None, 7, 7, 512)  0   block5_conv3[0][0]    
____________________________________________________________________________________________________ 
flatten (Flatten)    (None, 25088)   0   block5_pool[0][0]     
____________________________________________________________________________________________________ 
fc1 (Dense)      (None, 4096)   102764544 flatten[0][0]      
____________________________________________________________________________________________________ 
fc2 (Dense)      (None, 4096)   16781312 fc1[0][0]       
____________________________________________________________________________________________________ 
predictions (Dense)    (None, 1000)   4097000  fc2[0][0]       
==================================================================================================== 
Total params: 138,357,544 
Trainable params: 138,357,544 
Non-trainable params: 0 
____________________________________________________________________________________________________ 

ちょうど機能APIと

最後のレイヤーが置き換えられ、古いレイヤーが固定された(訓練可能でない)新しいモデル(new_model)。

new_model.summary() 

____________________________________________________________________________________________________ 
Layer (type)      Output Shape   Param #  Connected to      
==================================================================================================== 
input_6 (InputLayer)    (None, 224, 224, 3) 0            
____________________________________________________________________________________________________ 
block1_conv1 (Convolution2D)  (None, 224, 224, 64) 1792  input_6[0][0]      
____________________________________________________________________________________________________ 
block1_conv2 (Convolution2D)  (None, 224, 224, 64) 36928  block1_conv1[0][0]    
____________________________________________________________________________________________________ 
block1_pool (MaxPooling2D)  (None, 112, 112, 64) 0   block1_conv2[0][0]    
____________________________________________________________________________________________________ 
block2_conv1 (Convolution2D)  (None, 112, 112, 128) 73856  block1_pool[0][0]     
____________________________________________________________________________________________________ 
block2_conv2 (Convolution2D)  (None, 112, 112, 128) 147584  block2_conv1[0][0]    
____________________________________________________________________________________________________ 
block2_pool (MaxPooling2D)  (None, 56, 56, 128) 0   block2_conv2[0][0]    
____________________________________________________________________________________________________ 
block3_conv1 (Convolution2D)  (None, 56, 56, 256) 295168  block2_pool[0][0]     
____________________________________________________________________________________________________ 
block3_conv2 (Convolution2D)  (None, 56, 56, 256) 590080  block3_conv1[0][0]    
____________________________________________________________________________________________________ 
block3_conv3 (Convolution2D)  (None, 56, 56, 256) 590080  block3_conv2[0][0]    
____________________________________________________________________________________________________ 
block3_pool (MaxPooling2D)  (None, 28, 28, 256) 0   block3_conv3[0][0]    
____________________________________________________________________________________________________ 
block4_conv1 (Convolution2D)  (None, 28, 28, 512) 1180160  block3_pool[0][0]     
____________________________________________________________________________________________________ 
block4_conv2 (Convolution2D)  (None, 28, 28, 512) 2359808  block4_conv1[0][0]    
____________________________________________________________________________________________________ 
block4_conv3 (Convolution2D)  (None, 28, 28, 512) 2359808  block4_conv2[0][0]    
____________________________________________________________________________________________________ 
block4_pool (MaxPooling2D)  (None, 14, 14, 512) 0   block4_conv3[0][0]    
____________________________________________________________________________________________________ 
block5_conv1 (Convolution2D)  (None, 14, 14, 512) 2359808  block4_pool[0][0]     
____________________________________________________________________________________________________ 
block5_conv2 (Convolution2D)  (None, 14, 14, 512) 2359808  block5_conv1[0][0]    
____________________________________________________________________________________________________ 
block5_conv3 (Convolution2D)  (None, 14, 14, 512) 2359808  block5_conv2[0][0]    
____________________________________________________________________________________________________ 
block5_pool (MaxPooling2D)  (None, 7, 7, 512)  0   block5_conv3[0][0]    
____________________________________________________________________________________________________ 
flatten (Flatten)    (None, 25088)   0   block5_pool[0][0]     
____________________________________________________________________________________________________ 
fc1 (Dense)      (None, 4096)   102764544 flatten[0][0]      
____________________________________________________________________________________________________ 
fc2 (Dense)      (None, 4096)   16781312 fc1[0][0]       
____________________________________________________________________________________________________ 
Binary_predictions (Dense)  (None, 2)    8194  fc2[0][0]       
==================================================================================================== 
Total params: 134,268,738 
Trainable params: 8,194 
Non-trainable params: 134,260,544 

トリッキーな部分は最後のレイヤーとして.outputを取得していました。これはそれがTensorになっているからです。新しいDenseレイヤーの入力としてそのTensorを使用して、新しいモデルの最終出力をTHATにします。

希望するものは...

トーン

関連する問題