Deep learning 为什么模型的损失在每个时代总是围绕1旋转?

Deep learning 为什么模型的损失在每个时代总是围绕1旋转?,deep-learning,loss-function,tf.keras,Deep Learning,Loss Function,Tf.keras,在训练期间,我的模型的损失大约是1。它没有收敛。 我尝试了各种优化器,但它仍然显示相同的模式。我将keras与tensorflow后端一起使用。可能的原因是什么?任何帮助或参考链接都将非常有用 这是我的模型: def model_vgg19(): vgg_model = VGG19(weights="imagenet", include_top=False, input_shape=(128,128,3)) for layer in vgg_model.layers[:10]:

在训练期间,我的模型的损失大约是1。它没有收敛。 我尝试了各种优化器,但它仍然显示相同的模式。我将keras与tensorflow后端一起使用。可能的原因是什么?任何帮助或参考链接都将非常有用

这是我的模型:

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)

一个明显的问题是,你洗牌你的数据,然后试图从中学习三胞胎


正如您在这里看到的:model.fit在每个历元中洗牌您的数据,使您的三元组设置过时。尝试将shuffle参数设置为false,看看会发生什么,也可能有不同的错误。

要回答此问题,需要您提供更多信息。你的铰链损耗有哪些输入?你能提供一个最简单的例子吗?@Koanashi刚刚编辑了这个问题。仅供参考,我正在处理street2shop问题,输入的是三重图像、正图像和负图像。谢谢回复。将洗牌设置为false后,其工作。我得到了答案。我投了赞成票。最初它是收敛的,但在20到30个纪元之后,损失没有收敛,它的四舍五入在0.72到0.65之间,可能有什么原因。正如你所看到的,我正在使用动量达到最高值,即0.9,学习率适中。也许可以试试Adam优化器。如果无法访问数据,很难判断,但Adam往往会给出好的结果,不管你做什么,只是不是最好的结果。