fann_train_epoch

(PECL fann >= 1.0.0)

fann_train_epoch使用一组训练数据训练一个 epoch

描述

fann_train_epoch(resource $ann, resource $data): float

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

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

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

参数

ann

神经网络 resource

data

神经网络训练数据 resource

返回值

MSE,或错误时为 false

参见

添加注释

用户贡献注释 1 个注释

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

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

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

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 中的训练数据训练一个时期。
//
// 一个时期是指所有训练数据都被考虑过一次。
//
// 此函数返回计算的 MSE 错误,它是在实际训练之前或期间计算的。这不是
// 训练时期后的实际 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