此代码演示了使用 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";
$psudo_mse_result = $desired_error * 10000; $best_mse = $psudo_mse_result; $ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);
if ($ann) {
echo '正在训练 ANN... ' . PHP_EOL;
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);
while(($psudo_mse_result > $desired_error) && ($current_epoch <= $max_epochs)){
$current_epoch++;
$epochs_since_last_save++;
$psudo_mse_result = fann_train_epoch ($ann , $train_data );
echo '时期 ' . $current_epoch . ' : ' . $psudo_mse_result . PHP_EOL; if(($epochs_since_last_save >= $epochs_between_saves) && ($psudo_mse_result < $best_mse)){
$best_mse = $psudo_mse_result; 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;
?>