#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:
На мой взгляд, вы можете реализовать этот уровень, следуя инструкциям:
-
напишите пользовательский слой
ComputeCenter
, который-
принимает два входных сигнала: i). метки groudtruth
y_true
(не однократно закодированные, а просто целые числа) и ii). прогнозируемое членствоy_pred
-
содержит справочную таблицу
W
размераnum_classes x num_feats
массива в виде обучаемых весов (см. Уровень BatchNormalization), а W[j] является заполнителем для скользящего среднего для объекта j-го класса. -
вычисляет потерю центра, как указано в документе.
- выводит результирующий массив расстояний
D
-
-
Чтобы вычислить потерю центра, вам необходимо
- 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].
- i). обновить,
-
используйте
model.add_loss()
для вычисления этой потери. Обратите внимание, не добавляйте эту потерю вmodel.compile( loss = ... )
.
Наконец, вы можете добавить некоторый коэффициент потерь к потере центра, если это необходимо.
Комментарии:
1. Обратите внимание, что скорость изучения потери центра в документе теперь сводится к параметру momentum в скользящем среднем.