0

我在守护程序模式下运行 VW。作为一个独立的可执行文件,它运行得非常好。在守护程序模式下,我最初会看到一些关于预测和选项的信息,但看不到最终结果。不确定到底发生了什么。

这就是我所说的 VW6

/bin64/vw --daemon --num_children 2 -t -i ~/modelbow.vw6 --min_prediction 0 --max_prediction 1 -p stdout  2>&1 

我检查 vw6 运行良好。我使用简单的 php 脚本发送数据(为简洁起见,删除了调试行):

     $fp = fsockopen("localhost",26542, $errno, $errstr, 3);
     $fp_dat = fopen("/tmp/ml.dat", "r");

     $mldata = explode("\n", file_get_contents("/tmp/ml.dat"));

     $mlstr = implode($mldata);

     fwrite($fp, $mlstr);

     $result = trim(fgets($fp, 1024));
     print $result;

上面的打印 $result 什么也不打印。我在标准输出中看到的唯一东西是

num sources = 1
Num weight bits = 28
learning rate = 10
initial_t = 1
power_t = 0.5
decay_learning_rate = 1
predictions = stdout
only testing
average    since       example  example    current  current  current
loss       last        counter   weight      label  predict features

在独立可执行模式下,如果我在没有 -daemon 选项的情况下使用相同型号的相同 dat 文件运行,它最后会很高兴地给出结果

...
...
predictions = stdout
only testing
average    since       example  example    current  current  current
loss       last        counter   weight      label  predict features
1.000000 ba66dfc7a135e2728d08010b40586b90

知道守护程序模式会出现什么问题吗?我也尝试使用 -p /tmp/ 选项...使用 sudo 运行守护程序模式,但没有任何帮助。是否有调试转储选项或详细选项或其他东西来知道到底发生了什么?

谢谢

4

1 回答 1

0

它不工作的原因不是在PHP 客户端代码中,vw而是在 PHP 客户端代码中。

explode在 "\n" 上,去掉换行符。

implode没有glue-string 参数会导致glue-string 默认为空字符串。

结果:换行符被删除。所有示例都合并为一个大示例(并且不完整,因为末尾没有换行符)示例。

vw需要换行符来分隔示例,如果没有它们,它将永远等待第一个示例完成。

所以我认为你需要将 implode 代码行更改为:

$mlstr = implode("\n", $mldata);

让它工作。

您还需要一个额外的结束换行符才能让最后一行通过。

于 2014-03-20T05:55:38.823 回答