一文读懂 .NET 平台上的机器学习与深度学习框架选型
在机器学习和深度学习领域,Python 长期占据主导地位。然而,对于企业级 .NET 应用开发者而言,在现有技术栈中集成机器学习能力是一种自然的需求。本文将深入分析 GitHub 上最受欢迎的 C# 机器学习/深度学习开源框架,帮助你做出正确的技术选型。
| 排名 | 项目 | Stars | 类型 | 维护状态 | 核心定位 |
|---|---|---|---|---|---|
| 1 | **ML.NET** | 9.3k | 原生ML框架 | ✅ 活跃 | 微软官方,企业级ML |
| 2 | **Accord.NET** | 4.6k | 原生ML框架 | ❌ 已归档 | 传统ML算法库 |
| 3 | **TensorFlow.NET** | 3.4k | TF绑定 | ⚠️ 维护模式 | TensorFlow的.NET实现 |
| 4 | **BotSharp** | 3.0k | AI Agent框架 | ✅ 活跃 | 企业级多智能体系统 |
| 5 | **TensorFlowSharp** | 3.2k | TF绑定 | ❌ 已归档 | TensorFlow C API绑定 |
| 6 | **TorchSharp** | 1.8k | PyTorch绑定 | ✅ 活跃 | PyTorch的.NET实现 |
| 7 | **Infer.NET** | 1.6k | 概率编程 | ✅ 活跃 | 贝叶斯推断框架 |
ML.NET 采用管道式(Pipeline)架构,核心设计理念是让 .NET 开发者无需 ML 专业知识即可构建机器学习应用。
┌─────────────────────────────────────────────────────────────────┐
│ ML.NET 架构图 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ MLContext (入口点) │
│ │ │
│ ├── DataOperationsCatalog (数据加载/保存) │
│ ├── TransformsCatalog (数据转换) │
│ ├── BinaryClassificationCatalog │
│ ├── MulticlassClassificationCatalog │
│ ├── RegressionCatalog │
│ ├── ClusteringCatalog │
│ ├── AnomalyDetectionCatalog │
│ ├── RecommendationCatalog │
│ └── TimeSeriesCatalog │
│ │
│ 管道流程: │
│ IDataView → IEstimator → ITransformer → PredictionEngine │
│ │
└─────────────────────────────────────────────────────────────────┘
| 组件 | 作用 |
|---|---|
| **MLContext** | 所有 ML.NET 操作的入口点,类似 EF 的 DbContext |
| **IDataView** | 核心数据抽象,延迟加载、列式存储、线程安全 |
| **IEstimator** | 转换器或训练器的蓝图 |
| **ITransformer** | 训练后的模型,可对数据进行转换 |
| **PredictionEngine** | 单次预测的便捷 API |
分类任务:
ML.NET 提供三种 AutoML 工具:
// 代码式 AutoML
var experiment = mlContext.Auto()
.CreateBinaryClassificationExperiment(trainingTimeInSeconds: 60);
var result = experiment.Execute(trainingDataView);
var bestModel = result.BestRun.Model;
Model Builder(Visual Studio 扩展):
mlnet classification --dataset "data.csv" --label-col "Label" --train-time 60
using Microsoft.ML;
using Microsoft.ML.Data;
// 1. 创建 MLContext
var mlContext = new MLContext();
// 2. 加载数据
IDataView trainingData = mlContext.Data
.LoadFromTextFile<SentimentData>(dataPath, hasHeader: true);
// 3. 构建管道
var pipeline = mlContext.Transforms.Text
.FeaturizeText("Features", nameof(SentimentData.Text))
.Append(mlContext.BinaryClassification.Trainers
.LbfgsLogisticRegression("Label", "Features"));
// 4. 训练模型
ITransformer model = pipeline.Fit(trainingData);
// 5. 预测
var engine = mlContext.Model
.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
var prediction = engine.Predict(new SentimentData { Text = "This is great!" });
Console.WriteLine($"预测结果: {prediction.Prediction}, 概率: {prediction.Probability:P}");
// 图像分类(迁移学习)
var pipeline = mlContext.Transforms.LoadImages("Image", "", "ImagePath")
.Append(mlContext.Transforms.ResizeImages("Image", 224, 224))
.Append(mlContext.Transforms.ExtractPixels("Image"))
.Append(mlContext.MulticlassClassification.Trainers.ImageClassification(
new ImageClassificationTrainer.Options()
{
Arch = ImageClassificationTrainer.Architecture.ResnetV2101,
MetricsCallback = metrics => Console.WriteLine(metrics)
}))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
CausalLMPipelineChatClient 支持TensorFlow.NET 通过 P/Invoke 绑定到 TensorFlow 的原生 C API,提供与 Python TensorFlow 几乎相同的 API 体验。
┌─────────────────────────────────────────────────────────────────┐
│ TensorFlow.NET 架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ TensorFlow.Keras (高级 API) │
│ ├── Sequential API │
│ ├── Functional API │
│ └── Subclassing API │
│ │
│ TensorFlow.NET (核心绑定) │
│ ├── P/Invoke 声明 │
│ ├── Tensor 操作 │
│ └── 会话管理 │
│ │
│ SciSharp.TensorFlow.Redist (原生库) │
│ └── TensorFlow C Library │
│ │
└─────────────────────────────────────────────────────────────────┘
Sequential API:
var model = keras.Sequential();
model.add(keras.layers.Dense(64, activation: "relu", input_shape: (784,)));
model.add(keras.layers.Dense(64, activation: "relu"));
model.add(keras.layers.Dense(10, activation: "softmax"));
model.compile(optimizer: "adam", loss: "sparse_categorical_crossentropy");
model.fit(x_train, y_train, epochs: 5);
Functional API(ResNet 示例):
var inputs = keras.Input(shape: (32, 32, 3), name: "img");
var x = layers.Conv2D(32, 3, activation: "relu").Apply(inputs);
var x = layers.Conv2D(64, 3, activation: "relu").Apply(x);
var block_1_output = layers.MaxPooling2D(3).Apply(x);
// 残差连接
x = layers.Conv2D(64, 3, activation: "relu", padding: "same").Apply(block_1_output);
x = layers.Conv2D(64, 3, activation: "relu", padding: "same").Apply(x);
var block_2_output = layers.Add().Apply(new Tensors(x, block_1_output));
var outputs = layers.Dense(10).Apply(x);
var model = keras.Model(inputs, outputs, name: "toy_resnet");
Eager 模式(默认):
tf.enable_eager_execution();
var W = tf.Variable(-0.06f, name: "weight");
var b = tf.Variable(-0.73f, name: "bias");
using var g = tf.GradientTape();
var pred = W * X + b;
var loss = tf.reduce_sum(tf.pow(pred - Y, 2)) / (2 * n_samples);
var gradients = g.gradient(loss, (W, b));
optimizer.apply_gradients(zip(gradients, (W, b)));
| 特性 | Eager 模式 | Graph 模式 |
|---|---|---|
| 执行方式 | 立即执行 | 延迟执行(会话) |
| 调试 | 简单 | 需要 TensorBoard |
| 性能 | 稍慢 | 生产优化 |
| 用途 | 研究、训练 | 生产推理 |
// 检查 GPU
var gpus = tf.config.list_physical_devices("GPU");
Console.WriteLine($"可用 GPU 数量: {gpus.Length}");
| 平台 | CPU 包 | GPU 包 |
|---|---|---|
| Windows | SciSharp.TensorFlow.Redist | SciSharp.TensorFlow.Redist-Windows-GPU |
| Linux | SciSharp.TensorFlow.Redist | SciSharp.TensorFlow.Redist-Linux-GPU |
TorchSharp 通过四层架构连接 .NET 和 PyTorch:
┌─────────────────────────────────────────────────────────────────┐
│ Layer 1: Managed .NET API (C#/F#) │
│ - Tensor 类、nn.Module、优化器 │
├─────────────────────────────────────────────────────────────────┤
│ Layer 2: P/Invoke Bridge │
│ - extern 方法声明、类型封送 │
├─────────────────────────────────────────────────────────────────┤
│ Layer 3: Native C++ (LibTorchSharp) │
│ - THSTensor_*, THSNN_* 包装函数 │
├─────────────────────────────────────────────────────────────────┤
│ Layer 4: LibTorch (PyTorch C++ Backend) │
│ - at::Tensor 操作、CUDA 内核、Autograd 引擎 │
└─────────────────────────────────────────────────────────────────┘
// Tensor 创建
var zeros = torch.zeros(3, 4);
var ones = torch.ones(2, 3, 4);
var randn = torch.randn(64, 1000);
var fromArray = torch.tensor(new[] { 1, 2, 3 });
// GPU 支持
var cudaTensor = torch.randn(10).cuda();
// Autograd 自动微分
var x = torch.randn(3, 4, requires_grad: true);
var y = torch.randn(3, 4, requires_grad: true);
var z = x * 2 + y;
var loss = z.pow(2).sum();
loss.backward();
Console.WriteLine($"∂loss/∂x = {x.grad()}");
Console.WriteLine($"∂loss/∂y = {y.grad()}");
using TorchSharp;
using static TorchSharp.torch.nn;
public class MNISTModel : Module<Tensor, Tensor>
{
private readonly Module<Tensor, Tensor> conv1, conv2, fc1, fc2;
public MNISTModel() : base("MNIST")
{
conv1 = Conv2d(1, 32, kernelSize: 3, stride: 1);
conv2 = Conv2d(32, 64, kernelSize: 3, stride: 1);
fc1 = Linear(9216, 128);
fc2 = Linear(128, 10);
RegisterComponents(); // 必须调用!
}
public override Tensor forward(Tensor input)
{
using var x1 = conv1.forward(input);
using var x2 = relu(x1);
using var x3 = max_pool2d(x2, 2);
using var x4 = conv2.forward(x3);
using var x5 = relu(x4);
using var x6 = max_pool2d(x5, 2);
using var x7 = flatten(x6, 1);
using var x8 = fc1.forward(x7);
using var x9 = relu(x8);
return log_softmax(fc2.forward(x9), dim: 1);
}
}
TorchSharp 提供独特的内存管理模式:
// 推荐模式:DisposeScope
using (var d = torch.NewDisposeScope())
{
var result = complexComputation();
return result.MoveToOuterDisposeScope(); // 保留结果
} // 其他中间张量自动释放
// Sequential 构建
var model = Sequential(
("conv1", Conv2d(1, 32, kernelSize: 3)),
("relu1", ReLU()),
("pool1", MaxPool2d(2)),
("flatten", Flatten()),
("fc1", Linear(32 * 13 * 13, 128)),
("fc2", Linear(128, 10))
);
using static TorchSharp.torchvision.transforms;
var transform = transforms.Compose(
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ConvertImageDtype(torch.ScalarType.Float32),
transforms.Normalize(
mean: new[] { 0.485f, 0.456f, 0.406f },
std: new[] { 0.229f, 0.224f, 0.225f })
);
// 加载预训练模型
var resnet = torchvision.models.resnet18(
numClasses: 1000,
weights: torchvision.models.ResNet18_Weights.IMAGENET1K_V1
);
BotSharp 是专为 .NET 设计的AI 多智能体框架,采用插件化架构:
┌─────────────────────────────────────────────────────────────────┐
│ BotSharp 架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 用户请求 → Router Agent → Task Agent(s) → LLM Provider │
│ │
│ 核心模块: │
│ ├── Plugin Loader (插件加载器) │
│ ├── Hook System (钩子系统) │
│ ├── Agent Profile (智能体配置) │
│ ├── Conversation & State (会话状态管理) │
│ ├── Routing & Planning (路由规划) │
│ ├── Templating (Liquid 模板) │
│ └── LLM Provider Abstraction (LLM 提供者抽象) │
│ │
└─────────────────────────────────────────────────────────────────┘
| 提供者 | 插件包 |
|---|---|
| Azure OpenAI | BotSharp.Plugin.AzureOpenAI |
| OpenAI (GPT-4o/o1) | BotSharp.Plugin.OpenAI |
| Anthropic Claude | BotSharp.Plugin.AnthropicAI |
| Google Gemini | BotSharp.Plugin.GoogleAI |
| DeepSeek V3 | BotSharp.Plugin.DeepSeekAI |
| Meta LLaMA | BotSharp.Plugin.LLamaSharp |
| HuggingFace | BotSharp.Plugin.HuggingFace |
// 知识库配置
// 通过 API 上传文档:POST /knowledge/{agentId}
// RAG 组件:
// - BotSharp.Plugin.KnowledgeBase (核心知识管理)
// - BotSharp.Plugin.Qdrant (向量数据库)
// - 文本嵌入: fastText, LLamaSharp, BERT
BotSharp 在 r5.0 版本中添加了 MCP 集成:
| 渠道 | 插件包 |
|---|---|
| Twilio (语音/SMS) | BotSharp.Plugin.Twilio |
| Facebook Messenger | BotSharp.Plugin.MetaMessenger |
| Telegram | BotSharp.Plugin.TelegramBots |
| 微信 | BotSharp.Plugin.WeChat |
| Web/WebSocket | BotSharp.Plugin.ChatHub |
namespace BotSharp.Plugin.PizzaBot;
public class PizzaBotPlugin : IBotSharpPlugin
{
public void RegisterDI(IServiceCollection services, IConfiguration config)
{
services.AddScoped<IFunctionCallback, MakePaymentFn>();
services.AddScoped<IAgentHook, PizzaBotAgentHook>();
}
}
// 函数定义 (JSON)
{
"name": "make_payment",
"description": "call this function to make payment",
"visibility_expression": "{% if states.order_number != empty %}visible{% endif %}",
"parameters": {
"type": "object",
"properties": {
"order_number": { "type": "string", "description": "order number" },
"total_amount": { "type": "string", "description": "total amount" }
},
"required": ["order_number", "total_amount"]
}
}
Infer.NET 是微软开发的概率编程框架,用于贝叶斯推断。与传统的预构建算法不同,你可以定义自己的统计模型。
┌─────────────────────────────────────────────────────────────────┐
│ Infer.NET 架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 模型定义 (用户代码) │
│ │ │
│ ▼ │
│ 模型编译器 (源代码生成) │
│ │ │
│ ▼ │
│ 编译后的算法 │
│ │ │
│ ▼ │
│ 推理引擎 (执行) ← 观测值 (数据) │
│ │ │
│ ▼ │
│ 查询结果 (分布) │
│ │
└─────────────────────────────────────────────────────────────────┘
| 算法 | 特点 | 适用场景 |
|---|---|---|
| **Expectation Propagation (EP)** | 默认算法,零避免 | 通用场景 |
| **Variational Message Passing (VMP)** | 保证收敛,零强制 | 需要稳定性的场景 |
| **Gibbs Sampling** | 随机采样,最终收敛 | 复杂后验分布 |
两枚硬币问题:
using Microsoft.ML.Probabilistic;
using Microsoft.ML.Probabilistic.Models;
Variable<bool> firstCoin = Variable.Bernoulli(0.5);
Variable<bool> secondCoin = Variable.Bernoulli(0.5);
Variable<bool> bothHeads = firstCoin & secondCoin;
InferenceEngine engine = new InferenceEngine();
Console.WriteLine(engine.Infer(bothHeads));
// 输出: Bernoulli(0.25)
TrueSkill 玩家技能评分:
// 玩家技能变量
var playerSkills = Variable.Array<double>(player);
playerSkills[player] = Variable.GaussianFromMeanAndVariance(6, 9).ForEach(player);
// 比赛表现 = 技能 + 噪声
var winnerPerformance = Variable.GaussianFromMeanAndVariance(
playerSkills[winners[game]], 1.0);
var loserPerformance = Variable.GaussianFromMeanAndVariance(
playerSkills[losers[game]], 1.0);
// 约束:获胜者表现更好
Variable.ConstrainTrue(winnerPerformance > loserPerformance);
// 推断
var inferredSkills = inferenceEngine.Infer<Gaussian[]>(playerSkills);
Infer.NET 现在是 ML.NET 的一部分,通过 NuGet 包分发:
Microsoft.ML.ProbabilisticMicrosoft.ML.Probabilistic.CompilerMicrosoft.ML.Probabilistic.LearnersAccord.NET 始于 2007 年,是 .NET 平台上最早的综合机器学习框架之一,于 2020 年 11 月归档。
归档原因:
| 模块 | 功能 |
|---|---|
| Accord.MachineLearning | SVM、神经网络、决策树 |
| Accord.Statistics | 统计分布、假设检验 |
| Accord.Imaging | 计算机视觉、特征检测 |
| Accord.Vision | 人脸检测、目标跟踪 |
| Accord.Audio | 音频信号处理 |
| Accord.Neuro | 深度信念网络、RBM |
// Accord.NET 的学习模式
var learner = new SupportVectorLearning< Gaussian >();
var svm = learner.Learn(inputs, outputs); // 训练
var prediction = svm.Decide(newInput); // 预测
┌─────────────────────────────────────────────────────────────────┐
│ 应用场景光谱 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 传统ML 深度学习 LLM应用 AI Agent │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ML.NET TensorFlow.NET BotSharp BotSharp │
│ Accord.NET TorchSharp │
│ Infer.NET │
│ │
└─────────────────────────────────────────────────────────────────┘
| 特性 | ML.NET | TensorFlow.NET | TorchSharp | BotSharp | Infer.NET |
|---|---|---|---|---|---|
| **原生 .NET** | ✅ | ❌ (绑定) | ❌ (绑定) | ✅ | ✅ |
| **深度学习** | ⚠️ (通过集成) | ✅ | ✅ | ❌ | ❌ |
| **传统 ML** | ✅ | ❌ | ❌ | ❌ | ⚠️ |
| **GPU 支持** | ✅ | ✅ | ✅ | ✅ | ❌ |
| **AutoML** | ✅ | ❌ | ❌ | ❌ | ❌ |
| **可视化工具** | ✅ Model Builder | ❌ | ❌ | ✅ Web UI | ⚠️ |
| **生产就绪** | ✅ | ⚠️ | ✅ | ✅ | ✅ |
| **活跃维护** | ✅ | ⚠️ | ✅ | ✅ | ✅ |
ML.NET(管道式):
var pipeline = mlContext.Transforms.Text.FeaturizeText("Features", "Text")
.Append(mlContext.BinaryClassification.Trainers.FastTree());
var model = pipeline.Fit(data);
TensorFlow.NET(Keras 风格):
var model = keras.Sequential();
model.add(keras.layers.Dense(64, activation: "relu"));
model.compile(optimizer: "adam", loss: "mse");
model.fit(x, y, epochs: 10);
TorchSharp(PyTorch 风格):
public class Net : Module<Tensor, Tensor> {
private Module<Tensor, Tensor> fc1 = Linear(784, 128);
public override Tensor forward(Tensor x) => fc1.forward(x);
}
var model = new Net().to(torch.CUDA);
| 场景 | 推荐框架 | 原因 |
|---|---|---|
| 大规模表格数据 | ML.NET | 内存效率高,Lazy 加载 |
| 图像分类 | TorchSharp / TensorFlow.NET | GPU 加速,预训练模型 |
| NLP 文本分类 | ML.NET (TextClassification) | 内置 NAS-BERT |
| 实时推理 | TorchSharp / TensorFlow.NET | 优化后推理性能好 |
| 概率建模 | Infer.NET | 专门的贝叶斯推断 |
开始选型
│
├── 需要构建 AI Agent / 聊天机器人?
│ └── 是 → BotSharp
│
├── 需要概率编程 / 贝叶斯推断?
│ └── 是 → Infer.NET
│
├── 需要深度学习(自定义网络)?
│ ├── 熟悉 PyTorch? → TorchSharp
│ └── 熟悉 TensorFlow? → TensorFlow.NET
│
├── 需要传统机器学习?
│ ├── 想要 AutoML? → ML.NET
│ ├── 需要图像分类(迁移学习)? → ML.NET
│ └── 通用 ML 任务? → ML.NET
│
└── 维护旧项目?
└── Accord.NET → 考虑迁移到 ML.NET
# 安装 NuGet 包
dotnet add package Microsoft.ML
# 可选:AutoML
dotnet add package Microsoft.ML.AutoML
// 最小示例
var mlContext = new MLContext();
var data = mlContext.Data.LoadFromEnumerable(yourData);
var pipeline = mlContext.Regression.Trainers.Sdca(labelColumnName: "Label");
var model = pipeline.Fit(data);
# CPU 版本
dotnet add package TorchSharp
# GPU 版本 (Windows)
dotnet add package TorchSharp-cuda-windows
# 计算机视觉
dotnet add package TorchVision
using TorchSharp;
using static TorchSharp.torch.nn;
var model = Sequential(
Linear(784, 128),
ReLU(),
Linear(128, 10)
);
var optimizer = optim.Adam(model.parameters(), lr: 0.001f);
dotnet add package TensorFlow.NET
dotnet add package TensorFlow.Keras
dotnet add package SciSharp.TensorFlow.Redist
using static Tensorflow.KerasApi;
var model = keras.Sequential();
model.add(keras.layers.Dense(10, activation: "softmax"));
model.compile(optimizer: "adam", loss: "sparse_categorical_crossentropy");
git clone https://github.com/SciSharp/BotSharp
cd BotSharp
dotnet run --project ./src/WebStarter/WebStarter.csproj
访问 http://localhost:5500 进入管理界面。
| 包名 | 下载量 |
|---|---|
| Microsoft.ML | 500万+ |
| Microsoft.ML.AutoML | 200万+ |
| TensorFlow.NET | 100万+ |
| TorchSharp | 50万+ |
| BotSharp | 10万+ |
SciSharp 组织维护了多个重要的 .NET ML/DL 项目:
| 项目 | 提交频率 | Issue 响应 | 文档质量 |
|---|---|---|---|
| ML.NET | 高 | 快 | 优秀 |
| TorchSharp | 中 | 中 | 良好 |
| TensorFlow.NET | 低 | 慢 | 良好 |
| BotSharp | 高 | 快 | 良好 |
| Infer.NET | 中 | 中 | 优秀 |
| 场景 | 首选 | 备选 |
|---|---|---|
| 企业级传统 ML | **ML.NET** | - |
| 深度学习研究 | **TorchSharp** | TensorFlow.NET |
| 图像/视频处理 | **TorchSharp + TorchVision** | ML.NET (迁移学习) |
| NLP 任务 | **ML.NET (TextClassification)** | TorchSharp |
| AI Agent / Chatbot | **BotSharp** | - |
| 概率建模 | **Infer.NET** | - |
| 快速原型 | **ML.NET AutoML** | - |
| 从 | 到 | 难度 |
|---|---|---|
| Accord.NET | ML.NET | 中 |
| TensorFlowSharp | TensorFlow.NET | 低 |
| Python TensorFlow | TensorFlow.NET | 低 |
| Python PyTorch | TorchSharp | 中 |
本文基于 GitHub 2025 年数据编写,框架版本可能已有更新。建议在实际选型前查阅各项目的最新文档和 Release Notes。
还没有人回复