问题标签 [triplet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
26 浏览

c++ - 除了while循环之外,是否有预定义的方法来搜索cpp中向量三元组中的元素?

我在第一列从用户那里获取输入,并且需要根据我“找到元素”用户在没有循环的情况下要求从第 1 列或第 2 列返回值。

0 投票
0 回答
19 浏览

pytorch - 我想使用三元组保证金损失,但我不知道如何获得理想的结果

我是计算机视觉和神经网络的初学者。我尝试使用三元组保证金损失。我想要得到的模型的输出是数字表示类的概率,即 [0.9, 0.1, 0, 0, 0] -> 每个值表示每个类的概率但我没有得到这样的输出。也许损失函数不接受答案标签([1,0,0,0,0])有没有办法得到我想要的结果?

0 投票
2 回答
98 浏览

python - 如何在字符串中找到所有可能的连续三元组?

我的问题是,如果你有一串 DNA,你怎么能列出所有可能的连续三胞胎?例如,如果您有以下字符串:

ACCTAA

我需要创建所有可能的连续三元组的列表,例如:

ACC、CCT、CTA、TAA

我怎么能做到这一点?

到目前为止,我只知道如何通过将字符串等间隔划分来创建三元组列表:

dna输入字符串在哪里。

感谢您的任何建议!

0 投票
0 回答
51 浏览

tensorflow - 如何改进低精度但高召回率的相似性学习神经网络?

我目前正在使用三元组损失训练相似性学习神经网络。我采用了半硬负挖掘来训练网络来学习特征。训练后的模型具有较高的准确率(或召回率 = 88%),但平均准确率较低。

规格:

  • 三元组损失中使用的保证金=1.6。
  • 嵌入使用 L2 范数进行归一化
  • 具有最小平方距离的图像对被识别为匹配
  • 分数被否定并按降序排序(最小的距离代表更高的置信度)
  • PR(precision-recall)曲线是在分数按置信度降序排序后为每个预测绘制的曲线(首先绘制高置信度分数,然后是低置信度)

置信度(或分数)= - (两个图像对嵌入之间的平方距离)

问题:

  • PR 曲线呈下降趋势,直到召回率 = 0.05 最高置信度得分非常糟糕
  • 这在召回 0.05 后会有所改善

问题:如何调查并尝试提高最高置信度分数的精度。任何想法,指针? 精确召回曲线

我试过的:

  • 测试错误;代码看起来不错,准确率(高召回率)准确
  • 验证准确性测试(随机可视化的三元组对)
  • 降低了 ALPHA =0.2(默认为triplet loss paper),但它产生低召回率(准确度)和较低的平均精度
0 投票
1 回答
49 浏览

python - Triplet loss 不能作为文本嵌入中的理论来学习

我正在研究基于三元组损失的文本嵌入模型。
简短描述:
我有一个关于网上商店的数据库,当用户在搜索栏输入文字时,我需要找到合适的产品。我想要一个模型比匹配字符串更好,并且可以理解用户的想法。我定义了一个这样的三元组网络:我的输入是(查询文本 [anchor],搜索后的下一个产品用户视图 [positive],随机产品 [negative])。我建立了一个基于bi-LSTM的编码器模型,并尝试训练anchor和positive之间的距离最小,anchor和negative之间的距离最大,并使用triplet loss。
我试图实现这个网络在这里输入图像描述
参考:https
: //arxiv.org/pdf/2104.08558.pdf 我的encoderNet

我使用了pytorch框架的损失函数triplet_loss = nn.TripletMarginLoss(margin=1.0, p=2)。
结果,我看到在训练数据集中,损失值下降到如此之小和如此之快,但在有效数据集中,损失值没有任何意义,它像随机一样上下波动。
我用 8572 个词汇训练模型,81822 个训练样本,是不是数据集太小了?
你能帮我吗?我的解决方案有什么问题?

0 投票
0 回答
19 浏览

tensorflow2.0 - 用于大量类的 TensorFlow 三元组数据集 TFRecord

我正在尝试为对比损失/三元组损失创建一个具有对(正/负)的数据集。

我有大量 10K+ 的类,我为每个类创建了一个 TFrecord,所以我现在有 10K+ TFRecord。到目前为止,似乎我需要将interleave函数与 TFRecord 一起使用block_length=2,以便在同一批次中从同一类中获取至少两个元素。https://www.tensorflow.org/api_docs/python/tf/data/Dataset#interleave

这是它的代码:

但是,我认为我的代码并没有达到我所看到的所有 TFrecord 文件。事实上,我从来没有得到所有可能的课程(10k+)。如果我遍历数据集一次,我大约有 2K 类到达。我的方法有问题吗?

0 投票
1 回答
20 浏览

tensorflow - 在训练三元组损失时我应该如何设置基本事实?

我正在使用 keras 制作一个用于测量深度学习网络的图像相似度模型,

即使我看到验证成本<=1e-5,也一直看不到好的结果。

我使用的tripletloss层是:

我的培训正在使用以下代码完成。

完成训练后,我加载了这样的模型:

我使用了 HPatches 数据集https://github.com/hpatches/hpatches-dataset

我将ground truth设置为0,所以我认为triplet loss的输出应该是0。

并且训练结果说三元组损失小于1e-5。

我猜不出我在哪里做错了,但测试结果让我无法匹配正确的图像补丁。

损失设置有什么问题吗?

0 投票
0 回答
56 浏览

pytorch - 有人可以解释一下 FaceNet 论文的背后是什么吗?(one-shot learning、siamese network 和triplet loss)

自从我的 One-Shot 学习项目大约 3 周以来,我一直在苦苦挣扎。我正试图用我的脸解锁我的电脑。不幸的是,我离这个任务还很远。首先,我想很好地理解 one-shot learning 背后的概念,尤其是三元组损失。所以知道我尝试用转移学习训练一个网络(在 PyTorch 中),这将引导我实现我的目标。

到目前为止我所理解的:

一键学习

  • 这是一种方法,模型应该能够最小化同一个人的两张脸的两个嵌入之间的欧几里德距离,相反,最大化不同人的两张脸之间的欧几里德距离。换句话说,模型应该将任何一张脸放在一个d维欧几里得空间中,相同的人彼此靠近,不同的人彼此远离。
  • 这个模型不应该特别用已知的身份进行训练。换句话说,一旦训练有素,任何人都可以使用它来比较他/她的一张固定的、未更改的面部照片和他/她的另一张脸。
  • 人脸验证是最大化不属于(比方说)授权人的任何人脸之间的距离并最小化属于授权人的人脸之间的距离的能力(1:1 问题)。
  • 人脸识别是最大化任何不属于(比方说)授权人脸之间的距离并最小化属于一组授权人的人脸之间的距离的能力(1:K 问题)。

三元组挖掘

  • 为确保模型能够学习信息,需要为其提供定义明确且不明显的三元组。对于面部数据集,这会导致:

  • 三元组,例如 [for all (i,j,k) distincts] : face[i] == face[j]; 和面[i]!=面[k];和面[j]!=面[k]

  • 这些三元组称为“有效三元组”,面被定义为正面负面

  • 诸如欧几里得空间中的面之类的三元组彼此之间的距离并不远(防止崩溃到零的琐碎损失)。它们被定义为半硬硬三元组

根据这些基线,我在互联网上寻找示例。我了解到,生产三胞胎的常用方式是在线挖矿离线挖矿。我使用https://omoindrot.github.io/triplet-loss的绝妙代码实现了在线挖矿的批量硬策略批量所有策略

我的问题:

从这一点开始,我有点迷路了。我尝试了不同的方法来构建我的数据集,但我的损失永远不会收敛。该模型似乎没有学到任何东西。

我的方法描述(通过 PyTorch)

模型和数据集

InceptionResnetV1pytorch_facenet图书馆使用,用 Casia-Webfaces 预训练。我解冻了最后两层:线性层model.last_linear(1792, 512)model.last_bn()它引导我得到 918,528 个可训练参数和一个 dim (512,1) 的输出嵌入。

对于数据集,我使用的是HeadPoseImageDatabase,它是一个包含 15 个人的数据集,每个人:2 张正面图片和 186 张不同的头部姿势图片。这导致了一组 2797 张图片(一个人有 193 张图片)和 30 张正面图片。

我的工作

我知道模型应该看到各种身份。所以首先,我尝试了 nn.TripletMarginLossPyTorch 并提供了一个锚点(每个身份的两个正面图片之一);正面(与主播身份相关的183张图片之一);和否定的(具有不同身份的随机其他面孔)。
这是不成功的:损失似乎减少了,但模型并没有在测试集上泛化。

我想也许我没有为损失提供足够的半硬或硬三元组,所以我构建了与每个​​身份“ i ”相关的 15 个数据集:每个数据集包含身份“i”的正面面孔其他负面面孔。因此,每个数据集包含 2797 张图像并返回带有标签的图像(如果人脸的身份对应于数据集I ,则为 1,否则为 0)。我在每个身份数据集上做了一个循环(每个数据集中都有一个批处理循环)。这次我使用了批处理( https://omoindrot.github.io/triplet-loss),但还是失败了。

问题

  • 我是否需要创建一个更简单的模型并从头开始训练它?
  • 我的方法看起来是否正确:Anchor 是否应该通过与 Positive 和 Negative 相同的模型?
  • 我应该如何设置边距?
  • 关于人脸验证我上面的说法是否正确?我希望在没有我的照片的情况下训练我的模型,然后能够最小化/最大化任何嵌入面之间的欧几里德距离。这是对的吗 ?
  • 作为一个小项目(即大约 95%),这项工作是否可行且具有不错的准确性?

谢谢大家的时间,我希望我的解释很清楚。下面我给你一段代码。