(已添加此问题的更新.)
我是比利时根特大学的研究生; 我的研究是用深度卷积神经网络进行情感识别.我正在使用Caffe框架来实现CNN.
最近我遇到了关于班级失衡的问题.我正在使用9216个训练样本,约 5%标记为阳性(1),其余样品标记为阴性(0).
我正在使用SigmoidCrossEntropyLoss图层来计算损失.在训练时,即使在几个时期之后,损失也会减少并且准确度非常高.这是由于不平衡:网络总是预测为负(0).(精确度和召回率均为零,支持此声明)
为了解决这个问题,我想根据预测 - 真值组合来衡量对损失的贡献(严厉惩罚假阴性).我的导师/教练还建议我在通过随机梯度下降(sgd)反向传播时使用比例因子:该因子将与批次中的不平衡相关联.仅包含负样本的批次根本不会更新权重.
我只向Caffe添加了一个自定义图层:报告其他指标,如精度和召回.我对Caffe代码的经验有限,但我有很多编写C++代码的专业知识.
任何人都可以帮助我或指出我如何调整SigmoidCrossEntropyLoss和Sigmoid层以适应以下变化:
提前致谢!
我按照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个时期后的结果)
是否::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?
std=c++17作为唯一的编译器标志编译的代码片段...
问题:这是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++ 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++标准中引用一个明确证实或否认上述场景中未定义行为的引用.
我的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++并发实验扩展,发现新的同步类latch,barrier和flex_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)
有关value或num_threads参数的以下说明:
value - 内部计数器的初始值; 必须是非负面的
num_threads - 屏障的参与线程数; 必须是非负面的
num_threads - flex_barrier的参与线程数; 必须是非负面的
所有三个构造函数都接受一个类型的参数std::ptrdiff_t,它是一个有符号整数类型.然后文档明确声明该值必须是非负的.
我的问题:选择std::ptrdiff_t类型作为参数类型而不是无符号整数类型的理由是什么std::size_t.在我看来,使用无符号整数类型更安全,因为永远不会使用无效的参数值调用构造函数.
我知道当前的定义是实验性的并且倾向于改变,但是,当前的参数类型被明确地选择为有符号整数类型.所以背后一定有某种想法,不是吗?