社区首页 >问答首页 >非光滑不可微定制损耗函数tensorflow

非光滑不可微定制损耗函数tensorflow
EN

Stack Overflow用户
提问于 2016-11-22 14:28:31
回答 3查看 7.9K关注 0票数 22
  1. 在tensorflow中,是否可以使用非光滑函数作为损失函数,例如分段(或如果-否则)?如果你不能,为什么你可以使用ReLU?
  2. 在这个链接苗条中,它说

例如,我们可能希望将日志丢失降到最低,但我们感兴趣的指标可能是F1评分,或者与Union评分的交集(这是不可区分的,因此不能用作损失)。

这是否意味着“不可区分”,例如设定的问题?因为对于ReLU,在0点,它是不可微的。

  1. 如果使用这种自定义的损失函数,是否需要自己实现梯度?还是tensorflow可以自动帮你做?我检查了一些压缩损失函数,它们没有为它们的损失函数实现梯度。
EN

回答 3

Stack Overflow用户

发布于 2016-11-22 23:10:46

问题不在于损失是分片的或不顺利的。问题是,当输出和预期输出之间出现错误时,我们需要一个损失函数,它可以向网络参数返回一个非零的梯度。这几乎适用于模型中使用的任何函数(例如损失函数、激活函数、注意函数)。

例如,感知器使用单位步长 H(x)作为激活函数(如果x>0,则H(X)=1)。由于H(x)的导数始终为零(在x=0处未定义),因此损失产生的梯度不会通过它返回权值(链规则),因此在网络中该函数之前没有权值可以用梯度下降来更新。基于此,梯度下降不能用于感知器,而可以用于使用乙状体激活函数的常规神经元(因为梯度不是对所有x都是零的)。

对于Relu,x>0的导数为1,否则为0。当导数在x=0上没有定义时,我们仍然可以在x>0时向后传播损失梯度。这就是为什么可以使用它。

这就是为什么我们需要一个具有非零梯度的损失函数。像精度和F1这样的函数到处都是零梯度(或者在x的某些值下没有定义),所以不能使用它们,而像交叉熵、L2L1这样的函数有非零梯度,所以可以使用。(请注意,L1“绝对差”在x=0中是分段的,并不平滑,但仍然可以使用)

如果您必须使用不符合上述条件的函数,请改用强化学习方法 (例如,策略梯度)。

票数 23
EN

Stack Overflow用户

发布于 2017-05-18 09:00:07

至于OP的问题3,您实际上不必自己实现梯度计算。Tensorflow会为你做这件事,这是我喜欢的事情之一!

票数 5
EN

Stack Overflow用户

发布于 2019-06-14 23:40:02

  1. tf不自动计算所有函数的梯度,即使使用某些后端函数。请看。建立自定义丢失函数时出错为我做了一个任务,然后我自己找到了答案。
  2. 尽管如此,人们只能近似于一个分段可微的函数,以便实现,例如,分段常数/步进函数。下面是我在MATLAB中根据这样一个想法实现的。可以很容易地将其扩展到具有更多阈值(结)和希望边界条件的情况。
代码语言:javascript
代码运行次数:0
复制
function [s, ds] = QPWC_Neuron(z, sharp)
% A special case of (quadraple) piece-wise constant neuron composing of three Sigmoid functions
% There are three thresholds (junctures), 0.25, 0.5, and 0.75, respectively
% sharp determines how steep steps are between two junctures.
% The closer a point to one of junctures, the smaller its gradient will become. Gradients at junctures are zero.
% It deals with 1D signal only are present, and it must be preceded by another activation function, the output from which falls within [0, 1]
% Example:
% z = 0:0.001:1;
% sharp = 100;

LZ = length(z);
s = zeros(size(z));
ds = s;
for l = 1:LZ
    if z(l) <= 0
        s(l) = 0;
        ds(l) = 0;
    elseif (z(l) > 0) && (z(l) <= 0.25)
        s(l) = 0.25 ./ (1+exp(-sharp*((z(l)-0.125)./0.25)));
        ds(l) = sharp/0.25 * (s(l)-0) * (1-(s(l)-0)/0.25);
    elseif (z(l) > 0.25) && (z(l) <= 0.5)
        s(l) = 0.25 ./ (1+exp(-sharp*((z(l)-0.375)./0.25))) + 0.25;
        ds(l) = sharp/0.25 * (s(l)-0.25) * (1-(s(l)-0.25)/0.25);
    elseif (z(l) > 0.5) && (z(l) <= 0.75)
        s(l) = 0.25 ./ (1+exp(-sharp*((z(l)-0.625)./0.25))) + 0.5;
        ds(l) = sharp/0.25 * (s(l)-0.5) * (1-(s(l)-0.5)/0.25);
    elseif (z(l) > 0.75) && (z(l) < 1)
        % If z is larger than 0.75, the gradient shall be descended to it faster than other cases
        s(l) = 0.5 ./ (1+exp(-sharp*((z(l)-1)./0.5))) + 0.75;
        ds(l) = sharp/0.5 * (s(l)-0.75) * (1-(s(l)-0.75)/0.5);
    else
        s(l) = 1;
        ds(l) = 0;
    end
end
figure;
subplot 121, plot(z, s); xlim([0, 1]);grid on;
subplot 122, plot(z, ds); xlim([0, 1]);grid on;

end

  1. 至于Python和tf中的实现,您可以从这里引用@papaouf_ai的出色的分步说明。如何在Tensorflow中使用只使用Python的自定义激活函数?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40752801

复制
相关文章
js|jq获取兄弟节点,父节点,子节点
08.19自我总结 js|jq获取兄弟节点,父节点,子节点 一.js var parent = test.parentNode; // 父节点 var chils = test.childNodes; // 全部子节点 var first = test.firstChild; // 第一个子节点 var last = test.lastChile; // 最后一个子节点  var previous = test.previousSibling; // 上一个兄弟节点 var next = test.next
小小咸鱼YwY
2019/09/11
15.1K0
jquery 获取元素(父节点,子节点,兄弟节点)
1、jquery 获取元素(父节点,子节点,兄弟节点) $("#test1").parent(); // 父节点 $("#test1").parents(); // 全部父节点 $("#test1").parents(".mui-content"); $("#test").children(); // 全部子节点 $("#test").children("#test1"); $("#test").contents(); // 返回#test里面的所有内容,包括节点和文本 $("#test").content
biaoblog.cn 个人博客
2022/08/11
5.6K0
nvue获取节点信息
我们生活在阴沟里,但依然有人仰望星空。——王尔德 在nvue中我们获取节点信息就需要如下写法: <template> <view ref="list-parent" class="ruben"> <list> <cell><view>阿超</view></cell> </list> </view> </template> <script> const dom = weex.requireModule('dom'); export default { data() { return
阿超
2022/08/21
1.5K0
nvue获取节点信息
php获取所有节点的父节点和子节点
根据子节点获取所有的父节点以及父节点的父节点.. <?php $src = '[{"id":"1","name":"媒体(白名单)","pid":"0"},{"id":"2","name":"党媒公
黄啊码
2020/05/29
6.2K0
MySQL连接错误
ERROR 1045 (28000): Access denied for user’root’@’localhost’(using password:YES)
一点儿也不潇洒
2018/08/07
3.6K0
MySQL连接错误
xpath库详解xpath入门获取所有节点 //子节点 /父节点 ..属性匹配 @文本获取按序选择节点轴选择
python爬虫抓取网页内容,需要对html或xml结构的数据进行解析,如果用正则,单是写正则表达式就让很多望而生畏了。
章鱼喵
2018/09/26
25.2K0
xpath库详解xpath入门获取所有节点 //子节点 /父节点 ..属性匹配 @文本获取按序选择节点轴选择
XML获取当前节点信息
%XML.Node的以下字符串属性。提供关于当前节点的信息。 在所有情况下,如果没有当前节点,将抛出一个错误。
用户7741497
2022/07/05
1.6K0
【Debug】npm下载报错:npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT
网络问题😶‍🌫️ npm的默认地址是国外的,在下载依赖时,由于网速问题可能会导致这样那样的错误~ # 查看自己的安装源 npm config get registry # 更换npm源为国内淘宝镜像 npm config set registry http://registry.npm.taobao.org/ # 或者国内npm官方镜像 npm config set registry http://registry.cnpmjs.org/ # ----- 还原npm源 ------ npm co
且陶陶
2023/04/12
4.4K0
【Debug】npm下载报错:npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT
Java连接SqlServer错误
这次使用的是 SqlServer 数据库,之前并没有使用过,但是问题不大,我按照需求文档的步骤连接好 SqlServer 之后,启动 SpringBoot 项目,发现了一个报错,如下:
程序员Leo
2023/08/07
4900
Java连接SqlServer错误
qttreewidget详解_qtreewidget获取节点层级
1:通过findItems 过滤出符合条件的item 只是用于简单的过滤,复杂的效果不太好, 推荐第二种
全栈程序员站长
2022/11/15
2.8K0
qttreewidget详解_qtreewidget获取节点层级
inode节点--软硬连接和作用
一般情况下,文件名和inode号码是”一一对应”关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。
陈不成i
2021/05/25
1.2K0
【JavaScript】获取对应的节点总结
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="dv"> <ul id="uu"> <li>第一个</li> <li>第二个</li>嘎嘎 <li id="three">第三个</li>哈哈 <li>第四个</li> <li>第五个</li> </ul> </div> <script
游魂
2018/06/08
1.4K0
vue是如何获取元素节点 ?
Js中:用document.getElement之类的语句来操作dom; vue:使用vue提供的api,用 ref 来获取节点;
青梅煮码
2023/01/16
2.8K0
SQL根据指定节点ID获取所有父级节点和子级节点
根据指定节点ID获取所有父节点 with temp as( select * from dbo.Category where Id=493 --表的主键ID union all select t.* from temp,dbo.Category t where temp.Pid=t.Id --父级ID=子级ID )select * from temp order by Level; [查询结果] 根据指定节点ID获取所有子节点 with temp as( select * from dbo.Category
段邵华
2019/08/01
6K0
获取DOM节点的方法汇总
我们都知道,当获得所有节点(如:getElementsByTagName)或者获得所有子元素(如:element.childNodes)时,实际上返回的是包含一些DOM节点的集合,这个集合要么是 HTMLCollection,要么是 NodeList,两者其实都是类数组的对象。
Chor
2019/11/07
4.3K0
JavaScript之怎样获取元素节点
JavaScript获取元素节点一共有三种方法,分别是通过元素ID、通过标签名字和通过类名字来获取; 1.通过元素ID属性的ID值来获得元素对象-getElementById() DOM提供了一个名为getElementById()的方法,这个方法将返回一个与括号里有着一样id值的元素节点对应的对象。他是document对象特有的函数,这个函数的参数只有一个,只能是你想要获得的元素的ID值,这个值必须放在单引号或者双引号里面。 注意:JavaScript语言区分字母大小写,所以在写getElementByI
郑小超.
2018/01/24
1.3K0
树形结构已知子节点获取子节点所有父节点——任意目录/树
JS 树形结构 根据子节点找到所有上级,比如element-tree,已知路由上的子结点id,如何回填的 展开目录树?
周陆军博客
2023/05/07
3.3K0
element tree 获取当前节点和其父级节点的数据
需求:树形菜单点击之后需要形成面包屑,所以需要当前节点和其父级节点的数据。记录一下解决方法,如下。
用户7741497
2022/03/06
2.7K0
MYSQL vs JAVA 连接错误
最近开发告诉我,他们在测试系统的时候,会经常有连接MYSQL的连接被踢掉。具体给我的解释是,JAVA的缓冲池连接MYSQL 保持连接,但再次使用的时候,报连接错误。
AustinDatabases
2019/07/12
3.9K0
MYSQL  vs JAVA 连接错误
java根据子节点获取它对应的所有父节点_java根据父节点查找子节点
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/01
6.9K0

相似问题

将ereg_replace转换为preg_replace

21

将此ereg_replace转换为preg_replace

19

将eregi转换为preg_match,将ereg_replace转换为preg_replace

18

将ereg_replace更改为preg_replace

10

在php中将ereg_replace转换为preg_replace

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档