C# keras CSV特征张量和标签张量 创建自定义模型
时间: 2025-06-13 10:31:04 浏览: 10
### C# Keras 从 CSV 数据生成特征张量和标签张量并构建自定义模型
以下是一个完整的解决方案,展示如何使用 C# 和 Keras 从 CSV 文件中读取数据、生成特征张量和标签张量,并构建自定义模型。
---
### 1. 从 CSV 文件加载数据
在 C# 中,可以通过 `System.IO` 或第三方库(如 `CsvHelper`)读取 CSV 文件。以下是使用 `CsvHelper` 的示例代码:
```csharp
using System;
using System.Collections.Generic;
using System.IO;
using CsvHelper;
public class CsvDataLoader
{
public static (float[][], int[]) LoadCsv(string filePath)
{
var features = new List<float[]>();
var labels = new List<int>();
using (var reader = new StreamReader(filePath))
using (var csv = new CsvHelper.CsvReader(reader, System.Globalization.CultureInfo.InvariantCulture))
{
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
// 假设第一列为标签,其余为特征
var label = csv.GetField<int>("Label");
var featureArray = new List<float>();
for (int i = 0; i < csv.Context.Record.Length - 1; i++)
{
featureArray.Add(float.Parse(csv.Context.Record[i + 1]));
}
features.Add(featureArray.ToArray());
labels.Add(label);
}
}
return (features.ToArray(), labels.ToArray());
}
}
```
**说明**:
- 使用 `CsvHelper` 库解析 CSV 文件,假设第一列为标签,其余列为特征[^1]。
- 将特征和标签分别存储为二维数组和一维数组。
---
### 2. 特征张量和标签张量的转换
将加载的数据转换为 TensorFlow 张量格式:
```csharp
using Tensorflow;
public class TensorConverter
{
public static (Tensor xTrain, Tensor yTrain) ConvertToTensors(float[][] features, int[] labels)
{
// 将特征转换为浮点型张量
var xTrain = tf.constant(features, dtype: tf.float32);
// 将标签转换为整数型张量
var yTrain = tf.constant(labels, dtype: tf.int32);
return (xTrain, yTrain);
}
}
```
**说明**:
- 使用 `tf.constant` 方法将特征和标签转换为 TensorFlow 张量。
- 特征张量为浮点型,标签张量为整数型。
---
### 3. 构建自定义模型
通过继承 `Model` 类实现自定义模型:
```csharp
using Tensorflow;
using Tensorflow.Keras.Layers;
public class CustomModel : Model
{
private Dense denseLayer1;
private Dense denseLayer2;
private Dense outputLayer;
public CustomModel() : base()
{
denseLayer1 = new Dense(128, activation: "relu");
denseLayer2 = new Dense(64, activation: "relu");
outputLayer = new Dense(10, activation: "softmax");
}
public override Tensor Call(Tensor inputs, bool training = false)
{
var x = denseLayer1.Call(inputs, training);
x = denseLayer2.Call(x, training);
return outputLayer.Call(x, training);
}
}
```
**说明**:
- 模型包含两个隐藏层和一个输出层,激活函数分别为 ReLU 和 Softmax[^3]。
- 使用 `Call` 方法定义前向传播逻辑。
---
### 4. 模型编译与训练
编译模型并进行训练:
```csharp
var model = new CustomModel();
model.Build(input_shape: new Shape(-1, 784)); // 输入形状为 (None, 784)
model.Compile(
optimizer: "adam",
loss: "sparse_categorical_crossentropy",
metrics: new[] { "accuracy" }
);
// 加载数据并转换为张量
var (features, labels) = CsvDataLoader.LoadCsv("trainimgface.csv");
var (xTrain, yTrain) = TensorConverter.ConvertToTensors(features, labels);
// 训练模型
model.Fit(
x: xTrain,
y: yTrain,
epochs: 10,
batch_size: 32
);
```
**说明**:
- 使用 Adam 优化器和稀疏分类交叉熵损失函数。
- 训练轮数设置为 10 轮,批次大小为 32。
---
###
阅读全文
相关推荐















