Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中用于和门的基本感知器,我做得对吗?奇怪的结果_Php_Neural Network_Perceptron - Fatal编程技术网

PHP中用于和门的基本感知器,我做得对吗?奇怪的结果

PHP中用于和门的基本感知器,我做得对吗?奇怪的结果,php,neural-network,perceptron,Php,Neural Network,Perceptron,我想从最基本的感知器算法开始学习神经网络。所以我已经在PHP中实现了一个,经过训练后,我得到了奇怪的结果。所有4种可能的输入组合返回错误或正确的结果(通常是错误的结果) 1) 我的实现是否有问题,或者我得到的结果是否正常 2) 这种实现是否可以使用2个以上的输入 3) 在此之后,学习神经网络的下一步(最简单)是什么?也许增加更多的神经元,改变激活功能,或者 另外,我的数学很差,不一定100%理解感知器背后的数学,至少不理解训练部分 感知器类 我必须感谢你发布这个问题,我想有机会深入研究一下神经网

我想从最基本的感知器算法开始学习神经网络。所以我已经在PHP中实现了一个,经过训练后,我得到了奇怪的结果。所有4种可能的输入组合返回错误或正确的结果(通常是错误的结果)

1) 我的实现是否有问题,或者我得到的结果是否正常

2) 这种实现是否可以使用2个以上的输入

3) 在此之后,学习神经网络的下一步(最简单)是什么?也许增加更多的神经元,改变激活功能,或者

另外,我的数学很差,不一定100%理解感知器背后的数学,至少不理解训练部分

感知器类
我必须感谢你发布这个问题,我想有机会深入研究一下神经网络。总之,事关正事。在对所发生的一切进行修补和详细记录后,只需更改1个字符即可按预期工作:

public function sum(array $inputs)
{
    ...
    //instead of multiplying the input by the weight, we should be adding the weight
    $sum += ($inputs[$i] + $this->weights[$i]);
    ...
}
有了这一改变,1000次迭代的训练最终被过度使用了。 代码中有一点令人困惑,不同的权重设置:

public function train(array $trainingSet, float $learningRate)
{
    foreach ($trainingSet as $row) {
        ...
        $this->weights[0] = $this->weights[0] + ($learningRate * $error);
        for ($i = 0; $i < $this->n - 1; $i++) {
            $this->weights[$i + 1] =
                $this->weights[$i] + ($learningRate * $inputs[$i] * $error);
        }
}
公共功能序列(数组$trainingSet,浮动$learningRate)
{
foreach($trainingSet as$row){
...
$this->weights[0]=$this->weights[0]+($learningRate*$error);
对于($i=0;$i<$this->n-1;$i++){
$this->weights[$i+1]=
$this->weights[$i]+($learningRate*$inputs[$i]*$error);
}
}
我不一定明白你为什么选择这样做。我没有经验的眼睛会认为下面的方法也行

for ($i = 0; $i < $this->n; $i++) { 
    $this->weight[$i] += $learningRate * $error;
}
for($i=0;$i<$this->n;$i++){
$this->weight[$i]+=$learningRate*$error;
}

发现了我的愚蠢错误,我没有调整训练集每一行的偏差,因为我不小心将它放在了
foreach
循环之外。这就是
train()
方法应该看起来的样子:

public function train(array $trainingSet, float $learningRate)
{
    foreach ($trainingSet as $row) {
        $inputs = array_slice($row, 0, $this->n);
        $correctOutput = $row[$this->n];

        $output = $this->predict($inputs);
        $error = $correctOutput - $output;

        // Adjusting the weights
        for ($i = 0; $i < $this->n; $i++) {
            $this->weights[$i] += ($learningRate * $inputs[$i] * $error);
        }

        // Adjusting the bias
        $this->bias += ($learningRate * $error);
    }
}
公共功能序列(数组$trainingSet,浮动$learningRate)
{
foreach($trainingSet as$row){
$inputs=array_切片($row,0,$this->n);
$correctOutput=$row[$this->n];
$output=$this->predict($inputs);
$error=$correctOutput-$output;
//调整重量
对于($i=0;$i<$this->n;$i++){
$this->weights[$i]+=($learningRate*$inputs[$i]*$error);
}
//调整偏差
$this->bias+=($learningRate*$error);
}
}

现在我每次运行脚本都会在训练后得到正确的结果。只需100次训练就足够了。

谢谢你的回答。我的实现基于我能够从谷歌上找到的多个来源,它们非常一致,所以我认为你的更改不正确。这是苏在代码的第一部分,假设是乘法(所有w(i)*x(i)的总和)。学习机制是什么?我仍然不确定哪一个是正确的公式。一些网站说它是w(t+1)=w(t)+…而其他的-w(t)=w(t)+…无论如何,请检查以下两个链接:
for ($i = 0; $i < $this->n; $i++) { 
    $this->weight[$i] += $learningRate * $error;
}
public function train(array $trainingSet, float $learningRate)
{
    foreach ($trainingSet as $row) {
        $inputs = array_slice($row, 0, $this->n);
        $correctOutput = $row[$this->n];

        $output = $this->predict($inputs);
        $error = $correctOutput - $output;

        // Adjusting the weights
        for ($i = 0; $i < $this->n; $i++) {
            $this->weights[$i] += ($learningRate * $inputs[$i] * $error);
        }

        // Adjusting the bias
        $this->bias += ($learningRate * $error);
    }
}