C# TensorFlow.NET神经网络模型 获取csv数据拆分训练集和测试集并打印
时间: 2025-07-18 17:48:16 浏览: 6
<think>我们使用TensorFlow.NET(一个TensorFlow的C#绑定)来构建神经网络模型。首先,我们需要安装必要的NuGet包,包括:-TensorFlow.NET-NumSharp(用于类似NumPy的操作)-SciSharp.TensorFlow.Redist(TensorFlow本地库)步骤:1.读取CSV文件:使用`StreamReader`逐行读取,解析数据。2.数据预处理:将数据拆分为特征和标签,并转换为TensorFlow可用的格式(如`NDArray`或`Tensor`)。3.拆分训练集和测试集:按比例拆分(如80%训练,20%测试)。4.构建神经网络模型:使用TensorFlow.NET的API构建模型。5.训练模型:使用训练集训练模型。6.评估模型:使用测试集评估模型性能。7.打印数据集信息:在控制台输出训练集和测试集的基本信息。下面是一个完整的示例代码:</think>以下是使用 C# 和 TensorFlow.NET 构建神经网络模型,从 CSV 文件读取数据、拆分训练集/测试集并打印的完整示例:
```csharp
using System;
using System.IO;
using System.Linq;
using Tensorflow;
using Tensorflow.Keras.Utils;
using static Tensorflow.Binding;
using Tensorflow.Keras.Layers;
using Tensorflow.Keras.Optimizers;
using Tensorflow.Keras.Engine;
class Program
{
static void Main()
{
// 1. 读取CSV数据
var (features, labels) = ReadCsvData("data.csv");
Console.WriteLine($"成功加载数据: {features.shape[0]} 条记录");
// 2. 拆分训练集和测试集 (80%训练, 20%测试)
var splitIndex = (int)(features.shape[0] * 0.8);
var trainFeatures = features[new Slice(0, splitIndex)];
var testFeatures = features[new Slice(splitIndex)];
var trainLabels = labels[new Slice(0, splitIndex)];
var testLabels = labels[new Slice(splitIndex)];
// 3. 打印数据集信息
PrintDatasetInfo(trainFeatures, trainLabels, "训练集");
PrintDatasetInfo(testFeatures, testLabels, "测试集");
// 4. 创建神经网络模型
var model = BuildModel(inputShape: (int)features.shape[1]);
// 5. 编译模型
model.compile(
optimizer: new Adam(0.001f),
loss: tf.keras.losses.SparseCategoricalCrossentropy(),
metrics: new[] { "accuracy" }
);
// 6. 训练模型
model.fit(
trainFeatures,
trainLabels,
batch_size: 32,
epochs: 10,
validation_split: 0.1f
);
// 7. 评估模型并打印结果
EvaluateModel(model, testFeatures, testLabels);
}
static (Tensor, Tensor) ReadCsvData(string path)
{
// 使用 StreamReader 读取 CSV 文件 [^1]
var lines = File.ReadAllLines(path).Skip(1); // 跳过标题行
var data = lines.Select(line =>
line.Split(',')
.Select(float.Parse)
.ToArray()
).ToArray();
// 分离特征和标签
var features = data.Select(d => d.Take(d.Length - 1).ToArray()).ToArray();
var labels = data.Select(d => d.Last()).ToArray();
// 转换为 TensorFlow 张量
return (
tf.constant(features),
tf.constant(labels)
);
}
static Sequential BuildModel(int inputShape)
{
// 创建神经网络模型
var model = new Sequential();
model.add(new Dense(64,
activation: "relu",
input_shape: inputShape));
model.add(new Dense(32, activation: "relu"));
model.add(new Dense(2, activation: "softmax")); // 假设二分类问题
return model;
}
static void PrintDatasetInfo(Tensor features, Tensor labels, string name)
{
Console.WriteLine($"\n{name}信息:");
Console.WriteLine($"- 样本数: {features.shape[0]}");
Console.WriteLine($"- 特征数: {features.shape[1]}");
Console.WriteLine($"- 前3条数据:");
var featureArray = features.numpy();
var labelArray = labels.numpy();
for (int i = 0; i < Math.Min(3, featureArray.shape[0]); i++)
{
Console.WriteLine($" 输入: [{string.Join(", ", featureArray[i].ToArray<float>())}] " +
$"输出: {labelArray[i]}");
}
}
static void EvaluateModel(Sequential model, Tensor testFeatures, Tensor testLabels)
{
Console.WriteLine("\n模型评估结果:");
var results = model.evaluate(testFeatures, testLabels);
Console.WriteLine($"测试损失: {results[0]:F4}");
Console.WriteLine($"测试准确率: {results[1]:P}");
Console.WriteLine("\n测试集预测样例:");
var predictions = model.predict(testFeatures);
var predictionArray = predictions.numpy();
var labelArray = testLabels.numpy();
Console.WriteLine("索引\t实际值\t预测值");
for (int i = 0; i < Math.Min(5, predictionArray.shape[0]); i++)
{
var predicted = predictionArray[i].ToArray<float>().ToList().IndexOf(
predictionArray[i].ToArray<float>().Max());
Console.WriteLine($"{i}\t{labelArray[i]}\t{predicted}");
}
}
}
```
### 实现说明
1. **数据读取**
- 使用 `File.ReadAllLines` 读取 CSV 文件 [^1]
- 跳过标题行并解析数值数据
- 示例 CSV 格式:
```
Feature1,Feature2,Feature3,Label
0.12,0.34,0.56,1
0.23,0.45,0.67,0
...
```
2. **数据集拆分**
- 按 80% 训练集 / 20% 测试集比例拆分
- 使用 TensorFlow 的切片操作 `Slice`
- 打印数据集统计信息
3. **神经网络构建**
- 创建包含 3 层的神经网络:
- 输入层:尺寸自动匹配特征数量
- 隐藏层:64 个神经元 (ReLU 激活)
- 隐藏层:32 个神经元 (ReLU 激活)
- 输出层:2 个神经元 (Softmax 激活,适用于二分类)
4. **模型训练**
- 使用 Adam 优化器 (学习率 0.001)
- 稀疏分类交叉熵损失函数
- 训练 10 个 epoch,批量大小 32
- 使用 10% 训练数据作为验证集
5. **结果打印**
- 输出测试损失和准确率
- 显示测试集前 5 个样本的实际值和预测值
### 使用准备
1. **安装 NuGet 包**:
```bash
Install-Package TensorFlow.NET
Install-Package SciSharp.TensorFlow.Redist
```
2. **CSV 文件要求**:
- 第一行为标题行
- 最后一列为标签列
- 数值格式(标签可以是整数或浮点数)
### 示例输出
```
成功加载数据: 1000 条记录
训练集信息:
- 样本数: 800
- 特征数: 3
- 前3条数据:
输入: [0.12, 0.34, 0.56] 输出: 1
输入: [0.23, 0.45, 0.67] 输出: 0
输入: [0.31, 0.22, 0.89] 输出: 1
测试集信息:
- 样本数: 200
- 特征数: 3
- 前3条数据:
输入: [0.42, 0.55, 0.71] 输出: 0
输入: [0.15, 0.33, 0.92] 输出: 1
输入: [0.27, 0.49, 0.63] 输出: 0
Epoch 1/10: loss: 0.6823 - accuracy: 0.5712 - val_loss: 0.6711 - val_accuracy: 0.6250
...
Epoch 10/10: loss: 0.3215 - accuracy: 0.8637 - val_loss: 0.2854 - val_accuracy: 0.8875
模型评估结果:
测试损失: 0.3021
测试准确率: 85.50%
测试集预测样例:
索引 实际值 预测值
0 0 0
1 1 1
2 0 1
3 1 1
4 0 0
```
阅读全文
相关推荐















