DL学习笔记【18】nn包中的各位Criterions

2024-02-14 12:18

本文主要是介绍DL学习笔记【18】nn包中的各位Criterions,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

很多事情不是因为有多难才没完成,只是因为没有开始。come on,看好你哟!

参考自https://github.com/torch/nn/blob/master/doc/criterion.md

Criterions


---------------------------------------------------------------------------------------------------------------------------------------------------------------------


Classification criterions(分类准则)


[output]forward(input, target)

计算该准则下的损失函数的值。output需要是标量

The state variable self.output should be updated after a call to forward().


[gradInput] backward(input, target)

The state variable self.gradInput should be updated after a call to backward().


BCECriterion

基于sigmoid的二进制交叉熵(ClassNLLCriterion的二分类情况)

公式如下:

loss(o, t) = - 1/n sum_i (t[i] * log(o[i]) + (1 - t[i]) * log(1 - o[i]))


ClassNLLCriterion

criterion = nn.ClassNLLCriterion([weights])
如果要使用这个,就需要在网络最后一层添加logsoftmax层,如果不想额外添加layer,可以使用CrossEntropyCriterion
The loss can be described as:
loss(x, class) = -x[class]

网页上的这一句看不明白,class是y么?。。。(或许只要知道它和logsoftmax组合起来是交叉熵就ok了)


CrossEntropyCriterion

criterion = nn.CrossEntropyCriterion([weights])

用于多分类情况

The loss can be described as:
loss(x, class) = -log(exp(x[class]) / (\sum_j exp(x[j]))) = -x[class] + log(\sum_j exp(x[j]))

损失函数看不懂额(或许也不用看它这里的公式,只要知道理论,然后会用这个层就好了,可能它解释的并不是最好的)

通常将size average设置为false

crit = nn.CrossEntropyCriterion(weights)
crit.nll.sizeAverage = false

ClassSimplexCriterion

criterion = nn.ClassSimplexCriterion(nClasses)
该函数对于每一个类,学习一个embedding,embedding将极其稀疏的one-hot编码的词语进行降维。

在使用这个损失函数之前需要有这样两层(NormalizedLinearNoBias和Normalized),嗯。不太明白。。先记录一下,有时间再研究咯 -- 在教程中有论文,如果想了解,可以去看看论文,比多元逻辑回归更鲁棒

nInput = 10
nClasses = 30
nHidden = 100
mlp = nn.Sequential()
mlp:add(nn.Linear(nInput, nHidden)):add(nn.ReLU())
mlp:add(nn.NormalizedLinearNoBias(nHidden, nClasses))
mlp:add(nn.Normalize(2))criterion = nn.ClassSimplexCriterion(nClasses)function gradUpdate(mlp, x, y, learningRate)pred = mlp:forward(x)local err = criterion:forward(pred, y)mlp:zeroGradParameters()local t = criterion:backward(pred, y)mlp:backward(x, t)mlp:updateParameters(learningRate)
end

MarginCriterion

criterion = nn.MarginCriterion([margin])
二分类

例子代码:

function gradUpdate(mlp, x, y, criterion, learningRate)local pred = mlp:forward(x)local err = criterion:forward(pred, y)local gradCriterion = criterion:backward(pred, y)mlp:zeroGradParameters()mlp:backward(x, gradCriterion)mlp:updateParameters(learningRate)
endmlp = nn.Sequential()
mlp:add(nn.Linear(5, 1))x1 = torch.rand(5)
x1_target = torch.Tensor{1}
x2 = torch.rand(5)
x2_target = torch.Tensor{-1}
criterion=nn.MarginCriterion(1)for i = 1, 1000 dogradUpdate(mlp, x1, x1_target, criterion, 0.01)gradUpdate(mlp, x2, x2_target, criterion, 0.01)
endprint(mlp:forward(x1))
print(mlp:forward(x2))print(criterion:forward(mlp:forward(x1), x1_target))
print(criterion:forward(mlp:forward(x2), x2_target))

输出:

 1.0043
[torch.Tensor of dimension 1]-1.0061
[torch.Tensor of dimension 1]0
0


By default, the losses are averaged over observations for each minibatch. However, if the field sizeAverage is set to false, the losses are instead summed.


SoftMarginCriterion

criterion = nn.SoftMarginCriterion()

二分类

例子代码:

function gradUpdate(mlp, x, y, criterion, learningRate)local pred = mlp:forward(x)local err = criterion:forward(pred, y)local gradCriterion = criterion:backward(pred, y)mlp:zeroGradParameters()mlp:backward(x, gradCriterion)mlp:updateParameters(learningRate)
endmlp = nn.Sequential()
mlp:add(nn.Linear(5, 1))x1 = torch.rand(5)
x1_target = torch.Tensor{1}
x2 = torch.rand(5)
x2_target = torch.Tensor{-1}
criterion=nn.SoftMarginCriterion(1)for i = 1, 1000 dogradUpdate(mlp, x1, x1_target, criterion, 0.01)gradUpdate(mlp, x2, x2_target, criterion, 0.01)
endprint(mlp:forward(x1))
print(mlp:forward(x2))print(criterion:forward(mlp:forward(x1), x1_target))
print(criterion:forward(mlp:forward(x2), x2_target))

输出:

0.7471
[torch.DoubleTensor of size 1]-0.9607
[torch.DoubleTensor of size 1]0.38781049558836
0.32399356957564

MultiMarginCriterion

criterion = nn.MultiMarginCriterion(p, [weights], [margin])
多分类

使用时,前边需要加这两句:

mlp = nn.Sequential()
mlp:add(nn.Euclidean(n, m)) -- outputs a vector of distances
mlp:add(nn.MulConstant(-1)) -- distance to similarity
(公式还没有细看,先知道是多分类就好啦。。。)

MultiLabelMarginCriterion

criterion = nn.MultiLabelMarginCriterion()
一个物体属于多个类别

代码例子:

criterion = nn.MultiLabelMarginCriterion()
input = torch.randn(2, 4)
target = torch.Tensor{{1, 3, 0, 0}, {4, 0, 0, 0}} -- zero-values are ignored
criterion:forward(input, target)


MultiLabelSoftMarginCriterion

criterion = nn.MultiLabelSoftMarginCriterion()


---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Regression criterions


AbsCriterion

criterion = nn.AbsCriterion()
公式如下:

loss(x, y)  = 1/n \sum |x_i - y_i|
如果x,y是d维的,也是除n,这样计算其实是不对的,所以我们可以通过以下方法来避免

criterion = nn.AbsCriterion()
criterion.sizeAverage = false
(问:如果不除,全都加起来岂不是很大?这样之后需要在后边加别的来归一化么?)


SmoothL1Criterion

criterion = nn.SmoothL1Criterion()
smooth version of  AbsCriterion
使用方法:

criterion = nn.SmoothL1Criterion()
criterion.sizeAverage = false

MSECriterion

criterion = nn.MSECriterion()
最小均方误差

使用方法:

criterion = nn.MSECriterion()
criterion.sizeAverage = false


SpatialAutoCropMSECriterion

criterion = nn.SpatialAutoCropMSECriterion()
如果目标和输出差得比较大,那么可以用这个。
使用方法,之前已经解释过很多次false,此处不解释了哦:

criterion = nn.SpatialAutoCropMSECriterion()
criterion.sizeAverage = false

SpatialAutoCropMSECriterion

criterion = nn.SpatialAutoCropMSECriterion()
如果目标和输出差得比较大,那么可以用这个。
使用方法,之前已经解释过很多次false,此处不解释了哦:

criterion = nn.SpatialAutoCropMSECriterion()
criterion.sizeAverage = false

DiskKLDivCriterion

criterion = nn.DistKLDivCriterion()
KL散度


---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Embedding criterions (测量两个输入是否相似或者不相似)


HingeEmbeddingCriterion

criterion = nn.HingeEmbeddingCriterion([margin])

y=1改变weightbias使得输入的两个tensor越来越近,y=-1输入的两个tensor越来越远

(个人理解,可以使用l1距离,也可以自己设置距离,教程。。。写错了吧。。。只给一个tensor应该不能算距离吧)


L1HingeEmbeddingCriterion

criterion = nn.L1HingeEmbeddingCriterion([margin])

算输入两个向量的l1距离


CosineEmbeddingCriterion

criterion = nn.CosineEmbeddingCriterion([margin])

cosine距离


DistanceRatioCriterion

criterion = nn.DistanceRatioCriterion(sizeAverage)

共三个向量,第一个是anchor,第二个和第一个相似,第三个和第一个不相似,公式如下:

loss = -log( exp(-Ds) / ( exp(-Ds) + exp(-Dd) ) )

代码如下(没有看懂):

torch.setdefaulttensortype("torch.FloatTensor")require 'nn'-- triplet : with batchSize of 32 and dimensionality 512sample = {torch.rand(32, 512), torch.rand(32, 512), torch.rand(32, 512)}embeddingModel = nn.Sequential()embeddingModel:add(nn.Linear(512, 96)):add(nn.ReLU())tripleModel = nn.ParallelTable()tripleModel:add(embeddingModel)tripleModel:add(embeddingModel:clone('weight', 'bias', 'gradWeight', 'gradBias'))tripleModel:add(embeddingModel:clone('weight', 'bias','gradWeight', 'gradBias'))-- Similar sample distance w.r.t anchor sampleposDistModel = nn.Sequential()posDistModel:add(nn.NarrowTable(1,2)):add(nn.PairwiseDistance())-- Different sample distance w.r.t anchor samplenegDistModel = nn.Sequential()negDistModel:add(nn.NarrowTable(2,2)):add(nn.PairwiseDistance())distanceModel = nn.ConcatTable():add(posDistModel):add(negDistModel)-- Complete Modelmodel = nn.Sequential():add(tripleModel):add(distanceModel)-- DistanceRatioCriterioncriterion = nn.DistanceRatioCriterion(true)-- Forward & Backwardoutput = model:forward(sample)loss   = criterion:forward(output)dLoss  = criterion:backward(output)model:backward(sample, dLoss)

怎么合在一起的。。怎么连接的。。

9632的关系是什么情况

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Miscelaneus criterions(混合准则)


MultiCriterion

criterion = nn.MultiCriterion()

将多个准则放在一起。并赋予权重。代码如下:

input = torch.rand(2,10)
target = torch.IntTensor{1,8}
nll = nn.ClassNLLCriterion()
nll2 = nn.CrossEntropyCriterion()
mc = nn.MultiCriterion():add(nll, 0.5):add(nll2)
output = mc:forward(input, target)


ParallelCriterion

criterion = nn.ParallelCriterion([repeatTarget])

两个输入?两个输出?计算tensor中对应的损失然后按权重相加?

为什么要这样?可以用在哪里呢?


MarginRankingCriterion

criterion = nn.MarginRankingCriterion(margin)

输入3tensor

例子代码看不懂啊啊啊

p1_mlp = nn.Linear(5, 2)
p2_mlp = p1_mlp:clone('weight', 'bias')prl = nn.ParallelTable()
prl:add(p1_mlp)
prl:add(p2_mlp)mlp1 = nn.Sequential()
mlp1:add(prl)
mlp1:add(nn.DotProduct())mlp2 = mlp1:clone('weight', 'bias')mlpa = nn.Sequential()
prla = nn.ParallelTable()
prla:add(mlp1)
prla:add(mlp2)
mlpa:add(prla)crit = nn.MarginRankingCriterion(0.1)x=torch.randn(5)
y=torch.randn(5)
z=torch.randn(5)-- Use a typical generic gradient update function
function gradUpdate(mlp, x, y, criterion, learningRate)local pred = mlp:forward(x)local err = criterion:forward(pred, y)local gradCriterion = criterion:backward(pred, y)mlp:zeroGradParameters()mlp:backward(x, gradCriterion)mlp:updateParameters(learningRate)
endfor i = 1, 100 dogradUpdate(mlpa, {{x, y}, {x, z}}, 1, crit, 0.01)if true theno1 = mlp1:forward{x, y}[1]o2 = mlp2:forward{x, z}[1]o = crit:forward(mlpa:forward{{x, y}, {x, z}}, 1)print(o1, o2, o)end
endprint "--"for i = 1, 100 dogradUpdate(mlpa, {{x, y}, {x, z}}, -1, crit, 0.01)if true theno1 = mlp1:forward{x, y}[1]o2 = mlp2:forward{x, z}[1]o = crit:forward(mlpa:forward{{x, y}, {x, z}}, -1)print(o1, o2, o)end
end

第一个比第二个value更高?



这篇关于DL学习笔记【18】nn包中的各位Criterions的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708474

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件