当输入时我只有两个文件(即在测试时)时如何处理三元组丢失
Posted
技术标签:
【中文标题】当输入时我只有两个文件(即在测试时)时如何处理三元组丢失【英文标题】:How to deal with triplet loss when at time of input i have only two files i.e. at time of testing 【发布时间】:2019-11-05 01:59:09 【问题描述】:我正在实现一个连体网络,在该网络中我知道如何通过将输入分成三部分(这是一个手工制作的特征向量)然后在训练时计算它来选择锚点、正数和负数来计算三元组损失。
anchor_output = ... # shape [None, 128]
positive_output = ... # shape [None, 128]
negative_output = ... # shape [None, 128]
d_pos = tf.reduce_sum(tf.square(anchor_output - positive_output), 1)
d_neg = tf.reduce_sum(tf.square(anchor_output - negative_output), 1)
loss = tf.maximum(0., margin + d_pos - d_neg)
loss = tf.reduce_mean(loss)
但问题是,在测试时,我只有两个正面和负面的文件,然后我将如何处理(三胞胎,因为我需要一个更多的锚文件,但我的应用程序只拍一张照片并与数据库中的比较所以在这种情况下只有两个文件),我搜索了很多,但没有人提供处理这个问题的代码,只有实现三元组丢失的代码,但不是整个场景。 而且我不想使用对比损失
【问题讨论】:
【参考方案1】:带有 CIFAR 10 测试代码的 Colab 笔记本: https://colab.research.google.com/drive/1VgOTzr_VZNHkXh2z9IiTAcEgg5qr19y0
总体思路:
from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K
img_width = 128
img_height = 128
img_colors = 3
margin = 1.0
VECTOR_SIZE = 32
def triplet_loss(y_true, y_pred):
""" y_true is a dummy value that should be ignored
Uses the inverse of the cosine similarity as a loss.
"""
anchor_vec = y_pred[:, :VECTOR_SIZE]
positive_vec = y_pred[:, VECTOR_SIZE:2*VECTOR_SIZE]
negative_vec = y_pred[:, 2*VECTOR_SIZE:]
d1 = keras.losses.cosine_proximity(anchor_vec, positive_vec)
d2 = keras.losses.cosine_proximity(anchor_vec, negative_vec)
return K.clip(d2 - d1 + margin, 0, None)
def make_image_model():
""" Build a convolutional model that generates a vector
"""
inp = Input(shape=(img_width, img_height, img_colors))
l1 = Conv2D(8, (2, 2))(inp)
l1 = MaxPooling2D()(l1)
l2 = Conv2D(16, (2, 2))(l1)
l2 = MaxPooling2D()(l2)
l3 = Conv2D(16, (2, 2))(l2)
l3 = MaxPooling2D()(l3)
conv_out = Flatten()(l3)
out = Dense(VECTOR_SIZE)(conv_out)
model = Model(inp, out)
return model
def make_siamese_model(img_model):
""" Siamese model input are 3 images base, positive, negative
output is a dummy variable that is ignored for the purposes of loss
calculation.
"""
anchor = Input(shape=(img_width, img_height, img_colors))
positive = Input(shape=(img_width, img_height, img_colors))
negative = Input(shape=(img_width, img_height, img_colors))
anchor_vec = img_model(anchor)
positive_vec = img_model(positive)
negative_vec = img_model(negative)
vecs = Concatenate(axis=1)([anchor_vec, positive_vec, negative_vec])
model = Model([anchor, positive, negative], vecs)
model.compile('adam', triplet_loss)
return model
img_model = make_image_model()
train_model = make_siamese_model(img_model)
img_model.summary()
train_model.summary()
###
train_model.fit(X, dummy_y, ...)
img_model.save('image_model.h5')
###
# In order to use the model
vec_base = img_model.predict(base_image)
vec_test = img_model.predict(test_image)
比较vec_base
和vec_test
的余弦相似度以确定碱基和测试是否在可接受的标准内。
【讨论】:
以上是关于当输入时我只有两个文件(即在测试时)时如何处理三元组丢失的主要内容,如果未能解决你的问题,请参考以下文章
当我推送到 GitHub 时如何处理秘密 API 密钥,以便在克隆存储库时我的项目仍然有效?
协同过滤程序:当没有足够的数据时如何处理 Pearson 分数