3

В настоящее время я использую 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% растений

Это не очень хорошая функция, чтобы понять, пересекается ли изображение, соответствующее процентным значениям.

Итак, есть ли хороший способ решить эту проблему?

+0

Я думаю, лучший способ - проверить, какие нуэлоны активированы для соответствующих изображений, а не процент нейронов. Много ли перекрывается? –

+0

, поскольку Кришан сказал, что лучший способ - рассмотреть их как функции и проверить, есть ли какая-либо корреляция между кластерами двух классов. другой классификатор может быть добавлен также к определенному уровню, чтобы принять решение о да или нет. – Feras

ответ

0

Благодаря идее Фераса в комментарии выше. После некоторых испытаний я придумал окончательное решение, позволяющее решить эту проблему с точностью до 99,99%.

Шаги:

  1. Тренируйте модель на наборе данных;
  2. Активации магазина (см. Метод выше, как их получить), путем прогнозирования соответствующих и необязательных изображений с использованием обученной модели с предыдущего шага. Вы должны получить активацию из предпоследнего слоя. Для VGG16 это последний из двух плотных (4096), для InceptionV3 - дополнительный предпоследний слой Dense (1024), для resnet50 - дополнительный предпоследний слой Dense (2048).
  3. Решите двоичную проблему, используя хранимые данные активации. Я пробовал простую плоскую NN и логистическую регрессию. Оба были хорошими в точности (плоский NN был немного более точным), но я выбрал Logistic Regression, поскольку он проще, быстрее и потребляет меньше памяти и процессора/графического процессора.

Этот процесс следует повторять каждый раз после того, как ваша модель переквалифицирована, поскольку каждый раз, когда конечные веса для CNN различны и что было раньше, в следующий раз будут разными.

Итак, у нас есть еще одна небольшая модель для решения проблемы.