Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.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
Javascript 如何提高前馈神经网络的精度?_Javascript_Neural Network_Artificial Intelligence_Training Data_Synaptic.js - Fatal编程技术网

Javascript 如何提高前馈神经网络的精度?

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的徽标:

理想情况下,NN应为[r,g,b]=f([x,y])。换句话说,它应该返回给定坐标对的RGB颜色。FFNN对于简单形状(如圆形或长方体)非常有效。例如,在几千年之后,一个圆圈看起来是这样的:

自己试试看:


然而,由于StackOverflow的徽标更为复杂,即使经过数千次迭代,FFNN的结果也有点差:

从左到右:

  • StackOverflow的徽标为256色
  • 有15个隐藏的神经元:左手柄永远不会出现
  • 50个隐藏神经元:总的来说效果很差
  • 0.03作为学习率:在结果中显示蓝色(蓝色不在原始图像中)
  • 一个时间递减学习率:左手柄出现,但其他细节现在丢失
  • 自己试试看:

    感兴趣的一些参数是
    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将输入转换为另一种形式,这种形式更易于线性拆分。基于此,我的想法是“图像太复杂,无法线性分离,让我们尝试使用额外的层”。检查内核技巧以了解更多理论:。