为什么我的训练模型输出对于每个随机输入都是相同的?
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 中训练的模型。这解决了我的问题。
我在 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 中训练的模型。这解决了我的问题。