C# TorchSharp入门方法 C#如何使用LibTorch进行深度学习

2次阅读

需使用torchsharp库调用libtorch:一、安装torchsharp nuget包并引入cpu/cuda依赖;二、调用torch.initialize()初始化运行时;三、用torch.randn等创建张量并运算;四、用torch.jit.load()加载.pt模型;五、继承module自定义网络并训练。

C# TorchSharp入门方法 C#如何使用LibTorch进行深度学习

如果您希望在C#环境中调用LibTorch原生能力实现深度学习模型的加载、推理或训练,则需借助TorchSharp这一官方支持的.NET绑定库。以下是开展TorchSharp开发的具体路径:

一、安装TorchSharp NuGet包

TorchSharp是.NET平台下对LibTorch的封装,通过NuGet分发预编译的原生二进制与托管API,无需手动配置c++运行时或DLL路径。安装后即可直接使用张量操作、自动微分及模块化模型接口

1、在visual studio中右键项目,选择“管理NuGet程序包”。

2、切换至“浏览”选项卡,搜索TorchSharp

3、勾选“包含预发行版”,找到最新稳定版本(如0.98.2)并点击安装。

4、确认依赖项TorchSharp.CPU或TorchSharp.CUDA被一同引入项目。

二、引用命名空间并验证运行时加载

TorchSharp要求在首次调用任何torch.* API前完成本机库的初始化,该过程由Torch.Initialize()触发,会自动探测CPU或CUDA环境并加载对应LibTorch动态链接库。

1、在Program.cs或启动类顶部添加using语句:using TorchSharp;

2、在Main方法首行插入:Torch.Initialize();

3、执行后检查是否抛出TorchSharp.TorchException,若无异常则表示LibTorch已成功加载。

三、创建张量并执行基础运算

张量是TorchSharp的核心数据结构,所有计算均基于Tensor对象展开。CPU张量默认构造,CUDA张量需显式指定设备;所有运算符重载与numpy风格一致,支持链式调用。

1、声明一个形状为[3, 4]的随机浮点张量:var x = torch.randn(3, 4);

2、对x执行逐元素正弦运算并保存结果:var y = x.sin();

3、打印y的形状与设备信息:console.WriteLine(y.Shape + ” on ” + y.Device);

四、加载预训练pytorch模型(.pt格式)

TorchSharp支持直接加载TorchScript序列化模型(.pt),无需Python环境。模型以ITorchModule形式存在,可像原生C#对象一样调用forward方法,输入输出均为Tensor。

1、确保模型文件model.pt位于输出目录,且生成操作设为“始终复制”。

2、使用torch.jit.load()加载模型:var module = torch.jit.load(“model.pt”);

3、构造输入张量(须与训练时shape/dtype一致):var input = torch.randn(1, 3, 224, 224).to(torch.float32);

4、执行前向传播:var output = module.Forward(input);

五、自定义Module并实现训练循环

通过继承TorchSharp.Modules.Module可定义带可学习参数的神经网络结构。参数自动注册至parameters()集合,配合torch.optim.Adam等优化器即可构建完整训练流程。

1、定义线性分类器类:class LinearClassifier : Module { public LinearClassifier(int inFeatures, int outFeatures) : base(“LinearClassifier”) { … } }

2、在构造函数中声明权重与偏置:this.register_parameter(“weight”, torch.randn(inFeatures, outFeatures));

3、重写forward方法实现计算逻辑:public override Tensor forward(Tensor input) => input.matmul(weight) + bias;

4、实例化模型、损失函数与优化器:var model = new LinearClassifier(784, 10); var lossFn = torch.nn.CrossEntropyLoss(); var opt = torch.optim.Adam(model.parameters(), lr: 1e-3);

text=ZqhQzanResources