Почему потеря модели всегда вращается вокруг 1 в каждую эпоху? - PullRequest
0 голосов
/ 24 сентября 2019

Во время тренировок потеря моей модели вращается вокруг «1».Это не сходится.Я пробовал различные оптимизаторы, но они все еще показывают ту же картину.Я использую кераты с тензорным бэкэндом.Какие могут быть возможные причины?Любая помощь или ссылка будет заметна.

enter image description here вот моя модель:

def model_vgg19():
  vgg_model = VGG19(weights="imagenet", include_top=False, input_shape=(128,128,3))

  for layer in vgg_model.layers[:10]:
    layer.trainable = False

  intermediate_layer_outputs = get_layers_output_by_name(vgg_model, ["block1_pool", "block2_pool", "block3_pool", "block4_pool"])
  convnet_output = GlobalAveragePooling2D()(vgg_model.output)
  for layer_name, output in intermediate_layer_outputs.items():
    output = GlobalAveragePooling2D()(output)
    convnet_output = concatenate([convnet_output, output])

  convnet_output = Dense(2048, activation='relu')(convnet_output)
  convnet_output = Dropout(0.6)(convnet_output)
  convnet_output = Dense(2048, activation='relu')(convnet_output)
  convnet_output = Lambda(lambda  x: K.l2_normalize(x,axis=1)(convnet_output)

  final_model = Model(inputs=[vgg_model.input], outputs=convnet_output)

  return final_model


model=model_vgg19()

вот моя функция потерь:

def hinge_loss(y_true, y_pred):
    y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON)
    loss = tf.convert_to_tensor(0,dtype=tf.float32)
    g = tf.constant(1.0, shape=[1], dtype=tf.float32)

    for i in range(0, batch_size, 3):
        try:
            q_embedding = y_pred[i+0]
            p_embedding = y_pred[i+1]
            n_embedding = y_pred[i+2]
            D_q_p =  K.sqrt(K.sum((q_embedding - p_embedding)**2))
            D_q_n = K.sqrt(K.sum((q_embedding - n_embedding)**2))
            loss = (loss + g + D_q_p - D_q_n)            
        except:
            continue
    loss = loss/(batch_size/3)
    zero = tf.constant(0.0, shape=[1], dtype=tf.float32)
    return tf.maximum(loss,zero)

1 Ответ

1 голос
/ 24 сентября 2019

Что действительно является проблемой, так это то, что вы перетасовываете свои данные, а затем пытаетесь извлечь из них триплеты.

Как вы можете видеть здесь: https://keras.io/models/model/ model.fit перемешивает ваши данные в каждую эпоху, делая вашу триплетную установку устаревшей.Попробуйте установить для параметра shuffle значение false и посмотрите, что произойдет, могут быть и другие ошибки.

...