VGG16の引数pooling
keras.applications.vgg16.VGG16(include_top=True, weights='imagenet', input_tensor=None, input_shape=None, pooling=None, classes=1000)
引数にpooling
というのがある。
pooling: 特徴量抽出のためのオプショナルなpooling mode,include_topがFalseの場合のみ指定可能.
・None:モデルの出力が,最後のconvolutional layerの4階テンソルであることを意味しています.
・'avg':最後のconvolutional layerの出力にglobal average poolingが適用されることで,モデルの出力が2階テンソルになることを意味しています.
・'max':global max poolingが適用されることを意味します.
引用:https://keras.io/ja/applications/
pooling='None'
の場合、出力が4階テンソルとなる。要は4次元のデータとなる。この場合、
conv_base = VGG16(weights='imagenet', include_top=False, input_shape=(150,150,3))
model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
このようにflattenを用いて全結合をしないといけない。
それに対して、pooling='avg'またはpooling='max'
のときは、
conv_base = VGG16(weights='imagenet', include_top=False,pooling='avg', input_shape=(150,150,3))
model = models.Sequential()
model.add(conv_base)
model.add(layers.Dense(1, activation='sigmoid'))
global average pooling
によって全結合のようなものが行われるため、flatten
はいらない。
参考
https://keras.io/applications/#vgg16
https://qiita.com/mine820/items/1e49bca6d215ce88594a