我想使用一个三元组类,尽可能与std :: pair类似.STL似乎没有.我不想使用太重的东西,比如Boost.是否有一些有用的FOSS非限制性许可三联类可以从某个地方解除?我应该自己动手吗?我应该完全做些什么吗?
编辑:关于std::tuple......
特定于三胞胎的课程真的没有益处吗?我的意思是,有了元组,我做不到
template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
Run Code Online (Sandbox Code Playgroud)
我可以吗?我不是必须键入dede个人类型组合三元组吗?
这个问题的更容易或更流行的版本是找到具有给定总和的三元组.但是这个提出了额外的条件.找到未排序数组中的所有三元组
d[i]+d[j]+d[k] <= t; & d[i]<d[j]<d[k] where i<j<k
Run Code Online (Sandbox Code Playgroud)
这是问题第一部分的解决方案.但有人可以建议我们如何扩展它以包括第二个条件.我能想到的唯一方法是在排序时执行自定义数据结构以存储原始元素索引以及数字.然后检查索引是否符合所包含链接中提到的算法返回的每个三元组的顺序.
我认为Eigen使用压缩方法来存储稀疏矩阵.有没有什么方法可以从std :: vectors中提取特征稀疏矩阵的Triplet格式向量?
谢谢.
更多信息(三元组格式的示例)矩阵的三元组格式:
A=
3 0 4 0
0 0 1 0
0 2 0 5
4 0 0 0
i = 1 1 2 3 3 4 // row
j = 1 3 3 2 4 1 // column
S = 3 4 1 2 5 4 // values
Run Code Online (Sandbox Code Playgroud) Triplet网络(受“Siamese 网络”启发)由同一前馈网络的 3 个实例(具有共享参数)组成。当输入 3 个样本时,网络输出 2 个中间值 - 其中两个输入的嵌入表示与第三个输入的表示之间的 L2(欧几里德)距离。
我使用三对图像来馈送网络(x = 锚图像,标准图像,x+ = 正图像,包含与 x 相同对象的图像 - 实际上,x+ 与 x 属于同一类,x- = 负图像image,与 x 具有不同类别的图像。
我正在使用此处描述的三元组损失成本函数。
如何确定网络的准确性?
我训练了一个使用三重态损失的连体神经网络。这很痛苦,但我想我做到了。然而,我很难理解如何用这个模型进行评估。
国家神经网络:
def triplet_loss(y_true, y_pred):
margin = K.constant(1)
return K.mean(K.maximum(K.constant(0), K.square(y_pred[:,0]) - 0.5*(K.square(y_pred[:,1])+K.square(y_pred[:,2])) + margin))
def euclidean_distance(vects):
x, y = vects
return K.sqrt(K.maximum(K.sum(K.square(x - y), axis=1, keepdims=True), K.epsilon()))
Run Code Online (Sandbox Code Playgroud)
anchor_input = Input((max_len, ), name='anchor_input')
positive_input = Input((max_len, ), name='positive_input')
negative_input = Input((max_len, ), name='negative_input')
Shared_DNN = create_base_network(embedding_dim = EMBEDDING_DIM, max_len=MAX_LEN, embed_matrix=embed_matrix)
encoded_anchor = Shared_DNN(anchor_input)
encoded_positive = Shared_DNN(positive_input)
encoded_negative = Shared_DNN(negative_input)
positive_dist = Lambda(euclidean_distance, name='pos_dist')([encoded_anchor, encoded_positive])
negative_dist = Lambda(euclidean_distance, name='neg_dist')([encoded_anchor, encoded_negative])
tertiary_dist = Lambda(euclidean_distance, name='ter_dist')([encoded_positive, encoded_negative])
stacked_dists = Lambda(lambda vects: K.stack(vects, axis=1), …Run Code Online (Sandbox Code Playgroud) 如https://arxiv.org/pdf/1703.07737.pdf中所建议的那样,我尝试重构我的Keras代码以对三胞胎使用“批处理硬”采样。
“核心思想是通过对P个类别(人的身份)进行随机抽样,然后对每个类别(人)的K个图像进行随机抽样,从而形成一批PK图像。现在,对于批次中的每个样本a,我们在形成三元组以计算损失时,可以在批次中选择最硬的正样本和最硬的负样本,我们将其称为“硬批次”
因此,目前我有一个Python生成器(与Keras中的model.fit_generator配合使用),可以在CPU上生成批处理。然后,可以在GPU上完成通过模型的实际前向和后向传递。
但是,如何使这种方法适合“硬分批”方法?生成器对64个图像进行采样,为此应形成64个三元组。首先,需要向前通过以获取当前模型的64个嵌入。
embedding_model = Model(inputs = input_image, outputs = embedding)
Run Code Online (Sandbox Code Playgroud)
但是随后必须从64个嵌入中选择最难的正数和最难的负数以形成三元组。然后可以计算出损失
anchor = Input(input_shape, name='anchor')
positive = Input(input_shape, name='positive')
negative = Input(input_shape, name='negative')
f_anchor = embedding_model(anchor)
f_pos = embedding_model(pos)
f_neg = embedding_model(neg)
triplet_model = Model(inputs = [anchor, positive, negative], outputs=[f_anchor, f_pos, f_neg])
Run Code Online (Sandbox Code Playgroud)
并且可以通过定义三元组损失函数来训练此Triplet_model。但是,Keras是否可以使用fit_generator和'Batch Hard'方法?还是如何从批处理中的其他样本获取对嵌入的访问?
编辑:使用keras.layers.Lambda,我可以定义一个自己的层,以输入(batch_size,height,width,3)和输出(batch_size,3,height,width,3)创建三元组,但是我还需要访问id的某个位置。这在图层内可能吗?
使用 gcc 时,我可以通过运行获得 gcc 认为是我主机的三元组gcc -dumpmachine。在我当前的系统上,这给了我x86_64-linux-gnu.
我怎样才能稳定rustc打印我的主机三重?(x86_64-unknown-linux-gnu在这种情况下)
rustc的文档似乎不包含除了--print和之外的任何相关内容--version。两者似乎都没有产生主机目标三元组。
澄清:到目前为止,每晚给出了两个答案,我想强调这个问题专门针对稳定的 rustc编译器。