• LCFCN是一个以分割网络为基础的专用于计数的网络.
  • LCFCN模型由于loss的特殊性 batch size 目前只能为1
  • LCFCN代码 https://github.com/ElementAI/LCFCN

核心概念loss 介绍

  该网络的核心概念是loss,主干网络就是传统的Encoder-Decoder结构的分割网络。LCFCN的loss由四部分组成,分别是Image-level loss、Point-level loss、Split-level loss、False positive loss。

Image-level loss

  图像水平的loss公式如下所示,其中CeC_eCe​为图片中出现的类别集合,包括背景类。对于CeC_eCe​中的每一类,该loss鼓励模型输出至少有一个像素点被预测为该类。¬Ce\neg C_e¬Ce​表示图像中没有出现过的类别,该loss会降低任意像素点被预测为该类的概率。tc=argmaxi∈It_c=argmax_{i \in I}tc​=argmaxi∈I​,SicS_{ic}Sic​表示像素i属于类别C的概率。

Point-level loss

  该项loss鼓励模型正确地预测包含在真实标签中的有监督像素小集合IsI_sIs​,IsI_sIs​代表对象实例的位置。定义为:

其中TiT_iTi​代表像素i的真实标签。值得注意的是这项loss忽略了没有标注的全部像素。

False Positive loss

  LFL_FLF​不鼓励模型预测一个不包含对象的blob,为了减少虚警的预测。这个损失函数如下:

其中BfpB_{fp}Bfp​是像素组成的blobs预测每个类别(除了背景类别外)中不包含ground truth点标注的。注意Si0S_{i0}Si0​是像素i属于背景类别的概率。在BfpB_{fp}Bfp​预测的所有结果被认为是虚警的情况。也就是在训练的时候对预测为前景的不包含ground truth点的blobs进行惩罚。因此,优化这项loss能够让虚警更少的出现。这对计数来说非常重要。

Split-level loss

  LSL_SLS​不鼓励模型预测blobs(有两个或更多的点的标注的像素团)。因此,如果一个blob包含n个标注的点(每个点代表一个对象),这个loss就强迫它分成n个blobs,每个blob是相应独一无二的对象。这些分割是通过先发现对象间的边界得到的。模型然后来学习预测这些边界作为背景类。模型输出一个二值的矩阵F其中像素i满足条件argmaxkSik>0argmax_kS_{ik} > 0argmaxk​Sik​>0为前景其余的是背景。

  代码的是实现是使用from skimage import morphology.label(C++ connectedComponentsWithStats)来找连通域。在训练的时候对包含多个ground truth点的blobs进行分离,来构造Target。论文提出了两种方法:1.直线分割法 2. 漫水分割法

  用过pytorch的朋友都知道,pytorch中需要手动对梯度进行清零,所以如果不清零,那么就可以对梯度进行累加了,梯度累加的作用很多,比如可以用在多任务训练的时候,另外在内存大小不够的情况下叠加多个batch的grad作为一个更大的batch进行迭代,因为二者得到的梯度是等价的。这种梯度累加的思路是对内存的非常友好的。

  由于LCFCN模型在训练的过程中用到了“漫水分割法”,所以限制了该模型在训练的时候batch size只能为1,但是batch size为1对于模型来说很难捕捉到数据分布的共性,所以也比较难收敛,所以为了解决这个问题我用到了”梯度累加“这个办法,即对多个样本的loss进行取平均再去优化模型,这样做除了BN层和真正的batch size > 1不同以外,其余的没什么区别了。(修改源码中的utils.py文件即可)。

  

# 修改batch size
bs = 16def fit(model, dataloader, opt, loss_function, epoch):model.train()n_samples = len(dataloader.dataset)n_batches = len(dataloader)print("Training Epoch {} .... {} batches".format(epoch, n_batches))train_dict = {}loss_sum = 0.for i, batch in enumerate(dataloader):loss = loss_function(model, batch)loss = loss / bs                                                                                       loss.backward()                                                                                        if i % bs == 0 and i != 0:                                                                             opt.step()                                                                                         opt.zero_grad()                                                                                    #print("Optimized.")                                                                               loss_sum += loss.item() * bs                                                                           if (i % 50) == 0 or i == (n_batches - 1):                                                              print("{} - ({}/{}) - split: {} - loss: {:.2f}".format(epoch, i, n_batches, dataloader.dataset.split, loss_sum / max(
1., i)))# train                                                                                                    train_dict["loss"] = loss_sum / n_batches                                                                  train_dict["epoch"] = epoch                                                                                train_dict["n_samples"] = n_samples                                                                        train_dict["iterations"] = n_batches                                                                       return train_dict

参考

https://www.zhihu.com/question/303070254/answer/573037166

【计数网络】梯度累加增加LCFCN的BatchSize相关推荐

  1. 【深度学习训练小技巧】1080ti与2080ti区别、apex与梯度累加

    文章目录 1080ti与2080ti区别 在目标检测和分割任务中使用apex 梯度累加(一般不在目标检测中使用) torch.no_grad() 当我们没有足够的显卡训练模型时,apex和梯度累加是有 ...

  2. Pytorch分布式训练/多卡训练(二) —— Data Parallel并行(DDP)(2.2)(代码示例)(BN同步主卡保存梯度累加多卡测试inference随机种子seed)

    DDP的使用非常简单,因为它不需要修改你网络的配置.其精髓只有一句话 model = DistributedDataPrallel(model, device_ids=[local_rank], ou ...

  3. 梯度累加策略对准确率的影响

    从曲线整体分析来看等效的(geng_xing_bu_chang*batch_size=等效batch_size的大小,)倍数越大准确率损失越严重(虽然30到300的采样太稀疏但是可以忽略) 如下图 从 ...

  4. TF实现多minibatch梯度累加及反向更新

    参考链接: TF中optimizor源码: https://blog.csdn.net/Huang_Fj/article/details/102688509 如何累加梯度进行反向: https://s ...

  5. gradient_accumulation_steps --梯度累加理解

    参考: https://blog.csdn.net/Princeicon/article/details/108058822 https://blog.csdn.net/weixin_43643246 ...

  6. Gradient Accumulation 梯度累加 (Pytorch)

    我们在训练神经网络的时候,batch_size的大小会对最终的模型效果产生很大的影响.一定条件下,batch_size设置的越大,模型就会越稳定.batch_size的值通常设置在 8-32 之间,但 ...

  7. 通俗理解深度学习梯度累加(Gradient Accumulation)的原理

    首先你得明白什么是梯度,可以看我之前写的一篇博客 : 微分与梯度的概念理解 本质上,梯度是一种方向导数,是一个矢量,因此这里的梯度累加并不是简单的相加,而是类似于初高中物理学的力的合成,梯度作为一种方 ...

  8. 梯度累加(Gradient Accumulation)

    受显存限制,运行一些预训练的large模型时,batch-size往往设置的比较小1-4,否则就会'CUDA out of memory',但一般batch-size越大(一定范围内)模型收敛越稳定效 ...

  9. pytorch多gpu DataParallel 及梯度累加解决显存不平衡和显存不足问题

      最近在做图像分类实验时,在4个gpu上使用pytorch的DataParallel 函数并行跑程序,批次为16时会报如下所示的错误:   RuntimeError: CUDA out of mem ...

最新文章

  1. OpenCV运动检测跟踪(blob track)框架组成模块详解
  2. JGG | 肠道微生物研究助力穿山甲圈养保护
  3. 自己实现Java RPC框架一:RMI
  4. java静态类和非静态类_关于java:静态和非静态内部类的区别?
  5. SAP Analytics Cloud里Exception Aggregation Type的设置
  6. SAP UI5 CRM Reuse Fiori应用 note.js代码审查结果
  7. poj 1751 Highways 最小生成树Kruskal(、Prim还没写
  8. distinct去重多个字段_sql中去重是distinct还是group by?
  9. [强烈推荐]Oracle:只有rman备份(数据,参数,日志,控制文件全丢失)的恢复
  10. php 检查货币类型_php 判断函数是否为费用类型(金额/货币:6.02)有小数点
  11. java赵云主角兵器谱游戏_三国赵云所用的龙胆亮银枪的起源——传奇兵器谱一、“百兵之王”枪...
  12. Android封装一个自定义标题栏
  13. 关于ADXL345的资料的汇总
  14. Mac软件打开提示:已损坏,无法打开。您应该将它移到废纸娄 怎么解决?
  15. 算法 c语言实现 英文版 pdf,数据结构与算法分析++C语言描述++英文版++..pdf-得力文库...
  16. 再劫面包店——未被实现的愿望的诅咒(正式版)
  17. mysql 修改 root 密码
  18. 我用 10 张脑图,征服了一系列大厂面试官。
  19. 对接医疗资源,创建高质量医疗数据库,这家公司能降低跨境医疗费用吗?
  20. js进阶之你必须要会的技术!

热门文章

  1. php中如何加密,PHP中的加密功能
  2. pdf转ppt_好用的pdf转ppt(一个神站+一个神器)
  3. python _winreg 操作注册表
  4. 2021扬州市高考成绩查询,2021高考成绩查询系统登录官网入口
  5. java工程师占比_25岁零基础转行学Java,他如今月入16k
  6. numpy中矩阵的转置_NumPy矩阵transpose()-Python中数组的转置
  7. java关键字保留字_Java这个关键字
  8. linux与unix的区别_Linux与Unix
  9. Python中的numpy.append()
  10. java 数字 下划线_数字文字中的下划线– Java 7功能