PHP 日本研討會 2024

fann_create_train_from_callback

(PECL fann >= 1.0.0)

fann_create_train_from_callback從使用者提供的函式建立訓練資料結構

描述

fann_create_train_from_callback(
    int $num_data,
    int $num_input,
    int $num_output,
    callable $user_function
): resource

從使用者提供的函式建立訓練資料結構。由於訓練資料是可列舉的(資料 1,資料 2...),使用者必須編寫一個函式,接收訓練資料集的編號(輸入、輸出),並回傳該集合。

參數

num_data

訓練資料的數量

num_input

每個訓練資料的輸入數量

num_output

每個訓練資料的輸出數量

user_function

使用者提供的函式,具有以下參數

  • num - 訓練資料集的編號
  • num_input - 每個訓練資料的輸入數量
  • num_output - 每個訓練資料的輸出數量

該函式應回傳一個具有鍵 inputoutput 的關聯陣列,以及兩個輸入和輸出的陣列值。

回傳值

成功時回傳一個訓練資料 資源,錯誤時回傳 false

範例

範例 #1 fann_create_train_from_callback() 範例

<?php
function create_train_callback($num_data, $num_input, $num_output) {
return array(
"input" => array_fill(0, $num_input, 1),
"output" => array_fill(0, $num_output, 1),
);
}

$num_data = 3;
$num_input = 2;
$num_output = 1;
$train_data = fann_create_train_from_callback($num_data, $num_input, $num_output, "create_train_callback");
if (
$train_data) {
// 使用 $train_data 做一些事情
}
?>

注意

注意:

只有在 fann 擴展是針對 libfann >= 2.2 建置時,此函式才可用。

參見

新增註解

使用者貢獻的註解 1 註解

6
geekgirljoy at gmail dot com
8 年前
此程式碼可用於從 MySQL 讀取訓練資料,而不是文字檔。

<?php

// 此範例使用的 MySQL:
/*
CREATE TABLE `TrainingSets` (
`ID` int(11) NOT NULL,
`Name` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
`TrainingData` text COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `TrainingSets` ADD PRIMARY KEY (`ID`);

INSERT INTO `TrainingSets` (`ID`, `Name`, `TrainingData`) VALUES(1, 'XOR', '-1 -1\n-1\n-1 1\n1\n1 -1\n1\n1 1\n-1');

ALTER TABLE `TrainingSets` MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
*/

// 這個函式從 MySQL 提取 TrainingData
function get_training_data_from_db($id) {
$table_name = "TrainingSets";
$field = "TrainingData";
$connection=mysqli_connect("host","username","password","database"); // 變更為您的資料庫憑證
$result=mysqli_query($connection,"SELECT $field FROM $table_name");
$data=mysqli_fetch_assoc($result);
mysqli_close($connection);

return
$data[$field];
}

// 此函式準備以換行符號分隔的資料,以便傳遞給 FANN
/*
儲存在 MySQL 中的「以換行符號分隔的資料」範例(如純文字檔案中的 XOR):
-1 -1
-1
-1 1
1
1 1
-1
1 -1
1
*/
function prepare_data_from_db($training_data) {
$training_data = explode( "\n", $training_data ); // 將訓練資料列轉換為陣列
$num_data = count($training_data);

// 篩選資料並分割輸入和輸出
for($i=0;$i<$num_data;$i++) {
if(
$i % 2) { // $training_data[$i] 是輸出
$training_data['outputs'][] = explode( " ", $training_data[$i]);
}else{
// $training_data[$i] 是輸入
$training_data['inputs'][] = explode( " ", $training_data[$i]);
}
}
// 移除未篩選的資料
foreach ($training_data as $key => $value) {
if (
is_numeric($key)) {
unset(
$training_data[$key]);
}
}
return
$training_data; // 傳回準備好的關聯陣列
}

// 此函式將準備好的資料傳遞給 FANN
function create_train_callback($num_data, $num_input, $num_output) {
global
$training_data;
global
$current_dataset;

$dataset = array("input" => $training_data['inputs'][$current_dataset],
"output" => $training_data['outputs'][$current_dataset]);
$current_dataset++;

return
$dataset;
}

// 初始化程式變數
$record_id = 1; // MySQL 中訓練資料的 'ID'
$current_dataset = 0;
$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons = 3;
$desired_error = 0.001;
$max_epochs = 500000;
$epochs_between_reports = 1000;

$training_data = get_training_data_from_db($record_id); // 從 MySQL 取得訓練資料
$training_data = prepare_data_from_db($training_data); // 準備資料
$num_data = count($training_data["input"]); // 有多少組資料?

// 將資料傳遞給 FANN
$train_data = fann_create_train_from_callback($num_data, $num_input, $num_output, "create_train_callback");

// 測試 $train_data
if ($train_data) {

// 建立 $ann
$ann = fann_create_standard($num_layers, $num_input, $num_neurons, $num_output);

// 測試 $ann
if ($ann) {
fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

// 使用從 MySQL 取得的訓練資料訓練 XOR ANN
if (fann_train_on_data($ann, $train_data, $max_epochs, $epochs_between_reports, $desired_error)){
print(
'XOR 已訓練。<br>' . PHP_EOL);

// 測試 $ann
$input = array(-1, 1);
$calc_out = fann_run($ann, $input);
printf("xor 測試 (%f,%f) -> %f\n", $input[0], $input[1], $calc_out[0]);

// 釋放 $ann
fann_destroy($ann);
}
}
}
?>
To Top