草庐IT

聊聊关于图像分割的损失函数 - BCEWithLogitsLoss

Henry_zhangs 2023-04-03 原文

目录

1. sigmoid + BCELoss

2. BCEWithLogitsLoss

3. gossip


本篇文章是在做图像分割任务,关于损失函数的一些内容。

这里需要的损失函数是:BCEWithLogitsLoss() 就是:sigmoid + BCELoss

1. sigmoid + BCELoss

接下来通过例子来讲解,例如图像分割的时候,网络输出的预测图像是2*2 的矩阵,这里是input

这里先用sigmoid 将输出压缩到0-1之间

 这里要计算 predict 和 label 的损失之,假如这里label是下面的形式。label是一个二阶的单位阵,其中1为前景,0为背景 

根据BCELoss 的损失值计算公式:

  • 其中 y 为真实值 , y(hat)为预测值

因此,首先计算 a11(左上角) 的值:1 * ln 0.6560 + (1-1)* ln(1-0.6560) = -0.4216

然后 a12 (右上角)的值:0 * ln 0.5859 + (1-0)*ln(1-0.5859) = -0.8816

a13 (左下角):0 * ln 0.6172 + (1-0)*ln(1-0.6172) = -0.9602

a14 (右下角):1 * ln 0.6802 + (1-1)*ln(1-0.6802) = -0.3854

将四个结果求均值,然后加个负号的结果为:(0.4216+0.8816+0.9602+0.3854)/ 4 = 0.6622

同 BCELoss 计算的损失值一样

2. BCEWithLogitsLoss

BCEWithLogitsLoss 就是 sigmoid + BCELoss 的结合,如果直接用 BCEWithLogitsLoss 可以得到相同的结果

 

3. gossip

损失函数是计算网络预测的值和真实值的偏差程度,所以我们希望损失值越小越好,这样才能保证predict 和 label 足够的接近

首先说一下二元分类数学表达式:

这里用的是数理统计的内容----极大似然估计,也就是网络预测的内容和真实值在什么情况下最大的相似,或者说这个参数的神经网络对图像分割准确的概率最大。

而求取似然函数的方法就是取对数,所以上面的二元分类会存在 log 函数,而似然函数是求取最大相似的概率。而在深度学习中,我们希望loss 越小越好,所以前面加一个负号

回到图像分割的内容,最后的神经网络需要将输出的图像变成二值图像,所以需要进行阈值判断。

例如下面这样

也就是将神经网络输出的图像矩阵,大于等于零的映射为前景,小于0的映射为背景。

有时候,会将预测的结果经过sigmiod ,然后在 0.5 的左右进行映射判断是一个意思


这里之前本人产生过很多误区,如果预测的时候不让他经过sigmoid,那么为什么计算loss的时候,让神经网络经过sigmoid呢?或者在预测的时候,就让预测值也变成二值图像,和label计算损失?

之前尝试这个想法,最后损失值出现了负数,原因如下:

因为 log 函数在 0-1 上是取的负值,这样才能保证每次计算BCELoss 的时候,才不会出现正数的原因。那么将这些负值累加,求平均,最后加个负号得到的就是需要的损失值。所以,这也是为什么在计算BCELoss 之前需要经过sigmoid 函数了

其次就是 log 函数的定义域是 0-正无穷 ,如果不用 sigmoid限制的话,那么很有可能会出现无法计算的情况。而经过sigmoid之后,值会被限制到 0-1之间,或者说0和1都是取不到的,因为是数学上的极限值。

 

这也就是为什么ln 里面的是 预测值 或者 1-预测值,才能保证计算始终可以进行下去

如果预测不经过sigmoid的话,假如神经网络有一个输出是-1的话,那么就没法进行 ln -1 的计算

如果将预测变成二值图像的话,那么 ln 0 就无法计算

有关聊聊关于图像分割的损失函数 - BCEWithLogitsLoss的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  4. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  5. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  6. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  7. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  8. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  9. ruby-on-rails - 将字符串转换为 ruby​​-on-rails 中的函数 - 2

    我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。

  10. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

随机推荐