我想要一个预训练的模型来分类图像。每个图像都可以有多个类(在本例中最多为21个)。当然,并非所有类都出现在每个图像中。因此,我想在模型中添加一个Masking
图层来屏蔽所有零(如果某个类不存在,则给定值)。
现在我以前从未使用Masking
图层,但在大多数在线示例中,它都是在Input
图层之后直接添加的。但是,在下面的示例中,这是不可能的,因为Masking
图层与所有图层都不兼容(在这种情况下是Conv2D
图层。
可以在完全连接的输出层之前插入Masking
层。但这并没有真正影响模型的损失(损失大约是20!)。
我做得对还是在模型顶部添加Masking
图层完全没用?
我的模特
from keras.layers import Input, GlobalAveragePooling2D, Masking, Dense, Dropout
from keras.applications.inception_v3 import InceptionV3
from keras.models import Model
#Define input tensor
input_tensor = Input(shape=(512, 512, 3))
# create the base pre-trained model
base_model = InceptionV3(input_tensor=input_tensor, weights='imagenet', include_top=False)
# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# let's add a Mask fully-connected layer and a dropout
x = Masking(0.)(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.2)(x)
# and a logistic layer with 21 classes
predictions = Dense(21, activation='sigmoid')(x)
# create final model
model = Model(inputs=base_model.input, outputs=predictions)
# compile model
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
示例标签
# input
np.array([[1,2,0,0,0,6,7,8,0,0,0,12,13,14,15,16,17,18,19,20,21],
[0,2,0,4,5,6,7,8,9,10,11,0,0,14,15,16,17,18,19,20,21]])