Как тренировать и реализовывать уверенность в керасе - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь обучить CNN, который выведет (x, y) координаты для таких особенностей лица, как начало левого глаза, конец левого глаза, центр левого глаза, начало правого глаза, центр правого глаза и конец правого глаза. В соответствии со специализацией глубокого обучения курса Coursera мне нужно получить значения 0 и 1 (true или false) для каждой точки, а затем x и y для каждой координаты. Если значение равно 0 (False), мне нужно игнорировать вывод x и y во время тренировки.

Я пытался найти способ сделать это, но не смог найти. Наконец, я подумал о том, чтобы установить все отсутствующие (данные, для которых у нас нет особой функции) координаты x, y данных равными 0 и обучить следующую сеть.

def get_model():
    inputs = Input(shape=(96, 96, 1))

    # a layer instance is callable on a tensor, and returns a tensor
    x = Conv2D(16, kernel_size=5, padding='same', activation='relu')(inputs)
    x = Conv2D(32, kernel_size=5, padding='valid', activation='relu')(x)
    x = Dropout(0.25)(x)
    x = MaxPooling2D(pool_size=(2, 2))(x)
    x = BatchNormalization()(x)
    x = Conv2D(64, kernel_size=5, padding='valid', activation='relu')(x)
    x = Conv2D(128, kernel_size=5, padding='valid', activation='relu')(x)
    x = Dropout(0.25)(x)
    x = MaxPooling2D(pool_size=(2, 2))(x)
    x = BatchNormalization()(x)
    x = Conv2D(256, kernel_size=3, padding='valid', activation='relu')(x)
    x = Dropout(0.25)(x)
    x = MaxPooling2D(pool_size=(1, 1))(x)
    x = Flatten()(x)
    present = Dense(256)(x)
    present = PReLU()(present)
    present = Dense(15, activation="sigmoid", name="classification")(present)
    position = Dense(256)(x)
    position = PReLU()(position)
    position = BatchNormalization()(position)
    position = Dense(128)(position)
    position = PReLU()(position)
    position = BatchNormalization()(position)
    position = Dense(64)(position)
    position = PReLU()(position)
    position = Dense(30, activation="relu", name="position")(position)

    # This creates a model that includes
    # the Input layer and three Dense layers
    model = Model(inputs=inputs, outputs=[present, position])
    model.compile(optimizer='adam',
                loss={'classification':'binary_crossentropy','position':'mse'},
                metrics=['accuracy'])
    return model

Хотя точность классификации хорошая, точность позиционирования составляет менее 1 процента.

1 Ответ

0 голосов
/ 23 апреля 2019

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

def custom_loss(y_true, y_pred, conf_dim=-1, conf_thresh=0, px_weight=0.5, conf_weight=0.5):
   # compute sum of squared coordinate errors
   px_err = K.sum(K.square(y_pred[:, :conf_dim] - y_true[:, :conf_dim]), axis=-1)

   # compute squared confidence errors
   conf_err = K.square(y_pred[:, conf_dim] - y_true[:, conf_dim])

   # set loss of points whose confidences are below our threshold to zero
   px_err = px_err * tf.cast(y_true[:, conf_dim] > conf_thresh, y_true.dtype)

   # calculate mean over errors
   px_err, conf_err = K.mean(px_err), K.mean(conf_err)

   # return sum of weighted pixel and confidence errors
   return px_weight * px_err + conf_weight * conf_err


# compute a small example with numpy arrays
#                   -------
#                   x, y, c
#                   -------
y_true = np.array([[1, 2, 1],
                   [3, 4, 0],  # confidence zero
                   [5, 6, 1]])

y_pred = np.array([[1, 2, 1],  # correct
                   [1, 2, 1],  # wrong (not included in pixel loss because of confidence)
                   [2, 3, 1]]) # wrong

# run through loss function
print("Loss:", K.eval(custom_loss(K.variable(y_true), K.variable(y_pred)))) 
>>> Loss: 3.1666667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...