在本文中,我们将介绍两种方法,它们允许你获得模型的不确定性:蒙特卡罗Dropout法(MC Dropout)和深度集成法。

它们适用于各种各样的任务,但在本文中,我们将展示一个图像分类的示例。它们都相对容易理解和实现,都可以很容易地应用于任何现有的卷积神经网络架构(例如ResNet、VGG、RegNet等)。

为了帮助你快速轻松地应用这些技术,我将提供用PyTorch编写的这些技术的补充代码。

给出两个杯子的图像,你的预测模型有多确定?

在我们开始之前,让我们回顾一下测量模型不确定性意味着什么,以及它如何对你的机器学习项目有用。

什么是模型不确定性?

就像人类一样,机器学习模型可以对其预测显示一定程度的信心。一般来说,在讨论模型不确定性时,需要区分了认知不确定性和任意不确定性。

认知不确定性是在模型参数中表示的不确定性。这种类型的不确定性可以通过额外的训练数据来减少,因此具有“可减少的不确定性”的替代名称。

任意不确定性捕获环境固有的噪声,即观测。与认知不确定性相比,这种类型的不确定性不能用更多的数据来减少,而是用更精确的传感器输出来减少。

第三种类型称为预测不确定性,即模型输出中传递的不确定性。预测不确定性可以结合认知不确定性和任意不确定性。

分类器的softmax输出示例:

如果你自己已经训练过简单的神经网络,那么最直观的想法就是模型的softmax输出,即你经常看到的作为模型预测结果显示的百分比值。

但是,使用softmax输出作为模型不确定性的度量可能会产生误导,并且不是很有用。这是因为softmax函数所做的只是计算模型不同激活值之间的某种“关系”。

因此,你的模型可以在其输出层的所有神经元中具有较低的激活值,并且仍然达到较高的softmax值。这不是我们的目标。但值得庆幸的是,有多种更有效的技术来估计模型的不确定性,如蒙特卡罗Dropout和深度集成。

为什么模型不确定性有用?

有两个主要方面使评估模型的不确定性变得有用:

首先是透明度。假设你正在构建一个应用于医学图像分析的机器学习模型。因此,使用你的工具的医生在很大程度上依赖于其做出正确诊断的能力。

如果你的模型现在做出了一个预测,它实际上是高度不确定的,但确实将此信息传达给了医生,那么对患者治疗的后果可能是致命的。因此,对模型的不确定性进行估计可以在很大程度上帮助医生判断模型的预测。

第二是显示出改进的空间。没有一种机器学习模型是完美的。因此,了解模型的不确定性和弱点实际上可以告诉你需要对模型进行哪些改进。

实际上,有一门完整的学科专门研究这门学科,叫做主动学习。假设你已经用1000张图片和10个类训练了你的ConvNet。但你仍然有9000多张尚未标记的图像。如果你现在使用经过训练的模型来预测哪些图像是最不确定的,则标记这些图像并重新训练模型。结果表明,与这些图像的随机抽样相比,这种不确定性抽样对模型改进更有效。

好了,让我们来讨论这两种技术。

技巧1:蒙特卡罗Dropout

Monte Carlo Dropout,简称MC Dropout,是一种在模型中使用Dropout层来创建模型输出变化的技术。

应用于神经网络的Dropout可视化。

Dropout层通常在训练期间用作正则化技术。在向前通过网络的过程中,某些神经元以一定的概率随机为0。这表明,该模型具有更强的抗过拟合能力。

通常,为了不干扰新图像的前向传递,在训练后禁用这些Dropout层。所以,要使用这种技术,请确保在你的模型中至少实现一个Dropout层。这可能看起来像这样。

import torch
import torch.nn as nn
import torch.nn.functional as Fclass Model(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(3, 6, 5)self.pool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(6, 16, 5)self.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)# 定义 0.25 dropout概率self.dropout = nn.Dropout(0.25)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = torch.flatten(x, 1)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))# Dropout x = self.dropout(x)x = self.fc3(x)return xmodel = Model()

但是对于MC Dropout,Dropout层仍然被激活,这意味着神经元仍然可以随机为0。这导致模型的softmax结果发生变化。要在推理或测试期间使用Dropout,请使用以下代码:

for module in model.modules():if module.__class__.__name__.startswith('Dropout'):module.train()

现在Dropout仍然可用,因为我们已经把所有Dropout层进入训练模式!

假设我们现在想在一张图像上获得模型的不确定性。为此,我们不仅要对图像进行一次预测,还要进行多次预测,并分析由多个前向传播生成的不同输出。我建议让模型在一张图像上预测3到5次。在本文末尾,我将介绍如何组合3或5个输出。

技巧2:深层集成

第二种估计模型不确定性的技术利用了创建模型集合的优势。与其使用一个模型并预测5次,不如使用同一类型的多个模型,随机初始化它们的权重,并根据相同的数据对它们进行训练。

多个神经网络集成的可视化:

这也将在模型参数中创建变化。如果模型经过稳健训练,并且对图像有把握,它将为每个前向传播输出类似的值。

要初始化模型,最好将其保存为模型列表:

# 我们的集成中要有多少个模型
n_ensemble = 5# 初始化集合
ensemble = [Model() for e_model in range(n_ensemble)]

初始化后,所有模型都将在相同的训练数据上进行训练。就像MC Dropout者一样,3或5个模型是一个不错的选择。

为了获得给定图像上模型的不确定性,将其传递到集合中的每个模型中,并将其预测组合起来进行分析。

组合来自多个前向传播的模型输出

假设我们为MC Dropout定义了5次前向传播过程,集成模型包含5个模型。

现在,我们预计这些输出之间会出现一些变化,从而显示出模型的不确定性。

为了得到不确定性的最终值,必须首先对这些输出进行叠加。这段代码是一个例子,说明了如何实现MCDropout:

import numpy as npfwd_passes = 5
predictions = []for fwd_pass in range(fwd_passes):output = model(image)np_output = output.detach().cpu().numpy()if fwd_pass == 0:predictions = np_outputelse:predictions = np.vstack((predictions, np_output))

首先,我们定义要执行的前向传播及保存所有预测的空列表。然后我们前向传播5次。第一个输出用作结果numpy数组的初始化,所有其他输出都堆叠在顶部。

这是具有相同基本原则的深层集成代码:

import numpy as nppredictions = []for i_model, model in enumerate(ensemble):output = model(image)np_output = output.detach().cpu().numpy()if i_model == 0:predictions = np_outputelse:predictions = np.vstack((predictions, np_output))

现在我们已经组合了所有输出,让我们看看如何从这些输出计算模型的不确定性。

获取模型不确定性

为了简单起见,我们将使用预测熵来估计给定图像上模型的不确定性。

预测熵的数学公式为y(标签)、x(输入图像)、Dtrain(训练数据)、c(类)、p(概率)。

一般来说,预测不确定性告诉你模型看到这张图像时有多“惊讶”。如果该值较低,则模型对其预测是确定的。如果结果为高,则模型不知道图像中的内容。

计算预测不确定度可以通过这段代码来实现,这段代码接收预测数组作为输入。

import sys
import numpy as npdef predictive_entropy(predictions):epsilon = sys.float_info.minpredictive_entropy = -np.sum( np.mean(predictions, axis=0) * np.log(np.mean(predictions, axis=0) + epsilon),axis=-1)return predictive_entropy

方程中的ε阻止了除0,这在数学上是没有定义的。

好吧现在,你有了一个图像的不确定性值。如前所述,值越高,模型的不确定性越大。

结尾

在本文中,你已经学会了估计模型的不确定性。这项技术也可以通过一些调整应用于目标检测,它非常强大。

参考资料:

[1] Uncertainty in Deep Learning, Yarin Gal. http://mlg.eng.cam.ac.uk/yarin/thesis/thesis.pdf

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

测量模型不确定性的两种简单方法相关推荐

  1. PDF文档压缩的两种简单方法

    我们无论在办公中还是在上网查找资料时,经常会遇到PDF文档.工作中,传送邮件时需要PDF文档格式的,但是PDF文档太大也是个棘手的问题.大多数公司邮箱上传附件大小是限制在5M以下的,否则就会出现接收失 ...

  2. 简单轻松的将本地项目上传到Github的两种简单方法

    如何将本地项目上传到Github 将本地项目上传到Github(两种简单.方便的方法) 一.第一种方法: 二.第二种方法: Git命令 查看.添加.提交.删除.找回,重置修改文件 查看文件diff 查 ...

  3. 对 Python 字典排序的两种简单方法

    引言 Dictionary 是一种重要的数据结构,它通过将 key 与 value 进行映射来存储数据.Python 中的默认字典是无序数据结构.与列表一样,我们可以使用 sorted()函数按键对字 ...

  4. 如何恢复被删短信_恢复iPhone短信的两种简单方法推荐

    随着生活水平不断提升,iPhone的普及率也在大大提升.除微信外,短信是最高频的即时沟通工具之一.有时,不小心将对方发来的重要短信误删,无法找到相应数据时,从iPhone上恢复已删除的短信就是大家最关 ...

  5. iphone怎么变android,如何将安卓变ios7 将安卓变iphone的两种简单方法分享

    第一种将安卓变ios7方法 如果你非常喜欢iOS 7的设计风格却又不愿意放弃Android系统带来的自由体验,或许让你的Android系统看起来像iOS 7是一个不错的选择.现在通过一些Android ...

  6. C语言怎么保留n位小数并且四舍五入(附带两种简单方法)

    网上的方法: 很简单,假如你有一个float型变量a,其值为1.23456,而你只想保留三位小数,也就是希望得到1.235,只需要令: a = (int)(1000.0 * a + 0.5) / 10 ...

  7. iOS关闭键盘的两种简单方法

    方法一: //1, 关闭键盘 [[[UIApplication sharedApplication] keyWindow] endEditing:YES]; 想必大家都遇到过一个view上好多输入框, ...

  8. 两种简单方法:把输入的整数(最多不超过五位),按输入的反方向输出。例如输入12345,要求输出结果是54321.编程实现此功能。

    把输入的整数(最多不超过五位),按输入的反方向输出.例如输入12345,要求输出结果是54321.编程实现此功能. 方法1: #include<stdio.h> #include<s ...

  9. 生成微信公众号对应二维码的两种简单方法

    方法1 在浏览器中打开下面的链接 https://open.weixin.qq.com/qr/code?username=Name 其中Name替换为对应公众号的微信号 例如,我们打算生成公众号 AI ...

最新文章

  1. js控制select数据绑定下拉列表
  2. spring使用回顾
  3. c语言中c为字符型便量,c='97'是否正确,C语言判断题Word版
  4. 在Virtualbox中的Ubuntu虚拟机中,安装Guest Additions客户端增强包时出错:分配介质 虚拟光盘 xxx\VBoxsGuestAdditions.iso 到虚拟电脑
  5. superset可视化-Pie Chart(圆饼图)
  6. 漫步者lollipods如何调节音量_漫步者MF5扩音器体验:老师值得入手
  7. 调用打印机_涨知识|你不知道的关于打印机的打印过程和打印机驱动的那些事...
  8. 相见恨晚!遗憾仅有不到1% 的人知道
  9. eclipse开发web应用程序步骤(图解)
  10. Unity3D Shader 入门之控制语句
  11. (zhuan) LSTM Neural Network for Time Series Prediction
  12. VMware 安装 Linux---错误-未找到要在其中创建新文件系统的有效设备
  13. 【转】字符串和浮点数格式化输出小结
  14. java.lang.UnsatifiedLinkError错误一例:在eclipse中启动应用报错
  15. Mujoco中旋转轴的定义
  16. 【附源码】计算机毕业设计java-志愿者管理系统设计与实现
  17. 浮山中学2021年高考成绩查询入口,浮山中学2019年高考成绩通报,第二波震撼来袭...
  18. 戴尔U2520DR型号显示器连接MacbookPro突然不亮了
  19. 中国交通运输发展白皮书
  20. 【杂篇 · 电脑】买Macbook之后的一些记录

热门文章

  1. Python 3学习笔记(16):PyOpenGL之绘制螺纹
  2. 对按时间先后顺序的列表按同一天进行分组
  3. 生产前端控制台报504的解决思路
  4. 【论文笔记】Integrate Point-Cloud Segmentation with 3D LiDAR Scan-Matching for Mobile Robot Localization a
  5. Android Studio执行在vivo手机上出现“应用程序安装异常(-15)”
  6. 《PCI EXPRESS体系结构导读》读书笔记之第 I 篇 PCI体系结构概述(篇前言)
  7. IOS 上传错误itms-90161,无效的配置文件
  8. android 获取网卡mac_在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案...
  9. 物联网智慧养老服务系统开发
  10. Novate:Retrofit2.0和RxJava的又一次完美改进加强(Tamic博客 -CSDN)