在 pytorch 上使用 MC Dropout 测量不确定性

2023-11-25

我正在尝试在 Pytorch 上使用 Mc Dropout 实现贝叶斯 CNN, 主要思想是,通过在测试时应用 dropout 并运行多次前向传递,您可以从各种不同的模型中获得预测。 我发现了 Mc Dropout 的应用,但我真的不明白他们是如何应用这种方法的,以及他们到底是如何从预测列表中选择正确的预测的

这是代码


 def mcdropout_test(model):
    model.train()
    test_loss = 0
    correct = 0
    T = 100
    for data, target in test_loader:
        if args.cuda:
            data, target = data.cuda(), target.cuda()
        data, target = Variable(data, volatile=True), Variable(target)
        output_list = []
        for i in xrange(T):
            output_list.append(torch.unsqueeze(model(data), 0))
        output_mean = torch.cat(output_list, 0).mean(0)
        test_loss += F.nll_loss(F.log_softmax(output_mean), target, size_average=False).data[0]  # sum up batch loss
        pred = output_mean.data.max(1, keepdim=True)[1]  # get the index of the max log-probability
        correct += pred.eq(target.data.view_as(pred)).cpu().sum()

    test_loss /= len(test_loader.dataset)
    print('\nMC Dropout Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))


    train()
    mcdropout_test()

我已经更换了

data, target = Variable(data, volatile=True), Variable(target)

通过增加

with torch.no_grad():一开始

这就是我定义 CNN 的方式

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 192, 5, padding=2)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(192, 192, 5, padding=2)
        self.fc1 = nn.Linear(192 * 8 * 8, 1024)
        self.fc2 = nn.Linear(1024, 256)
        self.fc3 = nn.Linear(256, 10)
        self.dropout = nn.Dropout(p=0.3)
        
        nn.init.xavier_uniform_(self.conv1.weight)
        nn.init.constant_(self.conv1.bias, 0.0)
        nn.init.xavier_uniform_(self.conv2.weight)
        nn.init.constant_(self.conv2.bias, 0.0)
        nn.init.xavier_uniform_(self.fc1.weight)
        nn.init.constant_(self.fc1.bias, 0.0)
        nn.init.xavier_uniform_(self.fc2.weight)
        nn.init.constant_(self.fc2.bias, 0.0)
        nn.init.xavier_uniform_(self.fc3.weight)
        nn.init.constant_(self.fc3.bias, 0.0)


    def forward(self, x):
        x = self.pool(F.relu(self.dropout(self.conv1(x))))  # recommended to add the relu
        x = self.pool(F.relu(self.dropout(self.conv2(x))))  # recommended to add the relu
        x = x.view(-1, 192 * 8 * 8)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(self.dropout(x)))
        x = self.fc3(self.dropout(x))  # no activation function needed for the last layer
        return x

谁能帮助我在 CNN 上正确实现 Monte Carlo Dropout 方法?


在 Pytorch 中实现 MC Dropout 很容易。所需要做的就是将模型的 dropout 层设置为训练模式。这允许在不同的前向传递期间使用不同的漏失掩模。下面是 Pytorch 中 MC Dropout 的实现,说明了如何将来自各种前向传递的多个预测堆叠在一起并用于计算不同的不确定性度量。

import sys

import numpy as np

import torch
import torch.nn as nn

def enable_dropout(model):
    """ Function to enable the dropout layers during test-time """
    for m in model.modules():
        if m.__class__.__name__.startswith('Dropout'):
            m.train()

def get_monte_carlo_predictions(data_loader,
                                forward_passes,
                                model,
                                n_classes,
                                n_samples):
    """ Function to get the monte-carlo samples and uncertainty estimates
    through multiple forward passes

    Parameters
    ----------
    data_loader : object
        data loader object from the data loader module
    forward_passes : int
        number of monte-carlo samples/forward passes
    model : object
        keras model
    n_classes : int
        number of classes in the dataset
    n_samples : int
        number of samples in the test set
    """

    dropout_predictions = np.empty((0, n_samples, n_classes))
    softmax = nn.Softmax(dim=1)
    for i in range(forward_passes):
        predictions = np.empty((0, n_classes))
        model.eval()
        enable_dropout(model)
        for i, (image, label) in enumerate(data_loader):
            image = image.to(torch.device('cuda'))
            with torch.no_grad():
                output = model(image)
                output = softmax(output)  # shape (n_samples, n_classes)
            predictions = np.vstack((predictions, output.cpu().numpy()))

        dropout_predictions = np.vstack((dropout_predictions,
                                         predictions[np.newaxis, :, :]))
        # dropout predictions - shape (forward_passes, n_samples, n_classes)

    # Calculating mean across multiple MCD forward passes 
    mean = np.mean(dropout_predictions, axis=0)  # shape (n_samples, n_classes)

    # Calculating variance across multiple MCD forward passes 
    variance = np.var(dropout_predictions, axis=0)  # shape (n_samples, n_classes)

    epsilon = sys.float_info.min
    # Calculating entropy across multiple MCD forward passes 
    entropy = -np.sum(mean * np.log(mean + epsilon), axis=-1)  # shape (n_samples,)

    # Calculating mutual information across multiple MCD forward passes 
    mutual_info = entropy - np.mean(np.sum(-dropout_predictions * np.log(dropout_predictions + epsilon),
                                           axis=-1), axis=0)  # shape (n_samples,)

继续讨论上面问题中发布的实现,通过首先将模型设置为训练模式(model.train())。请注意,这是不可取的,因为如果模型中存在除 dropout 之外的层(例如批量标准化),预测中将会引入不需要的随机性。因此,最好的方法是将 dropout 层设置为训练模式,如上面的代码片段所示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 pytorch 上使用 MC Dropout 测量不确定性 的相关文章

  • 如何从已安装的云端硬盘文件夹中永久删除?

    我编写了一个脚本 在每次迭代后将我的模型和训练示例上传到 Google Drive 以防发生崩溃或任何阻止笔记本运行的情况 如下所示 drive path drive My Drive Colab Notebooks models if p
  • 在 Pytorch 中估计高斯模型的混合

    我实际上想估计一个以高斯混合作为基本分布的归一化流 所以我有点被火炬困住了 但是 您可以通过估计 torch 中高斯模型的混合来在代码中重现我的错误 我的代码如下 import numpy as np import matplotlib p
  • 如何创建 Keras 层来执行 4D 卷积 (Conv4D)?

    看起来tf nn convolution应该能够进行 4D 卷积 但我无法成功创建 Keras 层来使用此函数 我尝试过使用 KerasLambda层来包裹tf nn convolution功能 但也许其他人有更好的主意 我想利用数据的高维
  • 如何在 PyTorch 中对子集使用不同的数据增强

    如何针对不同的情况使用不同的数据增强 转换 Subset在 PyTorch 中吗 例如 train test torch utils data random split dataset 80000 2000 train and test将具
  • ValueError:使用火炬张量时需要解压的值太多

    对于神经网络项目 我使用 Pytorch 并使用 EMNIST 数据集 已经给出的代码加载到数据集中 train dataset dsets MNIST root data train True transform transforms T
  • Pytorch RuntimeError:“host_softmax”未针对“torch.cuda.LongTensor”实现

    我正在使用 pytorch 来训练模型 但是在计算交叉熵损失时我遇到了运行时错误 Traceback most recent call last File deparser py line 402 in
  • 通过 Caffe 中的层提供数据的多种路径

    我想在 Caffe 中构建一个网络 其中传入的数据最初被分割 分别通过同一组层 最后使用 eltwise 层重新组合 此后 所有部件将作为一个斑点移动 除了学习的参数之外 数据并行移动的网络部分的层配置将是相同的 有没有一种方法可以在 Ca
  • OpenBUGS:伯努利分布中缺失值

    我正在尝试通过 R R2OpenBUGS 使用 OpenBUGS 将观察 时间 建模为随机变量 如果所有观察时间都可用 没有 NA 则一切正常 但如果我将其中一个时间设置为 NA 则什么也不会发生 我使用 WinBUGS 测试了相同的代码
  • 如何理解SpatialDropout1D以及何时使用它?

    偶尔我会看到一些模型正在使用SpatialDropout1D代替Dropout 例如 在词性标记神经网络中 他们使用 model Sequential model add Embedding s vocabsize EMBED SIZE i
  • pymc 对多个变量进行观察

    我在用着黑客贝叶斯方法线性回归的示例 https nbviewer jupyter org github CamDavidsonPilon Probabilistic Programming and Bayesian Methods for
  • Pytorch .to('cuda') 或 .cuda() 不起作用并且卡住了

    我正在尝试做 pytorch 教程 当我尝试将他们的设备设置为 cuda 时 它不起作用并且我的代码运行被卡住 有关具体信息 我正在使用 conda 环境 蟒蛇3 7 3 火炬1 3 0 cuda 10 2 NVIDIA RTX2080TI
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 按相似度对矩阵进行排序

    我有 100 个矩阵 其中每一行对应一个个体 列对应站点 我想通过相似性度量对行进行排序 以便最相似的个体在矩阵中彼此相邻 我使用 k 近邻按行对矩阵进行排序 并将这些排序的矩阵提供给卷积神经网络 我想知道是否还有其他措施可以完成手头的任务
  • Huggingface 变形金刚模块未被 anaconda 识别

    我正在使用 Anaconda python 3 7 Windows 10 我尝试通过安装变压器https huggingface co transformers https huggingface co transformers 在我的环境
  • 如何将 35 类城市景观数据集转换为 19 类?

    以下是我的代码的一小段 使用它 我可以在城市景观数据集上训练名为 lolnet 的模型 但数据集包含 35 个类别 标签 0 34 imports trainloader torch utils data DataLoader datase
  • 如何使用 TFlearn 中的 ImageAugmentation 训练 CNN 中的图像和数据混合

    我想使用图像 像素信息 和数据的混合在 Tflearn Tensorflow 中训练卷积神经网络 由于我的图像数量较少 因此我需要使用图像增强来增加传递到网络的图像样本数量 但这意味着我只能传递图像数据作为输入数据 必须在稍后阶段 大概在全
  • 使用 Huggingface 变压器仅保存最佳权重

    目前 我正在使用 Huggingface transformers 构建一个新的基于 Transformer 的模型 其中注意力层与原始模型不同 我用了run glue py检查我的模型在 GLUE 基准测试上的性能 但是 我发现huggi
  • 如何从 PyTorch 模型的特定层获取输出?

    如何从预训练的 PyTorch 模型 例如 ResNet 或 VGG 中提取特定层的特征 而无需再次进行前向传递 新答案 Edit torchvision v0 11 0 中有一个新功能 允许提取特征 https github com py
  • 根据caffe中的“badness”缩放损失值

    我想根据训练期间 当前预测 与 正确标签 的接近 远近来缩放每个图像的损失值 例如 如果正确的标签是 猫 而网络认为它是 狗 那么惩罚 损失 应该小于网络认为它是 汽车 的情况 我正在做的方式如下 1 我定义了标签之间距离的矩阵 2 将该矩
  • PyTorch 中的后向函数

    我对 pytorch 的后向功能有一些疑问 我认为我没有得到正确的输出 import numpy as np import torch from torch autograd import Variable a Variable torch

随机推荐

  • SceneKit - SCNText 居中不正确

    我尝试在下面的代码中将文本字符串 SCNText 放入框 SCNBox 中 框的大小看起来正确 但文本不在框的右中心 有什么想法或解决方案吗 谢谢 let geoText SCNText string Hello extrusionDept
  • 如何继承泛型虚方法?

    我有以下代码 我想重写基础列表的 Notify 方法 以便能够在列表的修改上创建事件 TDescendantList class TObjectList
  • 为 OAuth 创建签名和随机数 (Ruby)

    我希望从我的应用程序访问 SmugMug 的 API 以获取用户的相册和图像 用户已通过 ruby 的 OmniAuth 进行身份验证 根据SmugMug 的 OAuth API OAuth需要六个参数 我可以使用 OmniAuth 获取令
  • 添加最少数量的字符来形成回文

    问题 给定任何字符串 添加尽可能少的字符 使其在线性时间内成为回文 I m only able to come up with a O N2 solution 有人可以帮我解决 O N 问题吗 恢复字符串 使用修改过的高德莫里斯普拉特查找最
  • 零长度正则表达式和无限匹配?

    在试图详细阐述答案时this问题 我现在正在尝试了解零长度正则表达式的行为 含义 我经常使用 www regexr com 作为测试 调试 了解正则表达式中发生的情况的游乐场 所以我们有这个最平庸的场景 正则表达式是a 输入字符串是dgwa
  • 如何将动态对象序列化为xml C#

    我有一个object System Collections Generic List 其中包含 1000object DynamicData 在它的内部 每个都有 4 个键和值 还有一个List里面有 2 个键和值 我需要将此对象序列化为
  • 为什么使用匿名类型可以工作,而使用显式类型却不能在 GroupBy 中使用?

    我有一个问题 我希望组类型是强类型的 但如果我这样做 它就不能正确分组 请参阅下面的代码 using System using System Collections Generic using System Linq namespace C
  • Rails & Devise:设计未显示在 Rails 控制台中的特定列

    我正在尝试在我的用户模型上使用 Devise 但是当我进入 Rails 控制台并尝试时User new我只得到 irb main 002 0 gt User new gt
  • 反思获取代表信息

    通过执行以下命令我可以获得有关方法的信息 Type t typeof someType MemberInfo mInfo t GetMethods 如何获取有关类型内声明的委托的信息 Call Type GetNestedTypes获取嵌套
  • 升级 haskell 堆栈使用的 ghc 版本

    我正在尝试将我为 haskell stack 安装的 ghc 版本从版本 8 0 2 更新到 8 2 1 但似乎我丢失了一些东西 user localhost stack resolver ghc 8 2 1 setup stack wil
  • 计算矩阵中一点与所有其他点之间的距离

    我是Python新手 我需要实现一个聚类算法 为此 我需要计算给定输入数据之间的距离 考虑以下输入数据 1 2 8 7 4 2 9 1 7 0 1 5 6 4 3 我希望在这里实现的是 我想计算 1 2 8 与所有其他点的距离 并找到距离最
  • 线程安全对象 - 静态还是非静态?

    我最近在接受采访 技术人员问我如何使应用程序线程安全 嗯 解释完之后lock 正确的是 他说让物体保持静态并不是一个好主意 private static readonly object syncLock new object 他声称原因是静
  • 使用 HTML5 数据属性的 CSS 值[重复]

    这个问题在这里已经有答案了 width attr data width 我想知道是否有任何方法可以使用 HTML5 设置 css 值data 属性的设置方式与设置 css 的方式相同content 目前它不起作用 HTML div div
  • JAXB 无法生成 XBRL 的 Java 类

    我正在尝试为 XBRL 中定义的类型生成 Java 类 我的构建过程基于 Maven 2 以下是我的试验 我只粘贴build部分 它依赖于一些属性 package是我的目标包的名称 catalog是目录的路径和文件名 因为我没有互联网连接
  • 以编程方式设置网页的默认缩放?

    是否可以在网站上设置默认缩放级别 例如 我可以编码吗my site比如当用户打开它时它会缩放到 125 我的网站主体有这个代码 如何把这个缩放代码放进去 Add zoom 125 到身体风格 body color 536482 backgr
  • 为什么人们将他们的文件命名为index.html?

    我看到很多人在他们的 HTML 文件中使用这个文件名 我想知道为什么 我对 HTML 有点陌生 我还没有学到太多东西 但是当我命名我的 HTML 文件时 我可以随意命名它们 当我搜索 HTML 示例时 我发现它们将其命名为index htm
  • paypal自适应支付IPN中的自定义字段

    我在我的网站中实施了自适应支付 首先 这是标准付款 所以我通过了custom表单中的参数 我在 IPN 中获取它 但我无法找到如何在自适应支付中传递此参数 Thanks Edit 根据 jackvsworld 在 PayPal Adapti
  • 亚音速快死了吗

    我对使用 SubSonic 很感兴趣 我已经下载了它并且到目前为止我很喜欢它 但是看看 github 和 googlegroups 上的活动 它似乎不是很活跃 看起来很像一个即将消亡的项目 tekpub 上没有关于它的视频 而且 Rob 这
  • 在 Kivy 中显示 numpy 数组

    首先 我对 kivy 完全陌生 所以我有点挣扎 我正在尝试在 kivy 窗口中显示 numpy 数组 到目前为止 我发现这应该使用纹理类 http kivy org docs api kivy graphics texture html 由
  • 在 pytorch 上使用 MC Dropout 测量不确定性

    我正在尝试在 Pytorch 上使用 Mc Dropout 实现贝叶斯 CNN 主要思想是 通过在测试时应用 dropout 并运行多次前向传递 您可以从各种不同的模型中获得预测 我发现了 Mc Dropout 的应用 但我真的不明白他们是