有天一个非全的同学问我,这个深度学习模型训练后怎么用呢?
我们是不是可以根据深度学习做一些小应用申请软著?
对是的,但是我对C#要熟悉些,那用C#做吧。But,网上的资料太少了!!!!!
下面我给大家介绍下我使用的方面,目前看是通的。
C#模型调用视频
Pytorch模型保存
这里有个坑,不能简单的用torch.save(model.state_dict(), ckpt_path)和torch.save(model,ckpt_path)保存训练好的最优模型,要使用torch.jit.script()。注意:torch.jit.trace()和torch.jit.script()的区别,可以自行搜索。
ckpt_path = os.path.join('outputs/', f'epochb_{epoch}.pt')
x: torch.Tensor = [0, 1, 2, 5, 6, 7, 8]
x = torch.Tensor(x)
x = x.unsqueeze(0)
y: torch.Tensor = [0.7]
traced_script_module = torch.jit.script(model, (x, y))
traced_script_module.save(ckpt_path)
本文的模型,需要两个参数,参数的情况需要查看调用model的时候的传参
在C#中创建winform项目并加载TorchSharp包
我使用最方便的winform来测试。在Visual Studio 2022中创建一个winform项目,然后使用Nuget工具按照TorchSharp包。
调用模型
在默认页面中拖入一个lable(用来显示评分结果)和一个按钮(点击后调用模型进行评分),双击按钮进行按钮响应点击事件代码中。
//加载训练好的模型
var model = torch.jit.load("epochb_1.pt");
torch.Tensor t = torch.rand(1, 456);
using var x = torch.IntTensor(t);
using var y = torch.FloatTensor(0.7);
var output = model.forward(new object[] { x, y });//直接传(x,y)会报错
var score = ((TorchSharp.torch.Tensor)output)[0].ToSingle();//转换为单精度浮点数,
//注意:这一步一定要有
label1.Text = score.ToString();
完整代码
using TorchSharp;
namespace pytorch_test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{ //加载训练好的模型
var model = torch.jit.load("epochb_1.pt");
torch.Tensor t = torch.rand(1, 456);
using var x = torch.IntTensor(t);
using var y = torch.FloatTensor(0.7);
var output = model.forward(new object[] { x, y });//直接传(x,y)会报错
var score = ((TorchSharp.torch.Tensor)output)[0].ToSingle();//转换为单精度浮点数,注意:这一步一定要有
label1.Text = score.ToString();
}
}
}
过程中遇到的错误:
请看我的其他博客