欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

MatConvnet中集成的损失函数(孪生网络的思考)

发布时间:2025/3/15 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MatConvnet中集成的损失函数(孪生网络的思考) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

参看网址:https://www.baidu.com/?tn=94855285_hao_pg

这篇博客主要记载了利用MatCovnet实现孪生网络的一些问题,最核心的就是两个分支如何并到一起?反向传播如何设计?相比Keras、caffe、TensorFlow;matconvnet推动的人太少了,整个社区也非常冷清,不得不说这是matlab公司的眼观不够啊..

1. 问题#253的解决方案

Hi,Is it possible to implement a Siamese network using current dag branch of matconvnet? Is so could you please share some sample codes (if available) on it.Thanks, kris314Kris最早提出大家的疑惑,利用现有的无向图结构能不能实现孪生网络? Hi, you can implement siamese networks (we did) with simplenn as well. The trick is to pass pairs of images as consecutive entries in the sequence and then use a block such as vl_nnpdist that would pair them up in the loss. VedaldiVedaldi回复了这个事,他建议采用的方法是连续输入一对图像,然后这对图像先后通过base network, 最后一起到达损失函数哪里。注意的是,Vedaldi用的是vl_nnpdist()函数实现的,一会会说这个事。 Hi, almost. Simply pass paired images as consecutive indexes in the batch (e.g. images 1 and 2 in the batch are paired, then 3 and 4 and so on). Then the distance layer can take the difference between images 1 and 2 , 3 and 4 etc). Note that the output of this layer has a batch size exactly half than its input as for each pair of images you get one difference image (and then one distance value). You do get the same effect as a siamese architecture.VedaldiVedaldi的意思就是说,现在啊我们还不能利用两个孪生的分支并行处理一对图像。不过呢,我们可以把 一对图像按照先后顺序放一块, 比如说1&2 是一对; 3&4 是一对。那么输出的批大小就应该等于输入的 一半。此外按照Vedaldi所说,我们可以利用距离层对两张连续的图像进行区分,这这这...想好想,怎么 实现嘞?加一个时钟??还是计数器?

其实,后来一大堆人追问过这个问题,不幸的是Vedaldi消失了。我也曾经纠结过这种方法,其实他很想2-channel的实现方法,首先进行灰度化,然后将一对灰度图像当成双通道来处理,这就变成了最普通的单通道网络。

2. vl_nnpdist - CNN特征矢量距离计算函数

这个函数恰好就是为了计算两个特征矢量距离的。其函数表达式为:

VL_NNPDIST(X, X0, P); % X,X0是对应的两个特征矢量; P代表距离范数 Y(i,j,1) = (SUM_d (X(i,j,d) - X0(i,j,d))^P)^(1/P)

X0和X维度一致;输出Y和X具有相同的宽度和高度,但是深度等于1. 一般来说X0是1x1xDxN矩阵

如果设置 noroot = true, 那么该距离就不进行根除了:

Y(i,j,1) = SUM_d (X(i,j,d) - X0(i,j,d))^P、 例如: vl_nnpdist(x, x0, 2, 'noRoot', true); % 计算对应通道的2-范数距离

其实吧 上面的都不重要,重要的在这里:

[DZDX, DZDX0] = VL_NNPDISTP(X, X0, P, DZDY) computes the derivative of the block inputs projected onto DZDY. DZDX, DZDX0 and DZDY have the same dimensions as X and Y, respectively.

正向传播过程中,在这个模块中我们可以计算两个特征的距离测度; 反向传播过程中,我们还可以把误差分别传递给两个网络分支,这个才是核心。

还需要注意一点,目前该函数只能接受三个网络分支,多了会报错。

例如:vl_nnpdist(x, x0, 2, 'noRoot', true) 就是为了计算特征矢量X,X0的L2平方距离。

关于参数选项

VL_NNPDIST(___, 'OPT', VAL, ...)可以接受下面参量:1:距离 or 距离的平方 NoRoot [false]: 默认情况下计算p范数,如果设置为true就是计算距离的p次幂; 2:Epsilon = 1e-6 当计算偏导数时,避免除数出现边界效应;例如,L2距离在圆点处并不光滑,这个选项可以防止导数发散; 3:Aggregate [false] :对于输入的每一个空间位置,并不是返回一个标量而是将它们全部加到一个标量中; 4:InstanceWeights = []:可以选择的权重个别案例,用来调节的

3. vl_nnloss - CNN损失函数

Y = VL_NNLOSS(X, C)用来计算预测的分数X与标签C之间的损失。

预测分数X被组织成一个预测矢量场,可以用HxWxDxN矩阵表示。H*W代表空间信息,D代表类别信息,N代表批次的所有数据数量。

尽管在一般情况下都是H=W=1,但是在类似于稠密的标记问题中(例如图像分割),W,H>1是非常有用的。在后一种情况下,损失是用像素来表示的。(分类的贡献可以通过加权来实现,InstanceWeights)

DZDX = VL_NNLOSS(X, C, DZDY) computes the derivative of the block projected onto the output derivative DZDY. DZDX and DZDY have the same dimensions as X and Y respectively.

VL_NNLOSS() 支持几种损失函数,可以通过'loss' = type进行指定。当C中的每一个标量被解释为类别 标签,我们可以使用下面几种损失: 1. Classification error [classerror] L(X,c) = (argmax_q X(q) ~= c). 分类误差的导数是平的,因此这个损失函数适用于评价,而不是用于评价一个模型。2. Top-K classification error [topkerror] L(X,c) = (rank X(c) in X <= K). 排名最高的也是得分最高的。对于K=1,他就和分类误差一样,K 通 过 topK选项可以设定。3. Log loss [log] L(X,c) = - log(X(c)). 这个函数假设X(c)是类别c的分类概率。4. Softmax log loss (multinomial logistic loss) [softmaxlog] L(X,c) = - log(P(c)) where P(c) = exp(X(c)) / sum_q exp(X(q)). 这个和log损失是一样的, 但是使用softmax函数重新正则化预测。5. Multiclass hinge loss [mhinge] L(X,c) = max{0, 1 - X(c)}. 这个函数假设 X(c)是与其他类别相比,对于c类的分数距离。6. Multiclass structured hinge loss [mshinge] L(X,c) = max{0, 1 - M(c)} where M(c) = X(c) - max_{q ~= c} X(q). 7.二值分类误差 Binary classification error [binaryerror] L(x,c) = (sign(x - t) ~= c). t是阈值,默认是0,通过 threshold 可以进行设定。如果x是一 个概率,那么阈值t应该设定为0.5.8. 二值分类损失 Binary log loss [binarylog] L(x,c) = - log(c(x-0.5) + 0.5). X假设属性是正+1的概率。因此,x必须是[0,1]之间的数,这 是log损失函数的二值模式。9. Logistic log loss [logistic] L(x,c) = log(1 + exp(- cx)). 和二值对数损失很类似10. Hinge loss [hinge] L(x,c) = max{0, 1 - cx}. 这是二值分类中的标准hinge损失。如果c=+1对应得分X, c=-1对应得 分0.这个损失就是mshinge损失。11. InstanceWeights [[]]Allows to weight the loss as L'(x,c) = WGT L(x,c), where WGT is a per-instance weight extracted from the array InstanceWeights. For categorical losses, this is either a H x W x 1 or a H x W x 1 x N array. For attribute losses, this is either a H x W x D or a H x W x D x N array.12. TopK [5]Top-K value for the top-K error. Note that K should not exceed the number of labels. See also: VL_NNSOFTMAX().

4. 自定义损失函数 - CNN中的L2损失函数

关于这一个损失层我感觉可以用vl_nnpdist函数实现的。特别的对于孪生网络的(X,X`,Y)这样的的一种输入格式,应该可以采用下面这种结构来实现:

 

这种情况下可能要自己设计损失函数了。

总结

以上是生活随笔为你收集整理的MatConvnet中集成的损失函数(孪生网络的思考)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。