最适合网络开发者的网站
人工智能。初学者课程

尿素

训练感知器

  • 创建一个 感知器对象
  • 创建一个 训练功能
  • 火车 感知器与正确答案

训练任务

想象空间中有一条直线,上面有散布的 xy 点。

训练感知器对线上和线下的点进行分类。


创建感知器对象

创建一个感知器对象。将其命名为任意名称(例如“感知器”)。

让感知器接受两个参数:

  1. 输入数量(无)
  2. 学习率(learningRate)。

将默认学习率设置为 0.00001。

然后为每个输入创建 -1 到 1 之间的随机权重。

例子

// 感知器对象
函数感知器(否,学习率 = 0.00001){

// 设置初始值
this.learnc = 学习率;
这个.偏见=1;

// 计算随机权重
这个.权重 = [];
对于(设 i = 0;i <= 否;i++){
这个.权重[i] = Math.random() * 2 - 1;
}

// 结束感知器对象
}

随机权重

感知器将首先 随机权重 对于每个输入。

学习率

对于每个错误,在训练感知器时,权重将进行一小部分调整。

这一小部分就是“感知器的学习率".

在感知器对象中我们称它为 学习.

偏见

有时,如果两个输入都为零,感知器可能会产生错误的输出。

为了避免这种情况,我们给感知器一个额外的输入,值为 1。

这被称为 偏见.


添加激活函数

记住感知器算法:

  • 将每个输入与感知器的权重相乘
  • 总结结果
  • 计算结果

例子

this.activate = 函数(输入){
设总和=0;
对于(让 i = 0; i < 输入.长度; i++){
总和 += 输入[i] * 这个.权重[i];
  }
如果 (总和 > 0) {返回 1} 否则 {返回 0}
}

激活函数将输出:

  • 如果总和大于 0,则为 1
  • 如果总和小于 0,则为 0

创建训练函数

训练函数根据激活函数猜测结果。

每次猜测错误时,感知器就应该调整权重。

经过多次猜测和调整后,权重就会正确。

例子

this.train = 函数(输入,期望){
输入.推送(这个.偏见);
让 guess = this.activate(inputs);
让错误 = 期望 - 猜测;
如果 (错误 != 0) {
对于(让 i = 0; i < 输入.长度; i++){
this.weights[i] += this.learnc * 错误 * 输入[i];
    }
  }
}

亲自尝试 »


反向传播

每次猜测之后,感知器都会计算出猜测的错误程度。

如果猜测错误,感知器就会调整偏差和权重,以便下次猜测会更正确一些。

这种学习方式被称为 反向传播.

经过尝试(几千次)后,你的感知器将变得非常擅长猜测。


创建自己的图书馆

图书馆代码

// 感知器对象
函数感知器(否,学习率 = 0.00001){

// 设置初始值
this.learnc = 学习率;
这个.偏见=1;

// 计算随机权重
这个.权重 = [];
对于(设 i = 0;i <= 否;i++){
这个.权重[i] = Math.random() * 2 - 1;
}

// 激活函数
this.activate = 函数(输入){
设总和=0;
对于(让 i = 0; i < 输入.长度; i++){
总和 += 输入[i] * 这个.权重[i];
  }
如果 (总和 > 0) {返回 1} 否则 {返回 0}
}

// 训练函数
this.train = 函数(输入,期望){
输入.推送(这个.偏见);
让 guess = this.activate(inputs);
让错误 = 期望 - 猜测;
如果 (错误 != 0) {
对于(让 i = 0; i < 输入.长度; i++){
this.weights[i] += this.learnc * 错误 * 输入[i];
    }
  }
}

// 结束感知器对象
}

现在您可以将该库包含在 HTML 中:

<script src="myperceptron.js"></script>

使用你的图书馆

例子

// 初始化值
const numPoints = 500;
const 学习率 = 0.00001;

// 创建绘图仪
const 绘图仪 = new XYPlotter (“myCanvas”);
绘图仪.transformXY();
const xMax = 绘图仪.xMax;
const yMax = 绘图仪.yMax;
const xMin = 绘图仪.xMin;
const yMin = 绘图仪.yMin;

// 创建随机 XY 点
const xPoints = [];
const yPoints = [];
对于(让 i = 0; i &lt; numPoints; i++){
xPoints[i] = Math.random() * xMax;
yPoints[i] = Math.random() * yMax;
}

// 线函数
函数 f(x) {
返回 x * 1.2 + 50;
}

//绘制线条
绘图仪.plotLine(xMin,f(xMin),xMax,f(xMax),“黑色”);

// 计算所需答案
const 期望 = [];
对于(让 i = 0; i &lt; numPoints; i++){
期望[i] = 0;
如果 (yPoints[i] &gt; f(xPoints[i])) {desired[i] = 1}
}

// 创建一个感知器
const ptron = new Perceptron(2,学习率);

// 训练感知器
对于(设 j = 0;j &lt;= 10000;j++){
对于(让 i = 0; i &lt; numPoints; i++){
ptron.train([xPoints[i], yPoints[i]],desired[i]);
  }
}

// 显示结果
对于(让 i = 0; i &lt; numPoints; i++){
const x = xPoints[i];
const y = yPoints[i];
让 guess = ptron.activate([x, y, ptron.bias]);
让颜色=“黑色”;
如果(猜测==0)颜色=“蓝色”;
绘图仪.plotPoint(x, y,颜色);
}

亲自尝试 »