小编Maa*_*lis的帖子

解决阶级失衡问题:缩减对损失和sgd的贡献

(已添加此问题的更新.)

我是比利时根特大学的研究生; 我的研究是用深度卷积神经网络进行情感识别.我正在使用Caffe框架来实现CNN.

最近我遇到了关于班级失衡的问题.我正在使用9216个训练样本,约 5%标记为阳性(1),其余样品标记为阴性(0).

我正在使用SigmoidCrossEntropyLoss图层来计算损失.在训练时,即使在几个时期之后,损失也会减少并且准确度非常高.这是由于不平衡:网络总是预测为负(0).(精确度和召回率均为零,支持此声明)

为了解决这个问题,我想根据预测 - 真值组合衡量对损失的贡献(严厉惩罚假阴性).我的导师/教练还建议我通过随机梯度下降(sgd)反向传播时使用比例因子:该因子将与批次中的不平衡相关联.仅包含负样本的批次根本不会更新权重.

我只向Caffe添加了一个自定义图层:报告其他指标,如精度和召回.我对Caffe代码的经验有限,但我有很多编写C++代码的专业知识.


任何人都可以帮助我或指出我如何调整SigmoidCrossEntropyLossSigmoid层以适应以下变化:

  1. 根据预测 - 真值组合调整样本对总损失的贡献(真阳性,假阳性,真阴性,假阴性).
  2. 根据批次中的不平衡(负数与正数)来衡量随机梯度下降所执行的权重更新.

提前致谢!


更新

按照Shai的建议加入了InfogainLossLayer.我还添加了另一个自定义层,H根据当前批次中的不平衡构建了infogain矩阵.

目前,矩阵配置如下:

H(i, j) = 0          if i != j
H(i, j) = 1 - f(i)   if i == j (with f(i) = the frequency of class i in the batch)
Run Code Online (Sandbox Code Playgroud)

我计划将来为矩阵试验不同的配置.

我已经用10:1的不平衡测试了这个.结果表明网络现在正在学习有用的东西:( 30个时期后的结果)

  • 准确度约为.~70%(低于~97%);
  • 精度约为 ~20%(从0%起);
  • 召回是约.~60%(从0%上调). …

c++ machine-learning neural-network deep-learning caffe

32
推荐指数
1
解决办法
7921
查看次数

给定处理器缓存,Windows中页面写跟踪的可靠性如何

是否::GetWriteWatch总是给出修改过的页面的最新列表?还是由于处理器缓存而使某些页面仍被认为是未修改的,因为缓存的写入尚未刷新到主内存?


考虑以下C ++代码片段:

auto ptr = ::VirtualAlloc(NULL, 8192, MEM_COMMIT | MEM_RESERVE, MEM_WRITE_WATCH);
auto num = new (ptr) int{};
::ResetWriteWatch(ptr, 8192);

// ... calculations that involve writing to 'num' ...

::GetWriteWatch(/* ... */);
Run Code Online (Sandbox Code Playgroud)

这将保留并提交两页虚拟内存,修改第一页,最后请求所有已修改的页。

是否可以确保通过调用将首页列出为已修改::GetWriteWatch

c++ windows winapi

12
推荐指数
2
解决办法
166
查看次数

Clang无法在std :: function实例化中扩展参数包

std=c++17作为唯一的编译器标志编译的代码片段...

  • ...使用GCC 9.1成功编译。哥德宝
  • ...发出Clang 8.0.0的编译器错误(代码段下方的错误)。哥德宝

问题:这是Clang编译器中的错误,还是GCC接受此代码是否错误?还是其他原因?

#include <functional>
#include <tuple>

template <typename... Ts>
struct Foo
{
    template <typename T>
    using Int = int;

    // Function that accepts as many 'int' as there are template parameters
    using Function = std::function< void(Int<Ts>...) >;

    // Tuple of as many 'int' as there are template parameters
    using Tuple = std::tuple< Int<Ts>... >;

    auto bar(Function f)
    {
        std::apply(f, Tuple{}); // Error with Clang 8.0.0
    }
};

int main()
{
    auto foo …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang variadic-templates c++17

12
推荐指数
1
解决办法
199
查看次数

在共享模式下锁定的std :: shared_mutex上调用unlock

C++ 17引入了这种std::shared_mutex类型.我一直在查看有关CppReference的文档,特别感兴趣的是产生未定义行为的情况.

在阅读两种解锁方法(一种用于释放独占所有权,一种用于释放共享所有权)的同时,我注意到文档在某种程度上有点模糊.

因为std::shared_mutex::unlock_shared,文件说明(强调我的):

必须在共享模式下由当前执行线程锁定互斥锁,否则,行为未定义.

清楚地表明,unlock_shared必须在调用之前调用,lock_shared因为这是在共享模式下锁定互斥锁的唯一方法.

因为std::shared_mutex::unlock,文件说明:

必须通过当前执行线程锁定互斥锁,否则,行为未定义.

在调用之前,没有提到当前执行线程必须保持的访问级别unlock.这让我想知道它是否也能够释放共享所有权以及独家所有权.

我的问题:是否未定义的行为是std::shared_mutex通过调用来释放a的共享所有权unlock而不是unlock_shared

如果可能的话,我想从C++标准中引用一个明确证实或否认上述场景中未定义行为的引用.

c++ multithreading mutex language-lawyer

6
推荐指数
1
解决办法
1076
查看次数

为什么std :: any没有unsafe_any_cast?

我的Boost标头的本地版本(1.56.0)定义了以下函数boost/any.hpp,逐字复制:

// Note: The "unsafe" versions of any_cast are not part of the
// public interface and may be removed at any time. They are
// required where we know what type is stored in the any and can't
// use typeid() comparison, e.g., when our types may travel across
// different shared libraries.
template<typename ValueType>
inline ValueType * unsafe_any_cast(any * operand) BOOST_NOEXCEPT
{
    return &static_cast<any::holder<ValueType> *>(operand->content)->held;
}

template<typename ValueType>
inline const ValueType * unsafe_any_cast(const any * operand) …
Run Code Online (Sandbox Code Playgroud)

c++ boost c++17 stdany

3
推荐指数
1
解决办法
348
查看次数

标准实验闩锁和屏障使用ptrdiff_t

我一直在寻找在C++并发实验扩展,发现新的同步类latch,barrierflex_barrier.它们都实现了标准屏障,可以单独使用,也可以重复使用.

当前文档为其构造函数声明了以下签名:

explicit latch( ptrdiff_t value );
explicit barrier( std::ptrdiff_t num_threads );
explicit flex_barrier( std::ptrdiff_t num_threads );
Run Code Online (Sandbox Code Playgroud)

有关valuenum_threads参数的以下说明:

value - 内部计数器的初始值; 必须是非负面的

num_threads - 屏障的参与线程数; 必须是非负面的

num_threads - flex_barrier的参与线程数; 必须是非负面的


所有三个构造函数都接受一个类型的参数std::ptrdiff_t,它是一个有符号整数类型.然后文档明确声明该值必须是非负的.

我的问题:选择std::ptrdiff_t类型作为参数类型而不是无符号整数类型的理由是什么std::size_t.在我看来,使用无符号整数类型更安全,因为永远不会使用无效的参数值调用构造函数.

我知道当前的定义是实验性的并且倾向于改变,但是,当前的参数类型被明确地选择为有符号整数类型.所以背后一定有某种想法,不是吗?

c++ concurrency c++-standard-library

2
推荐指数
1
解决办法
320
查看次数