Создайте пользовательскую функцию потерь для среднего пересечения объединения для регрессии в ограничивающих прямоугольниках - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь перебрать пакет по одному, чтобы вычислить среднее пересечение по объединению.но функция fit показывает это

Ошибка : операция имеет None для градиента.Пожалуйста, убедитесь, что все ваши операции имеют определенный градиент (то есть являются дифференцируемыми).Обычные операции без градиента: K.argmax, K.round, K.eval.

Помогите, поскольку я новичок в keras

#y_true shape: (None, 4)
import keras.backend as K
def iou(y_true, y_pred):
    # determine the (x, y)-coordinates of the intersection rectangle
    iou = 0
    for i in range(K.int_shape(y_pred)[0]):
        boxA = y_pred[i]
        boxB = y_true[i]
        xA = K.max(boxA[0], boxB[0])
        yA = K.max(boxA[2], boxB[2])
        xB = K.min(boxA[1], boxB[1])
        yB = K.min(boxA[3], boxB[3])

        interArea = K.max(0, xB - xA + 1) * K.max(0, yB - yA + 1)

        boxAArea = (boxA[1] - boxA[0] + 1) * (boxA[3] - boxA[2] + 1)
        boxBArea = (boxB[1] - boxB[0] + 1) * (boxB[3] - boxB[2] + 1)

        iou += interArea / float(boxAArea + boxBArea - interArea)
    #MEAN
    mean = iou/K.int_shape(y_pred)[0]
    return 1-mean

model.compile(optimizer='adam', loss=iou, metrics=['accuracy'])
model.fit(x_train, y_train, epochs=20, batch_size = 50)

моя модель работает нормально со среднеквадратичной ошибкойкак функция потерь.Модель:

input_shape = (180, 240, 3)
model = Sequential([
    Conv2D(32, (3, 3), input_shape=input_shape, padding='same',activation='relu'),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    BatchNormalization(),

    Conv2D(64, (3, 3), activation='relu', padding='same'),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    BatchNormalization(),

    Conv2D(128, (3, 3), activation='relu', padding='same',),

    Conv2D(256, (3, 3), activation='relu', padding='same',),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),

    Conv2D(128, (3, 3), activation='relu', padding='same',),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    BatchNormalization(),
    Flatten(),
    Dense(4096, activation='relu'),
    Dense(4096, activation='relu'),
    Dense(4, activation='relu')
])

1 Ответ

0 голосов
/ 25 февраля 2019

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

С учетом предоставленного фрагмента кода можетВот несколько возможных предложений, чтобы заставить его работать:

  • цикл for должен быть векторизован
  • , так как вы используете max (0, ...) для получения области пересечения,может случиться так, что это константа 0 и градиент недоступен, поэтому проверьте, не застрял ли он там
  • для расчета среднего значения есть готовая к использованию бэкэнд-функция Keras K.mean
  • Рекомендуется ограничивать значения для улучшения оптимизации (например, до диапазона (0,1))

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...