小编ihe*_*eap的帖子

使用libc ++ regex库匹配"行首"(C++ 11)

我希望匹配所有以给定单词开头的行,比如iheap.如果我没有弄错,正则表达式(在ECMAScript语法中)"^iheap.*"应该可以解决问题.但是,当我使用libc ++的正则表达式库在C++ 11中测试它时,只匹配第一行.所以"^..."似乎只匹配输入的开头而不是开头的行.

这是一个例子:

#include <string>
#include <regex>
#include <iostream>

using namespace std;

int main() {
        regex rx("^iheap.*");
        string s = "iheap says hello.\niheap says hello again.\n";
        cout << s << regex_replace(s, rx, "IHEAP");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

iheap says hello.
iheap says hello again.
IHEAP
iheap says hello again.
Run Code Online (Sandbox Code Playgroud)

这是libc ++的错误还是我做错了什么?谢谢!

注意:我使用的是Mac OS X Mountain Lion和Apple LLVM Compiler 4.0(基本上是clang 3.1 SVN的快照).

c++ regex clang c++11 libc++

11
推荐指数
1
解决办法
2907
查看次数

对operator +和/或operator + =使用移动语义是否有意义?

我想知道在重载operator +和/或operator + =时使用移动语义是什么样的情况.即使在这个问题中解释了如何做到这一点,我也无法理解为什么要这样做.我们考虑运算符+ =.如果我只是通过引用右侧传递并在左侧对象上进行适当的更改,则无论如何都没有不必要的副本.所以我们回到同一点:在这种情况下移动语义是否有益?

c++ move operator-overloading c++11

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

与(N)RVO一起有效地使用移动语义

假设我想实现一个应该处理对象并返回一个新的(可能已更改的)对象的函数.我想在C + 11中尽可能高效地做到这一点.环境如下:

class Object {
    /* Implementation of Object */
    Object & makeChanges();
};
Run Code Online (Sandbox Code Playgroud)

我想到的替代方案是:

// First alternative:
Object process1(Object arg) { return arg.makeChanges(); }
// Second alternative:
Object process2(Object const & arg) { return Object(arg).makeChanges(); }
Object process2(Object && arg) { return std::move(arg.makeChanges()); }
// Third alternative:
Object process3(Object const & arg) { 
    Object retObj = arg; retObj.makeChanges(); return retObj; 
}
Object process3(Object && arg) { std::move(return arg.makeChanges()); }
Run Code Online (Sandbox Code Playgroud)

注意:我想使用包装函数,process()因为它将执行一些其他工作,我希望尽可能多地重用代码.

更新:

我使用makeChanges()带有给定签名的,因为我正在处理的对象提供了具有该类型签名的方法.我猜他们用它来进行方法链接.我还修复了提到的两个语法错误.谢谢你指出这些.我还添加了第三种替代方案,我将在下面提出问题.

使用clang [ie …

c++ move-semantics return-value-optimization c++11

5
推荐指数
1
解决办法
1655
查看次数

具有对数损失的Tensorflow单S形输出与具有稀疏softmax交叉熵损失的两个线性输出用于二进制分类

我正在尝试TensorFlow中的二进制分类器实现.如果我在最后一层有两个普通输出(即没有激活)并使用tf.losses.sparse_softmax_cross_entropy,我的网络按预期进行训练.但是,如果我更改输出层以产生具有tf.sigmoid激活的单个输出并tf.losses.log_loss用作损失函数,则我的网络不会进行训练(即丢失/准确度不会提高).

这是我的输出图层/丢失函数在第一个(即工作)情况下的样子:

out = tf.layers.dense(prev, 2)
loss = tf.losses.sparse_softmax_cross_entropy(labels=y, logits=out)
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我有以下内容:

out = tf.layers.dense(prev, 1, activation=tf.sigmoid)
loss = tf.losses.log_loss(labels=y, predictions=out)
Run Code Online (Sandbox Code Playgroud)

张量y0/ 1值的向量; 它不是一个热门的编码.网络在第一种情况下按预期学习,但在第二种情况下不学习.除了这两行之外,其他一切都保持不变.

我不明白为什么第二次设置不起作用.有趣的是,如果我在Keras中表达相同的网络并使用第二个设置,它就可以工作.我是否使用了错误的TensorFlow函数来表达我在第二种情况下的意图?我想生成一个sigmoid输出并使用二进制交叉熵损失来训练一个简单的二元分类器.

我正在使用Python 3.6和TensorFlow 1.4.

是一个用于演示该问题的小型可运行Python脚本.请注意,您需要从Kaggle下载StatOil/C-CORE数据集才能够按原样运行脚本.

谢谢!

classification machine-learning tensorflow

5
推荐指数
1
解决办法
1048
查看次数