为什么我的训练模型输出对于每个随机输入都是相同的?

Why my trained model output is same for each random input?

我在 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} ]

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