gpt4 book ai didi

python - Keras 2 上具有自定义(无)损失的三元组嵌入层

转载 作者:行者123 更新时间:2023-12-01 01:58:26 25 4
gpt4 key购买 nike

我一直在寻找深度学习中三元组嵌入的简单实现。我想使用 Keras,因为它是我稍微熟悉的(尽管仍然非常缺乏经验)。

以下是其中一篇灵感作品的引用:paper on embedded triplets

我找到了一个很好的例子来开始使用 mnist 数据集,据我所知它运行得很好。 3个嵌入层合并的实现出现问题。

def build_model(input_shape):

base_input = Input(input_shape)
x = Conv2D(32, (3, 3), activation='relu')(base_input)
x = MaxPooling2D((2, 2))(x)
x = Conv2D(64, (3, 3), activation='relu')(x)
x = MaxPooling2D((2, 2))(x)
x = Dropout(0.25)(x)
x = Flatten()(x)
x = Dense(2, activation='linear')(x)
embedding_model = Model(base_input, x, name='embedding')

anchor_input = Input(input_shape, name='anchor_input')
positive_input = Input(input_shape, name='positive_input')
negative_input = Input(input_shape, name='negative_input')

anchor_embedding = embedding_model(anchor_input)
positive_embedding = embedding_model(positive_input)
negative_embedding = embedding_model(negative_input)

inputs = [anchor_input, positive_input, negative_input]
outputs = [anchor_embedding, positive_embedding, negative_embedding]
triplet_model = Model(inputs, outputs)
triplet_model.add_loss(K.mean(triplet_loss(outputs)))
triplet_model.compile(loss=None, optimizer='adam') # <-- CRITICAL LINE

return embedding_model, triplet_model

在当前的实现中,损失是通过 model.add_loss 添加的,我还没有找到很多这样的例子。 真正的问题是我无法加载保存的模型。线条

triplet_model.save('triplet.h5')
model = load_model('triplet.h5')

返回:

ValueError: The model cannot be compiled because it has no loss to optimize.

当我尝试编译模型时,向“loss”参数添加参数会引发另一个错误。 我想问如何规避这个问题,或者是否有更好的方法来使用嵌入式模型创建模型(也许没有空损失函数)。

以下是 Triplet_loss 函数供引用:

def triplet_loss(inputs, dist='sqeuclidean', margin='maxplus'):
anchor, positive, negative = inputs
positive_distance = K.square(anchor - positive)
negative_distance = K.square(anchor - negative)
if dist == 'euclidean':
positive_distance = K.sqrt(K.sum(positive_distance, axis=-1, keepdims=True))
negative_distance = K.sqrt(K.sum(negative_distance, axis=-1, keepdims=True))
elif dist == 'sqeuclidean':
positive_distance = K.mean(positive_distance, axis=-1, keepdims=True)
negative_distance = K.mean(negative_distance, axis=-1, keepdims=True)
loss = positive_distance - negative_distance
if margin == 'maxplus':
loss = K.maximum(0.0, 1 + loss)
elif margin == 'softplus':
loss = K.log(1 + K.exp(loss))
return K.mean(loss)

这是完整的脚本:link

最佳答案

这里的问题是你留下了triplet_model.compile(loss=None),但是keras不知道如何在load_model( )。我知道您必须这样做,但您可以以不同的方式加载模型来解决当前的问题。

简而言之,不要通过 load_model() 加载整个模型,而只需通过 load_weights() 加载权重。

例如,您可以这样做

# save only weights
triplet_model.save_weights('tmp.h5')
# load saved weights
new_embedding_model, new_triplet_model = build_model(input_shape)
new_triplet_model.load_weights('tmp.h5') # load only weights

关于python - Keras 2 上具有自定义(无)损失的三元组嵌入层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49929070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com