XGBoost与Java--加载之前保存为ByteArray[]的升压程序有问题。

问题描述 投票:0回答:1

我试图将boost对象加载到数据库中,因此我没有将其保存到硬盘中的文件中,而是将其保存为字节[]。但现在,忘掉数据库吧,因为我只想把助推器转换为字节[],然后从字节[]中找回助推器。

为了保存,我有一个Boosters的列表。

List<Booster> boosters = <Initialised somewhere else>;

for (Booster booster : model.getBoosters()) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(bos);
    booster.saveModel(out);
    out.close();
    boostersAsByte.add(bos.toByteArray());
}

return boostersAsbyte;

然后我试图从保存的字节[]中检索这些助推器。

List<Booster> boosters = new ArrayList<>();

for (byte[] boosterAsByte : boostersAsbyte) {
    boosters.add(XGBoost.loadModel(new ByteArrayInputStream(boosterAsByte)));
}

return new boosters;

我得到了这个恼人的错误。

ml.dmlc.xgboost4j.java.XGBoostError: [10:21:35] /xgboost/src/gbm/gbm.cc:20: Unknown gbm type

我试过从HDD中的文件中保存和恢复助推器,结果成功了;但是对于我的具体解决方案,我需要用字节[]来保存这些字节到DB中。

任何帮助都将是巨大的感激。谢谢!我想用字节[]来保存这些字节到DB中。

java machine-learning xgboost
1个回答
0
投票

谢谢你的帮助。似乎ObjectInputStream需要一个InputStream而不是byte[]来初始化;但你给了我正确的提示:我不需要使用ObjectOutputStream和初始循环。

for (Booster booster : model.getBoosters()) {
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
        booster.saveModel(bos);
        boostersAsByte.add(bos.toByteArray());
    }
}

这样一切都能正常工作:-)


0
投票

你已经将bootster保存为一个对象(ObjectOutputStream),然后你必须通过ByteArrayInputStream将其读取为一个对象(ObjectInputStream)。例子

List<Booster> boosters = new ArrayList<>();

for (byte[] boosterAsByte : boostersAsbyte) {
    boosters.add(XGBoost.loadModel(new 
     ObjectInputStream(new ByteArrayInputStream(boosterAsByte))));
}

return new boosters;
© www.soinside.com 2019 - 2024. All rights reserved.