首页 > 解决方案 > 为什么我的训练模型输出对于每个随机输入都是相同的?

问题描述

我在 Python 平台上训练了我的模型。训练后,我面对每个随机输入的相同输出。我通过使用该方法停用 BatchNorm 层解决了这个问题model.eval()。但是当我尝试使用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} ]

标签: pythonc++deep-learningpytorch

解决方案


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


推荐阅读