gpt4 book ai didi

python - 了解图像是否与用于训练卷积神经网络的数据集相关的有效方法

转载 作者:行者123 更新时间:2023-11-28 19:10:56 25 4
gpt4 key购买 nike

目前我正在使用 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)

从上面的代码我注意到,当我们有非常不相关的图像时,激活的神经元数量比包含植物的图像大:

  1. 对于用于模型训练的图像,激活的神经元数量 19%-23%
  2. 对于包含未知植物种类的图像 20%-26%
  3. 对于不相关的图片 24%-28%

了解与百分比值相关的图像是否相交并不是一个很好的功能。

那么,有什么好的方法可以解决这个问题吗?

最佳答案

感谢上面评论中 Feras 的想法。经过一些试验,我想出了最终的解决方案,可以解决这个问题,准确率高达 99.99%。

步骤是:

  1. 在数据集上训练您的模型;
  2. 通过使用上一步中经过训练的模型预测相关和不相关的图像来存储激活(参见上面的获取方法)。您应该从倒数第二层获得激活。对于 VGG16,它是两个 Dense(4096) 中的最后一个,对于 InceptionV3 - 一个额外的倒数第二个 Dense(1024) 层,对于 resnet50 - 一个额外的倒数第二个 Dense(2048) 层。
  3. 使用存储的激活数据解决二元问题。我已经尝试了一个简单的平面 NN 和 Logistic 回归。两者的准确性都很好(平面 NN 更准确一些),但我选择了 Logistic 回归,因为它更简单、更快并且消耗更少的内存和 CPU/GPU。

在您的模型重新训练后,每次都应重复此过程,因为每次 CNN 的最终权重都不同,并且之前有效的权重下次会有所不同。

因此,我们有另一个解决问题的小模型。

关于python - 了解图像是否与用于训练卷积神经网络的数据集相关的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40301860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com