python - 为什么我的训练模型输出对于每个随机输入都是相同的?
问题描述
我在 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} ]
解决方案
我多次调试我的代码并重试保存模型。最后,我找到了答案。我使用服务器来训练我的模型,并将模型导出到 C++,我将 Python Shell 中的模型权重加载到模型对象中。问题就在这里,我应该eval()
在为 C++ 导出模型之前去。C++eval()
不适用于在 Python 中训练的模型。这解决了我的问题。
推荐阅读
- excel - 打开excel文件时复制和重命名工作表
- android - 当我设置 ImageSpan 和 ellipsize 我想看到...和 ImageSpan 全部显示
- c# - 基于俱乐部的一对多用户
- android - BiometricPrompt FACE ID 身份验证在某些设备中不起作用
- flutter - 如何使自定义滑块覆盖颜色与颤动中的拇指颜色不同?
- reactjs - React - 即使组件重新渲染,如何保持状态不变?
- mysql - 如何在 sequelize 的子子模型中添加条件,这会影响我在 findAndCountAll 中的父模型?
- r - 在 R 中的 if_else 语句中组合两个布尔运算符(和或)
- docker - Docker 容器未在 WSL 中启动
- oracle - 如何防止数据库链接到 Oracle 中的同一数据库