Javascript 如何提高前馈神经网络的精度?
我想用这个神经网络画StackOverflow的徽标: 理想情况下,NN应为[r,g,b]=f([x,y])。换句话说,它应该返回给定坐标对的RGB颜色。FFNN对于简单形状(如圆形或长方体)非常有效。例如,在几千年之后,一个圆圈看起来是这样的: 自己试试看:Javascript 如何提高前馈神经网络的精度?,javascript,neural-network,artificial-intelligence,training-data,synaptic.js,Javascript,Neural Network,Artificial Intelligence,Training Data,Synaptic.js,我想用这个神经网络画StackOverflow的徽标: 理想情况下,NN应为[r,g,b]=f([x,y])。换句话说,它应该返回给定坐标对的RGB颜色。FFNN对于简单形状(如圆形或长方体)非常有效。例如,在几千年之后,一个圆圈看起来是这样的: 自己试试看: 然而,由于StackOverflow的徽标更为复杂,即使经过数千次迭代,FFNN的结果也有点差: 从左到右: StackOverflow的徽标为256色 有15个隐藏的神经元:左手柄永远不会出现 50个隐藏神经元:总的来说效果很差
然而,由于StackOverflow的徽标更为复杂,即使经过数千次迭代,FFNN的结果也有点差: 从左到右:
synaptic.Architect.Perceptron
定义和learningRate
值
如何提高此NN的准确性? 你能改进一下这个片段吗?如果是这样,请解释你做了什么。如果有更好的NN体系结构来处理这类工作,您能提供一个例子吗 其他信息:
- 使用的人工神经网络库:
- 要在本地主机中运行此示例,请执行以下操作:
let perceptron = new synaptic.Architect.Perceptron(2, 15, 10, 3)
您可以做一些小的改进来提高效率(略微):
以下是我的优化代码:
const width=125
常数高度=125
const outputCtx=document.getElementById(“输出”).getContext(“2d”)
const iterationLabel=document.getElementById(“迭代”)
常数停止迭代=3000
let perceptron=new synaptic.Architect.perceptron(2,15,10,3)
设迭代=0
让inputData=(()=>{
const tempCtx=document.createElement(“画布”).getContext(“2d”)
tempCtx.drawImage(document.getElementById(“输入”),0,0)
返回tempCtx.getImageData(0,0,宽度,高度)
})()
常量getRGB=(img,x,y)=>{
变量k=(高度*y+x)*4;
返回[
img.data[k]/255,//R
img.data[k+1]/255,//G
img.data[k+2]/255,//B
//图像数据[(高度*y+x)*4+3],//未使用Alpha
]
}
常量绘制=()=>{
var imageData=outputCtx.getImageData(0,0,宽度,高度)
对于(设x=0;x{
iterationLabel.innerHTML=++iteration
if(迭代>停止迭代)返回
让learningRate=0.01/(1+0.0005*迭代)//尝试使用动态学习速率
//让learningRate=0.01//尝试使用非动态学习速率
对于(设x=0;x{
btn.disabled=true
列车()
}
编辑:我制作了另一个代码笔,效果更好:
顺便说一句,它可能安装过度。
感知器定义:
let perceptron = new synaptic.Architect.Perceptron(2, 8, 15, 7, 3)
从比克沙·拉吉(Bhiksha Raj)的讲座中获得一些见解(从幻灯片62开始),总结如下: 每个节点都可以假设为一个线性分类器,在一层神经网络中,多个节点的组合可以近似任何基本形状。例如,一个矩形可以由每条线的4个节点组成,假设每个节点贡献一条线,并且形状可以由最终输出层近似 回到复杂形状(如圆形)的总结,它可能需要层中的无限节点。或者,对于具有两个不相交形状(不重叠的三角形和矩形)的单层来说,这可能是正确的。但是,仍然可以使用多个隐藏层来了解这一点。其中,第一层学习基本形状,第二层学习近似其不相交的组合
因此,您可以假设此徽标是不相交矩形的组合(橙色为5个矩形,灰色为3个矩形)。我们可以在第一个隐藏层中使用至少32个节点,在第二个隐藏层中使用很少的节点。但是,我们无法控制每个节点学习的内容。因此,比所需神经元数量多几个神经元应该是有帮助的。你可以尝试的另一件事是使用RGB以外的东西。我相信Lab*或HSV颜色空间可能会更好。此外,您的误差函数目前是线性的。我有一个直觉,即均方误差也可能更好。谢谢!结果看起来不错。赏金时间已经过了,我决定把它奖励给你。我唯一想知道的是新价值观背后的原因。基本上,一个人如何选择正确的人?运气如何?谢谢感谢您的奖励,非常感谢:-)回答您的问题:运气和经验的组合。基本上,只有一层的感知器类似于线性聚类算法(即它可以定义一个分隔空间的平面)。每个额外的层允许NN将输入转换为另一种形式,这种形式更易于线性拆分。基于此,我的想法是“图像太复杂,无法线性分离,让我们尝试使用额外的层”。检查内核技巧以了解更多理论:。