形式1:输出为单通道

分析

即网络的输出 output 为 [batch_size, 1, height, width] 形状。其中 batch_szie 为批量大小,1 表示输出一个通道,height 和 width 与输入图像的高和宽保持一致。

在训练时,输出通道数是 1,网络得到的 output 包含的数值是任意的数。给定的 target ,是一个单通道标签图,数值只有 0 和 1 这两种。为了让网络输出 output 不断逼近这个标签,首先会让 output 经过一个sigmoid 函数,使其数值归一化到[0, 1],得到 output1 ,然后让这个 output1 与 target 进行交叉熵计算,得到损失值,反向传播更新网路权重。最终,网络经过学习,会使得 output1 逼近target。

训练结束后,网络已经具备让输出的 output 经过转换从而逼近 target 的能力。首先将输出的 output 通过sigmoid 函数,然后取一个阈值(一般设置为0.5),大于阈值则取1反之则取0,从而得到预测图 predict。后续则是一些评估相关的计算。

代码实现

在这个过程中,训练的损失函数为二进制交叉熵损失函数,然后根据输出是否用到了sigmoid有两种可选的pytorch实现方式:

output = net(input) # net的最后一层没有使用sigmoid

loss_func1 = torch.nn.BCEWithLogitsLoss()

loss = loss_func1(output, target)

当网络最后一层没有使用sigmoid时,需要使用 torch.nn.BCEWithLogitsLoss() ,顾名思义,在这个函数中,拿到output首先会做一个sigmoid操作,再进行二进制交叉熵计算。上面的操作等价于

output = net(input) # net的最后一层没有使用sigmoid

output = F.sigmoid(output)

loss_func1 = torch.nn.BCEWithLoss()

loss = loss_func1(output, target)

当然,你也可以在网络最后一层加上sigmoid操作。从而省去第二行的代码(在预测时也可以省去)。

在预测试时,可用下面的代码实现预测图的生成

output = net(input) # net的最后一层没有使用sigmoid

output = F.sigmoid(output)

predict = torch.where(output>0.5,torch.ones_like(output),torch.zeros_like(output))

...

即大于0.5的记为1,小于0.5记为0。

形式2:输出为多通道

分析

即网络的输出 output 为 [batch_size, num_class, height, width] 形状。其中 batch_szie 为批量大小,num_class 表示输出的通道数与分类数量一致,height 和 width 与输入图像的高和宽保持一致。

在训练时,输出通道数是 num_class(这里取2),网络得到的 output 包含的数值是任意的数。给定的 target ,是一个单通道标签图,数值只有 0 和 1 这两种。为了让网络输出 output 不断逼近这个标签,首先会让 output 经过一个 softmax 函数,使其数值归一化到[0, 1],得到 output1 ,在各通道中,这个数值加起来会等于1。对于target 他是一个单通道图,首先使用onehot编码,转换成 num_class个通道的图像,每个通道中的取值是根据单通道中的取值计算出来的,例如单通道中的第一个像素取值为1(0<= 1 <=num_class-1,这里num_class=2),那么onehot编码后,在第一个像素的位置上,两个通道的取值分别为0,1。也就是说像素的取值决定了对应序号的通道取1,其他的通道取0,这个非常关键。上面的操作执行完后得到target1,让这个 output1 与 target1 进行交叉熵计算,得到损失值,反向传播更新网路权重。最终,网络经过学习,会使得 output1 逼近target1(在各通道层面上)。

训练结束后,网络已经具备让输出的 output 经过转换从而逼近 target 的能力。计算 output 中各通道每一个像素位置上,取值最大的那个对应的通道序号,从而得到预测图 predict。后续则是一些评估相关的计算。

代码实现

在这个过程中,则可以使用交叉熵损失函数:

output = net(input) # net的最后一层没有使用sigmoid

loss_func = torch.nn.CrossEntropyLoss()

loss = loss_func(output, target)

根据前面的分析,我们知道,正常的output是 [batch_size, num_class, height, width]形状的,而target是[batch_size, height, width]形状的,需要按照上面的分析进行转换才可以计算交叉熵,而在pytorch中,我们不需要进一步做这个处理,直接使用就可以了。

在预测试时,使用下面的代码实现预测图的生成

output = net(input) # net的最后一层没有使用sigmoid

predict = output.argmax(dim=1)

...

即得到输出后,在通道方向上找出最大值所在的索引号。

小结

总的来说,我觉得第二种方式更值得推广,一方面不用考虑阈值的选取问题;另一方面,该方法同样适用于多类别的语义分割任务,通用性更强。

参考资料

pytorch 语义分割loss_关于pytorch语义分割二分类问题的两种做法相关推荐

  1. pytorch 入门学习使用逻辑斯蒂做二分类-6

    pytorch 入门学习使用逻辑斯蒂做二分类 使用pytorch实现逻辑斯蒂做二分类 import torch import torchvision import numpy as np import ...

  2. PDF分割成一页一页的怎么做?分享两种分割页面小妙招

    如何将PDF文件分割成一页一页的呢?大家在使用PDF文件的过程中,肯定会遇到需要编辑文件的时候,有时是文件的内容出现了错误,有时是需要合并或者分割页面,就比如我们遇到需要将PDF文件分割成一页一页的时 ...

  3. (!详解 Pytorch实战:①)kaggle猫狗数据集二分类:加载(集成/自定义)数据集

    这系列的文章是我对Pytorch入门之后的一个总结,特别是对数据集生成加载这一块加强学习 另外,这里有一些比较常用的数据集,大家可以进行下载: 需要注意的是,本篇文章使用的PyTorch的版本是v0. ...

  4. pytorch 神经网络套路 实现一维输入特征的二分类

    1.问题描述: x表示学习时长,y表示能否通过考核.预测学习时长为4时,能否通过考试. 2.模型,损失函数,优化器: 模型:线性模型,y_pred=wx+b或y_pred=wx,偏置可以在建立模型时选 ...

  5. 超强语义分割算法!基于语义流的快速而准确的场景解析

    论文地址:https://arxiv.org/abs/2002.10120 代码地址:https://github.com/donnyyou/torchcv 该论文提出了一种有效且快速的场景解析方法. ...

  6. 天池小布助手对话短文本语义匹配-文本二分类实践(pytorch)

    目标:对句子二分类,检测两个句子是否表达是同一个意思,模型数据来自天池全球人工智能技术创新大赛[赛道三]详情 数据格式: 模型:textcnn,lstm,lstm+attention最后选择用最后一种 ...

  7. PyTorch搭建神经网络求解二分类问题

    PyTorch搭建全连接神经网络求解二分类问题 在求解线性回归问题的时候,我们已经学习了如何使用梯度下降算法来不断更新权重矩阵,使误差函数不断减小,这一节我们将使用PyTorch搭建一个简单的神经网络 ...

  8. java分割子字符串,Java 字符串分割截取的方法 (substring,split,StringTokenizer,indexOf,lastIndexOf)...

    需求,把"01:大汽车",分成01和大汽车 有两种做法:一是substring package test; public class substringTest { public ...

  9. 基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    我国高分辨率对地观测系统重大专项已全面启动,高空间.高光谱.高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源.随着小卫星星座的普及,对地观 ...

最新文章

  1. C# Socket编程(5)使用TCP Socket
  2. 推荐几款好用又免费的项目管理工具
  3. 基于Flutter+FaaS的业务框架思考与实践
  4. MySQL高级 - 锁 - MyISAM表锁 - 查看锁争用情况
  5. jdbcTemplate快速入门
  6. 上传文件显示进度条_【技巧 】iOSamp;Windows互传文件?透过「文件」轻松解决~...
  7. linux-tar命令详解
  8. 护士资格证延续注册WEB服务调用失败_服务熔断
  9. Python用户交互
  10. [PHP] excel 的导入导出
  11. android4.4 adb工具包,Android ADB工具
  12. mysql error 1213_webgame中Mysql Deadlock ERROR 1213 (40001)错误的排查历程
  13. xenu死链接工具使用
  14. 小插件,通过js实现邮箱自动提示功能
  15. python+tkinter实现绘图板
  16. Python 网络编程入门——用 Socket 做一个风花雪月服务器
  17. 【BZOJ1580】【USACO2009Hol】杀手游戏 计算几何
  18. 变压器励磁模型 Matlab simulink 可用于模拟电压暂降等电能质量问题
  19. 浅谈单片机、ARM和DSP的异同
  20. NAT模式下如何Ping通百度

热门文章

  1. SAP License:SAP 各个模块含义
  2. PYcharm简单安装教程
  3. JDK 之 HttpClient(jdk11)
  4. TCP/IP详解 学习三
  5. 关于Dijkstra最短路径算法
  6. LoadRunner - 实战,转发
  7. NSFileManager文件操作的十个小功能
  8. 高精度练习(hdoj1042)
  9. Oracle分页查询语句(一)
  10. Firefox Javascript引擎变成单线程