2024 年 PHP 日本大会

fann_train_epoch

(PECL fann >= 1.0.0)

fann_train_epoch使用一组训练数据训练一个周期

描述

fann_train_epoch(资源 $ann, 资源 $data): 浮点数

使用存储在 data 中的训练数据训练一个周期。一个周期是指所有训练数据都被精确考虑一次。

此函数返回 MSE 错误,因为它是在实际训练之前或期间计算的。这不是训练周期后的实际 MSE,因为计算这将需要再次遍历整个训练集。在训练期间使用此值绰绰有余。

此函数使用的训练算法由 fann_set_training_algorithm() 函数选择。

参数

ann

神经网络 资源

data

神经网络训练数据 资源

返回值

MSE,或发生错误时为 false

参见

添加备注

用户贡献的备注 1 条备注

geekgirljoy at gmail dot com
6 年前
此代码演示了使用 fann_train_epoch 训练 XOR,并允许您通过观察伪 MSE(均方误差)来观察训练过程。

其他训练函数:fann_train_on_data、fann_train_on_file、fann_train。

当您希望在 ANN 训练时观察它,并可能保存快照或比较训练期间的竞争网络时,fann_train_epoch 非常有用。

fann_train_epoch 与 fann_train 的不同之处在于它接受数据资源(训练文件),而 fann_train 接受输入数组和单独的输出数组,因此对于观察对数据文件(回调训练资源)的训练,请使用 fann_train_epoch;对于观察手动指定的数据,请使用 fann_train。

示例代码

<?php
$num_input
= 2;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 3;
$desired_error = 0.0001;
$max_epochs = 500000;
$current_epoch = 0;
$epochs_between_saves = 100; // 保存之间的最小迭代次数
$epochs_since_last_save = 0;
$filename = dirname(__FILE__) . "/xor.data";

// 将伪均方误差 (MSE) 初始化为大于 desired_error 的数值
// 网络试图最小化该值。
$psudo_mse_result = $desired_error * 10000; // 1
$best_mse = $psudo_mse_result; // 保留最后一次看到的最佳 MSE 网络分数

// 初始化 ANN
$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if (
$ann) {
echo
'正在训练 ANN... ' . PHP_EOL;

// 配置 ANN
fann_set_training_algorithm ($ann , FANN_TRAIN_BATCH);
fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

// 读取训练数据
$train_data = fann_read_train_from_file($filename);


// 检查 psudo_mse_result 是否大于 desired_error
// 如果是,则继续训练,只要我们还在 max_epochs 范围内
while(($psudo_mse_result > $desired_error) && ($current_epoch <= $max_epochs)){
$current_epoch++;
$epochs_since_last_save++;

// 参考:https://php.net/manual/en/function.fann-train-epoch.php
// 使用存储在 data 中的训练数据训练一个 epoch。
//
// 一个 epoch 指的是所有训练数据都被精确考虑一次。
//
// 此函数返回计算出的 MSE 误差,该误差是在实际训练之前或期间计算的。这不是训练 epoch 后的实际 MSE,但由于计算这
// 需要再次遍历整个训练集。在训练期间使用此值绰绰有余。
$psudo_mse_result = fann_train_epoch ($ann , $train_data );
echo
'迭代 ' . $current_epoch . ' : ' . $psudo_mse_result . PHP_EOL; // 报告


// 如果我们一段时间没有保存 ANN……
// 并且当前网络优于之前的最佳网络
// 定义为当前 MSE 小于上次最佳 MSE
// 保存它!
if(($epochs_since_last_save >= $epochs_between_saves) && ($psudo_mse_result < $best_mse)){

$best_mse = $psudo_mse_result; // 我们有了一个新的 best_mse

// 保存 ANN 的快照
fann_save($ann, dirname(__FILE__) . "/xor.net");
echo
'已保存 ANN。' . PHP_EOL; // 报告保存
$epochs_since_last_save = 0; // 重置计数
}

}
// 训练期间

echo '训练完成!正在保存最终网络。' . PHP_EOL;

// 保存最终网络
fann_save($ann, dirname(__FILE__) . "/xor.net");
fann_destroy($ann); // 释放内存
}
echo
'全部完成!' . PHP_EOL;
?>
To Top