【问题标题】:Why my trained model output is same for each random input?为什么我的训练模型输出对于每个随机输入都是相同的?
【发布时间】:2021-12-13 22:44:21
【问题描述】:

我在 Python 平台上训练了我的模型。训练后,我面对每个随机输入的相同输出。我通过使用 model.eval() 方法停用 BatchNorm 层解决了这个问题。但是当我尝试使用Pytorch C++ API 在 C++ 中加载我训练有素的模型时,这个问题再次出现,而model.eval() 此时没有帮助我。我再次面对每个随机输入的相同输出。

这是我的 C++ 模型加载函数:

std::vector<torch::jit::script::Module> module_loader(std::string file_addr) {
    std::vector<torch::jit::script::Module> modul;
    torch::jit::script::Module model = torch::jit::load(file_addr);
    model.eval();
    modul.push_back(model);
    return modul;
}

这是我的测试功能:

void test(std::vector<torch::jit::script::Module> &model) {
    std::vector<torch::jit::IValue> inputs;
    inputs.push_back(torch::rand({1, 2, 64, 172}));
    torch::Tensor output = model[0].forward(inputs).toTensor();
    std::cout << output << std::endl;
}

毕竟,我把它们放在main() 中是这样的:

int main() {
    auto modul = module_loader(MODEL_ADDRESS);
    test(modul);
}

MODEL_ADDRESS 是我本地磁盘上训练模型地址的宏。

程序每次运行的输出都是这样的:

0.3231 [ CPUFloatType{1,1} ]

【问题讨论】:

    标签: python c++ deep-learning pytorch


    【解决方案1】:

    我多次调试我的代码并重试保存模型。最后,我找到了答案。我使用服务器来训练我的模型,为了将模型导出到 C++,我将 Python Shell 中的模型权重加载到模型对象中。问题就在这里,我应该先去eval(),然后再为C++导出模型。 C++ eval() 不适用于在 Python 中训练的模型。这解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多