PHP5的再训练人工神经网络

PHP5的再训练人工神经网络,php,artificial-intelligence,Php,Artificial Intelligence,因此,在我的web应用程序中,我成功地为PHP5()将一个连接到ANN。我是这样训练的: <?php require_once 'ANN/Loader.php'; $data = $_POST['data']; $data = array_map('floatval', $data); use ANN\Network; use ANN\Values; try { $objNetwork = Network::loadFromFile('xor.dat'); } catch(

因此,在我的web应用程序中,我成功地为PHP5()将一个
连接到ANN。我是这样训练的:

<?php
require_once 'ANN/Loader.php';

$data = $_POST['data'];

$data = array_map('floatval', $data);

use ANN\Network;
use ANN\Values;

try
{
    $objNetwork = Network::loadFromFile('xor.dat');
}
catch(Exception $e)
{
    print 'Creating a new one...';

    $objNetwork = new Network;

    $objValues = new Values;

    $objValues->train();
    call_user_func_array(array($objValues, 'input'), $data);
    $objValues->output(1);

    $objValues->saveToFile('values_xor.dat');

    unset($objValues);
}

try
{
    $objValues = Values::loadFromFile('values_xor.dat');
}
catch(Exception $e)
{
    die('Loading of values failed');
}

$objNetwork->setValues($objValues); // to be called as of version 2.0.6

$boolTrained = $objNetwork->train();

print ($boolTrained)
    ? 'Network trained'
    : 'Network not trained completely. Please re-run the script';

$objNetwork->saveToFile('xor.dat');

$objNetwork->printNetwork();
<?php
require_once 'ANN/Loader.php';

$data = $_POST['data'];

$data = array_map('floatval', $data);

use ANN\Network;
use ANN\Values;

try
{
    $objNetwork = Network::loadFromFile('xor.dat');
}
catch(Exception $e)
{
    die('Network not found');
}

try
{
    $objValues = Values::loadFromFile('values_xor.dat');
}
catch(Exception $e)
{
    die('Loading of values failed');
}

call_user_func_array(array($objValues, 'input'), $data);

$objNetwork->setValues($objValues);

print_r($objNetwork->getOutputs());
观察
大多数经典的ANN体系结构遵循

  • 操作两种模式:培训和绘图
训练后,权重(因此网络内存)是固定的

有些模型试图向现有数据集添加新知识。看看自适应共振理论,艺术神经网络。然而,他们不一定要吸收新知识。他们可能会添加一个新的输出或一组神经元来对新项目进行分类

用于模式识别的goto ANN,您的问题似乎是前馈网络/多层peceptron,通过反向传播(BP)进行训练

我查看了你的链接,它似乎使用了一个“多层感知器”,所以你可能会被这种架构所困扰

问题 这里的问题是,如果您的网络已经接受了(N)个模式的训练并产生了(O)个输出,那么它将呈现一个新的模式(p)。 它将(P)分类为属于产生输出(o)的相同模式(n)或模式组(n)

我不知道您的培训数据是在添加1个培训模式=1输出,还是在添加多个培训模式=1输出

解决方案 蛮力方法是将(p)添加到训练数据中,完全重新训练你的网络

还有其他选择

BP遵循梯度下降,因此在每个训练周期结束时,您将得到一个错误。当此错误低于所选级别错误时,BP通常停止。(见最后的注释)。这不是一种很好的方法,会导致猜测和训练过度/不足。假设它实际上已经达到了目标水平,并且没有陷入局部极小值

一开始你的误差会很大,因为它接近你的误差,你可以保存一份权重。这些表示您的网络处于部分训练状态(错误)

当你想引入模式(p)时,你可以用这些部分训练的权重重新开始训练,而不是初始的或新的随机权重。错误最初应该从(error_p)开始上升,然后开始下降。当新的部分训练权重再次达到误差p时,保存该权重。他们让它完成训练并重新投入工作

或者。 (1) 当你想包括(p)。仅使用(p)或要添加(p)的训练模式组重新训练网络。这将改变所有其他模式输出对的识别

请注意,您训练有素的网络创意采用了新的模式p,其错误率非常低,以至于显示“我认识您”。这意味着,当您向训练算法呈现训练权重和p时,它可能已经低于您的目标误差,并且您将只获得1个训练周期

所以我建议只做(1)中提到的一个训练周期。然后测试你所有的训练数据+p。如果错误在Error的下面,请考虑它的训练,如果不让它继续运行,直到你返回到ErrRoStt。 尾注

在出现任意错误时停止BP是训练的基本方法。这样做会使网络没有得到足够的训练,因此它无法识别你想要的东西,或者“过于适合”,因此它只能识别你的训练模式,而拒绝你的真实世界模式

另一种方法是有一个模式训练集和一个验证集。 您使用训练数据训练网络,但不将错误视为停止标志。 相反,在每个培训周期后,您向网络显示验证模式,如果网络识别出这些模式,则停止培训。这是您的验证错误

情况变得更糟了

假设你有N个训练模式。 在每个培训周期开始时,您将显示网络模式[1]。网络产生一个错误(期望输出-实际输出),你把这个错误传播回网络,这意味着下次它看到模式[1]时,错误应该更低。 它在这里所做的是稍微修改权重

现在,对模式[2]、…,等等执行相同的操作,直到模式[N]

每次网络调整其对模式[n]的权重时,都会影响对先前模式[1到n-1]的识别。所以,当你得到模式[N]的时候。以前的学习可能会受到很多损害。理论上最严重的损害应该发生在模式[1]的学习上,但它实际上取决于模式之间的共享相似性以及模式变量与输出变量之间的数学关系

我告诉你这一点的原因是,如果你要向一个训练有素的网络表示一个新模式,你就要执行一点


您可以通过在每个训练周期中以随机顺序(或阶梯顺序)呈现训练模式来修复/缓解此问题,因此模式[1]并不总是最先出现,模式[N]也不总是最后出现

我不知道有哪一种神经网络一旦定稿就可以重新训练。当然,您可以不断添加训练数据,并根据增加的数据训练新网络,但这并不能保证提高错误级别。因此,如果不考虑它是否会提高错误级别,您只需训练一个新网络并替换旧网络?也许。也许还有另一个更合适的分类器,但我不知道你的数据。也许你们可以计算输入向量相对于已知向量的欧几里德距离-