Я строю модель глубокого обучения для классификации и локализации объектов, используя подход "yolo" для Keras и тензорного потока. Мой вывод для одного входного изображения - матрица 52 * 52 * 10. Итак, когда я запускаю model.summary (), я получаю следующее выходное измерение:
...
...
leaky_103 (LeakyReLU) (None, 52, 52, 128) 0 bnorm_103[0][0]
__________________________________________________________________________________________________
conv_104 (Conv2D) (None, 52, 52, 256) 294912 leaky_103[0][0]
__________________________________________________________________________________________________
bnorm_104 (BatchNormalization) (None, 52, 52, 256) 1024 conv_104[0][0]
__________________________________________________________________________________________________
leaky_104 (LeakyReLU) (None, 52, 52, 256) 0 bnorm_104[0][0]
__________________________________________________________________________________________________
conv_105 (Conv2D) (None, 52, 52, 10) 2570 leaky_104[0][0]
__________________________________________________________________________________________________
activation_2 (Activation) (None, 52, 52, 10) 0 conv_105[0][0]
==================================================================================================
Total params: 55,642,218
Trainable params: 55,592,682
Non-trainable params: 49,536
______________________________________________________________
, т. Е. Выходное значение [Нет, 52, 52, 10]
Итак, поскольку я должен создать собственную функцию потерь для своего вывода (как я должен применить перекрестную энтропию к срезу [:,:,0:2]
и еще одну потерю к срезу [:,:,2:6]
). Ниже приведена выдержка из функции потерь
epsilon = 0.000001
def loss(y_true, y_pred):
loss1 = K.mean(K.sum(K.categorical_crossentropy(y_true[:,:,:,0:2], y_pred[:,:,:,0:2]),
axis = (1,2,3)),
axis = 0)
loss2 = K.mean(K.sum(-K.log(K.abs(tf.math.subtract(y_true[:,:,:,2:6],
y_pred[:,:,:,2:6]))
+ epsilon),
axis = (1,2, 3)),
axis = 0)
return loss1+loss2
, но при запуске model.compile()
я получаю следующую ошибку:
ValueError: Неверный размер сокращения 3 для ввода с 3 Габаритные размеры. для 'loss_6 / активации_2_loss / Sum_2' (op: 'Sum') с формами ввода: [?, 52,52], [3] и с вычисленными тензорами ввода: input [1] = <1 2 3>.
Я интерпретировал, что в действительности, при вызове функции потерь, потеря рассчитывается по частям по частям вдоль последнего измерения и уменьшаются размеры оси в функции потерь, «модифицированная функция потерь» равна:
epsilon = 0.000001
def loss(y_true, y_pred):
loss1 = K.mean(K.sum(K.categorical_crossentropy(y_true[:,:,:,0:2], y_pred[:,:,:,0:2]),
axis = (1,2)),
axis = 0)
loss2 = K.mean(K.sum(-K.log(K.abs(tf.math.subtract(y_true[:,:,:,2:6],y_pred[:,:,:,2:6])) + epsilon), axis = (1,2)), axis = 0)
return loss1+loss2
, после этого модель успешно скомпилирована. Кто-нибудь может сказать мне погоду, я прав или не прав насчет моей гипотезы.