2017-11-21 13 views
0

ポップ()の後に動作します。しかし、keras - モデルは文句を言わない私は、標準ResNet50モデル取った

top_model = Sequential() 
top_model.add(Flatten(input_shape=model.output_shape[1:])) 
top_model.add(Dense(256, activation='relu')) 
top_model.add(Dropout(0.5)) 
top_model.add(Dense(2, activation='softmax')) 

model = Model(input=model.input, output=top_model(model.output)) 

それは素晴らしい作品。この方法:

model = keras.applications.resnet50.ResNet50(include_top=False, 
            weights='imagenet', 
            classes=10, 
            input_shape=(224, 224, 3)) 

をそして、私自身のいくつかの緻密層を追加しました私はmodel.pop() kerasで最後の緻密でドロップアウト層を削除したい場合、文句を言わないうまく機能:

model.layers[-1].layers 
[<keras.layers.core.Flatten at 0x16b5c00b8>, 
<keras.layers.core.Dense at 0x16b5c0320>, 
<keras.layers.core.Dropout at 0x16b5c02e8>, 
<keras.layers.core.Dense at 0x16b5c0d68>] 

model.layers[-1].pop() 
model.layers[-1].pop() 
model.layers[-1].layers 

[<keras.layers.core.Flatten at 0x1ae6e5940>, 
<keras.layers.core.Dense at 0x1ae6e9e10>] 

model.layers[-1].outputs = [model.layers[-1].layers[-1].output] 
model.outputs = model.layers[-1].outputs 
model.layers[-1].layers[-1].outbound_nodes = [] 

をそれから私はちょうどモデルをコンパイルし、予測しようとすると、私はエラーを取得する:

You must feed a value for placeholder tensor 'flatten_7_input_12' with dtype float and shape [?,1,1,2048] 

答えて

0

model.pop()は、新たな最後の層の出力にmodel.outputの設定を含め、すべての基礎となる設定、の世話をします。したがって、出力に関する何も処理する必要はありません。
model変数に割り当てることにも注意してください。したがって、model.outputsは既に拡張モデルの出力を参照しています。ここで

はTensorFlowバックエンド(1.4.0)でkeras 2.0.6で正常に動作するサンプルコードです:

import keras 
from keras.models import Sequential, Model 
from keras.layers import * 
import numpy as np 

model = keras.applications.resnet50.ResNet50(include_top=False, 
           weights='imagenet', 
           classes=10, 
           input_shape=(224, 224, 3)) 

top_model = Sequential() 
top_model.add(keras.layers.Flatten(input_shape=model.output_shape[1:])) 
top_model.add(keras.layers.Dense(256, activation='relu')) 
top_model.add(keras.layers.Dropout(0.5)) 
top_model.add(keras.layers.Dense(2, activation='softmax')) 

model_extended = Model(input=model.input, output=top_model(model.output)) 
model_extended.layers[-1].pop() 
model_extended.layers[-1].pop() 
model_extended.compile(optimizer='rmsprop', 
       loss='categorical_crossentropy', 
       metrics=['accuracy']) 

model_extended.predict(np.zeros((1, 224, 224, 3))) 
+0

私の最後の層は、モデルそのものです。私が 'model.pop'を呼び出すと、Denseレイヤー、ドロップアウトとFlattenの両方がポップされます。私は最後の高密度とドロップアウトをポップしたいだけです。 回答する前に質問をお読みください –

+0

最後のレイヤー自体が順次モデルであることを理解しています。ただし、順次モデルでmodel.pop()を使用する場合は、出力を手動で設定する必要はありません。私の拡張答えをチェックしてください。 – AHA

関連する問題