web-dev-qa-db-ja.com

Kerasでは、モデルに含まれる「モデル」オブジェクトに関連付けられたレイヤー名を取得する方法は?

最初のベースでVGG16ネットワークを使用してシーケンシャルモデルを作成しました。次に例を示します。

from keras.applications import VGG16
conv_base = VGG16(weights='imagenet',
                  # do not include the top, fully-connected Dense layers 
                  include_top=False,
                  input_shape=(150, 150, 3))

from keras import models
from keras import layers

model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
# the 3 corresponds to the three output classes
model.add(layers.Dense(3, activation='sigmoid'))

私のモデルは次のようになります。

model.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
vgg16 (Model)                (None, 4, 4, 512)         14714688  
_________________________________________________________________
flatten_1 (Flatten)          (None, 8192)              0         
_________________________________________________________________
dense_7 (Dense)              (None, 256)               2097408   
_________________________________________________________________
dense_8 (Dense)              (None, 3)                 771       
=================================================================
Total params: 16,812,867
Trainable params: 16,812,867
Non-trainable params: 0
_________________________________________________________________

次に、ネットワークのvgg16モデル部分に関連付けられているレイヤー名を取得します。つまり何かのようなもの:

layer_name = 'block3_conv1'
filter_index = 0

layer_output = model.get_layer(layer_name).output
loss = K.mean(layer_output[:, :, :, filter_index])

ただし、vgg16畳み込みはモデルとして表示され、レイヤーは公開されていないため、エラーが発生します。

ValueError:そのようなレイヤーはありません:block3_conv1

どうすればいいですか?

10
Ryan Chase

重要なのは、最初にModelオブジェクトで_.get_layer_を実行し、次に特定のvgg16レイヤーを指定して別の_.get_layer_を実行し、THEN do .outputを実行することです。

layer_output = model.get_layer('vgg16').get_layer('block3_conv1').output

19
Ryan Chase

VGG16インスタンスからレイヤーの名前を取得するには、次のコードを使用します。

for layer in conv_base.layers:
    print(layer.name)

名前はモデル内で同じでなければなりません。これを示すには、次のことができます。

print([layer.name for layer in model.get_layer('vgg16').layers])

ライアンが見せてくれたように。 vgg16レイヤーを呼び出すには、最初にget_layerメソッドを使用してモデルから呼び出す必要があります。

3
Liam9905

さらに使用するために、リストにレイヤーの名前を保存するだけです

    layer_name=[]

    for layer in base_model.layers:
    print(layer.name)
    layer_name.append(layer.name)
2
Akanksha Pathak