目前我正在使用 VGG16 + Keras + Theano 认为迁移学习方法来识别植物类。它工作得很好,给了我很好的准确性。但我要解决的下一个问题是找到一种方法来识别输入图像是否包含植物。我不想让另一个分类器来做这件事,因为它不是很有效。
所以我做了一些搜索,发现我们可以从最新的模型层(激活层之前)获取激活并对其进行分析。
from keras import backend as K
model = util.load_model() # VGG16 model
model.load_weights(path_to_weights)
def get_activations(m, layer, X_batch):
x = [m.layers[0].input, K.learning_phase()]
y = [m.get_layer(layer).output]
get_activations = K.function(x, y)
activations = get_activations([X_batch, 0])
# trying to get some features from activations
# to understand how can we identify if an image is relevant
for l in activations[0]:
not_nulls = [x for x in l if x > 0]
# shows percentage of activated neurons
c1 = float(len(not_nulls)) / len(l)
n_activated = len(not_nulls)
print 'c1:{}, n_activated:{}'.format(c1, n_activated)
return activations
get_activations(model, 'the_latest_layer_name', inputs)
从上面的代码中我注意到,当我们有非常不相关的图像时,激活的神经元数量比包含植物的图像要大:
- 对于用于模型训练的图像,激活的神经元数量为 19%-23%
- 对于包含未知植物物种的图像 20%-26%
- 对于不相关的图像 24%-28%
了解与百分比值相关的图像是否相交并不是一个很好的功能。
那么,有没有解决这个问题的好方法呢?