static void Main() { string csvPath = @"D:\编程软件系列\VS2022社区版\文件\DNN_Keras\数据\SuperbigNumber.csv"; var (X_train, Y_train) = LoadCSVData(csvPath); int totalSamples = (int)X_train.shape[0]; var indices = np.arange(0,totalSamples); np.random.shuffle(indices); int trainEnd = (int)(totalSamples * 0.8); var train_X = X_train[indices[new Slice(0, trainEnd)]]; var train_Y = Y_train[indices[new Slice(0, trainEnd)]]; var test_X = X_train[indices[new Slice(trainEnd)]]; var test_Y = Y_train[indices[new Slice(trainEnd)]]; print("训练集形状:", train_X.shape); print("测试集形状:", test_X.shape); var dataset = tf.data.Dataset.from_tensor_slices(train_X, train_Y); print(" 训练集输出 "); foreach (var (item_x, item_y) in dataset) { print($"x:{item_x.numpy()},y:{item_y.numpy()}"); } var inputs = keras.Input(shape:1); var x = keras.layers.Dense(32, activation: "relu").Apply(inputs); x = keras.layers.Dense(64, activation: "relu").Apply(x); x = keras.layers.Dense(128, activation: "relu").Apply(x); x = keras.layers.Dense(256, activation: "relu").Apply(x); x = keras.layers.Dense(512, activation: "relu").Apply(x); x = keras.layers.Dense(1024, activation: "relu").Apply(x); x = keras.layers.Dropout(0.3f).Apply(x); var outputs = keras.layers.Dense(6,activation: "softmax").Apply(x); var model = keras.Model(inputs, outputs); model.summary(); model.compile(loss: keras.losses.SparseCategoricalCrossentropy(), optimizer: keras.optimizers.AdamW(), metrics: ["accuracy"]); model.fit(train_X, train_Y, batch_size:64, epochs: 100, validation_split:0.2f, callbacks = my_callbacks); model.evaluate(test_X, test_Y, verbose: 1); model.save(filepath: "D:\\编程软件系列\\VS2022社区版\\文件\\DNN_Keras\\数据\\Superbignumber.model", overwrite:true, include_optimizer:true, save_format:"tf"); var weights = model.TrainableVariables; print($"权重weight: {weights[0].numpy()}, 偏置bias: {weights[1].numpy()}"); } 增加回调函数 早停机制
时间: 2025-07-19 15:32:38 浏览: 3
<think>我们正在使用C#中的Keras.NET库来训练模型,并希望添加EarlyStopping回调函数。根据引用[4]中提到的fit函数参数,我们知道可以通过callbacks参数添加回调函数。在Python Keras中,我们通常使用`keras.callbacks.EarlyStopping`,在Keras.NET中也有对应的实现。
步骤:
1. 首先确保已经安装了Keras.NET库。可以通过NuGet包管理器安装:`Install-Package Keras -Version 3.7.4.1`(版本可能更新,请使用最新稳定版)。
2. 导入必要的命名空间。
3. 创建EarlyStopping回调对象,并设置相关参数(如监控的指标、耐心值等)。
4. 在调用模型的Fit方法时,将回调对象添加到callbacks参数中。
具体代码示例:
假设我们已经定义了模型(model)并编译了。然后,我们准备训练数据。
注意:Keras.NET的语法与Python Keras非常相似,但遵循C#的命名规范(如驼峰命名法)。
代码如下:</think>在 C# 中使用 Keras.NET 添加 EarlyStopping 回调函数的完整指南如下:
### 1. 安装必要的 NuGet 包
```bash
Install-Package Keras
Install-Package Keras.NET
Install-Package TensorFlow.NET
```
### 2. 创建 EarlyStopping 回调函数
```csharp
using Keras;
using Keras.Callbacks;
using Numpy;
// 创建 EarlyStopping 回调
var earlyStopping = new EarlyStopping(
monitor: "val_loss", // 监控验证损失
patience: 10, // 允许连续10个epoch无改善
verbose: 1, // 显示详细信息
restore_best_weights: true // 恢复最佳权重
);
```
### 3. 完整训练流程示例
```csharp
using Keras;
using Keras.Models;
using Keras.Layers;
using Keras.Optimizers;
using Keras.Callbacks;
using Numpy;
// 步骤1:创建模型
var model = new Sequential();
model.Add(new Dense(64, activation: "relu", input_shape: new Shape(784)));
model.Add(new Dense(64, activation: "relu"));
model.Add(new Dense(10, activation: "softmax"));
// 步骤2:编译模型
model.Compile(
optimizer: new Adam(),
loss: "sparse_categorical_crossentropy",
metrics: new[] { "accuracy" }
);
// 步骤3:创建回调列表
var callbacks = new Callback[]
{
new EarlyStopping(
monitor: "val_loss",
patience: 10,
verbose: 1,
restore_best_weights: true
),
new ModelCheckpoint(
filepath: "best_model.h5",
monitor: "val_accuracy",
save_best_only: true,
verbose: 1
)
};
// 步骤4:训练模型(参考引用[1][^1])
model.Fit(
x_train,
y_train,
batch_size: 32,
epochs: 100,
validation_data: (x_val, y_val), // 验证数据集(参考引用[1][^1])
callbacks: callbacks // 添加回调函数
);
```
### 关键参数说明
1. **EarlyStopping 参数**:
- `monitor`:监控指标(支持 `val_loss`, `val_accuracy` 等)
- `patience`:连续无改善的 epoch 数后停止
- `min_delta`:视为改善的最小变化量(可选)
- `restore_best_weights`:是否恢复最佳权重(强烈建议设为 `true`)
2. **ModelCheckpoint 参数**:
- `filepath`:模型保存路径(`.h5` 格式)
- `save_best_only`:只保存最佳模型
- `mode`:监控模式(`min` 用于损失,`max` 用于准确率)
### 注意事项
1. **验证数据必需**:
```csharp
// 必须提供验证数据(二选一)
validation_data: (x_val, y_val) // 显式验证集
validation_split: 0.2 // 从训练集分割20%作为验证
```
否则回调无法监控验证指标[^1]
2. **模型保存与加载**:
```csharp
// 保存完整模型(参考引用[2][^2])
model.Save("final_model.h5");
// 加载模型
var loadedModel = Sequential.LoadModel("best_model.h5");
```
3. **自定义回调**(参考引用[3][^3]):
```csharp
public class CustomCallback : Callback
{
public override void OnEpochEnd(int epoch, Dictionary<string, List<float>> logs)
{
var loss = logs["loss"].Last();
Console.WriteLine($"Epoch {epoch}: Loss = {loss:F4}");
}
}
```
### 常见问题解决
1. **回调未触发**:
- 检查 `monitor` 名称是否正确(区分大小写)
- 确认验证数据已正确提供
- 增加 `patience` 值或减小 `min_delta`
2. **性能优化**:
```csharp
// 使用混合精度训练加速
Keras.Backend.Policy = new MixedPrecisionPolicy("mixed_float16");
```
> **最佳实践**:组合使用 `EarlyStopping` 和 `ModelCheckpoint` 可节省 30-50% 训练时间同时确保保存最佳模型[^1][^2]。
阅读全文
相关推荐














