Потеря центра в Keras

#keras

#keras

Вопрос:

Я хочу реализовать потерю центра, описанную в [http://ydwen.github.io/papers/WenECCV16.pdf ] в Keras

Я начал создавать сеть с двумя выходами, такими как :

 inputs = Input(shape=(100,100,3))
...
fc = Dense(100)(#previousLayer#)
softmax = Softmax(fc)
model = Model(input, output=[softmax, fc])
model.compile(optimizer='sgd', 
              loss=['categorical_crossentropy', 'center_loss'],
              metrics=['accuracy'], loss_weights=[1., 0.2])
  

Прежде всего, поступая подобным образом, это хороший способ продолжить?

Во-вторых, я не знаю, как реализовать center_loss в keras. Center_loss выглядит как среднеквадратичная ошибка, но вместо сравнения значений с фиксированными метками он сравнивает значения с данными, обновляемыми на каждой итерации.

Спасибо за вашу помощь

Комментарии:

1. Я не уверен насчет этой конкретной реализации, но для начала неплохо бы посмотреть, сможете ли вы черпать вдохновение, просмотрев исходный код для различных функций потери в keras github.com/fchollet/keras/blob/master/keras/objectives.py

2. И в документе предлагается обновлять центр после каждой итерации, поэтому вам, вероятно, потребуется написать свой собственный оптимизатор SGD. Опять же, вы можете найти вдохновение в исходном коде github.com/fchollet/keras/blob/master/keras/optimizers.py

Ответ №1:

На мой взгляд, вы можете реализовать этот уровень, следуя инструкциям:

  1. напишите пользовательский слой ComputeCenter , который

    • принимает два входных сигнала: i). метки groudtruth y_true (не однократно закодированные, а просто целые числа) и ii). прогнозируемое членство y_pred

    • содержит справочную таблицу W размера num_classes x num_feats массива в виде обучаемых весов (см. Уровень BatchNormalization), а W[j] является заполнителем для скользящего среднего для объекта j-го класса.

    • вычисляет потерю центра, как указано в документе.

    • выводит результирующий массив расстояний D
  2. Чтобы вычислить потерю центра, вам необходимо

    • i). обновить, W[j] используя y_pred[k] в соответствии с y_true[k]=j ,
    • ii). извлеките центральный элемент c_true[k]=W[j] для образца y_pred[k] , который y_true[k]=j
    • iii) вычислите расстояние между y_pred и c_true .
    • Здесь c_true[k] = W[j] , и k это индекс выборки, а j это метка истинности y_pred[k].
  3. используйте model.add_loss() для вычисления этой потери. Обратите внимание, не добавляйте эту потерю в model.compile( loss = ... ) .

Наконец, вы можете добавить некоторый коэффициент потерь к потере центра, если это необходимо.

Комментарии:

1. Обратите внимание, что скорость изучения потери центра в документе теперь сводится к параметру momentum в скользящем среднем.