Skip to content

Latest commit

 

History

History
55 lines (43 loc) · 2.41 KB

33.精读30行JS代码创建神经网络.md

File metadata and controls

55 lines (43 loc) · 2.41 KB

033.精读《30 行 js 代码创建神经网络》.md

Syncaptic.js 创建简单的神经网络,解决异或运算的问题

神经网络中的神经元和突触

  • 神经元在神经网络中可以理解成一个函数,接收一些输入返回一些输出结果,Sigmoid 神经元以 Sigmoid 函数作为激活函数

  • 输入层节点通过权重参数处理,然后再加入偏差值,最后到达一个隐藏层节点

  • (1,0)输入,生成权重参数(7,3),(-2)作为偏差值,到达函数 Sigmoid(5) = 1 隐藏节点生成

  • 神经元通过箭头指向连接新城神经网络。这些箭头指向可以理解为突触

  • Input --> hidden(生成隐藏节点) -->Output

  • 模型依赖正确的权重和偏差的选择,实际场景有识别数字或者垃圾邮件判断等领域,通过神经网络的训练,拿到训练结果对测试样本进行预测, 得到算法的准确率,然后尝试选择更好的权重和偏差,期待更高的准确度,这种学习过程为反向传播

    // 代码实现
    const {Layout, Network} = window.synaptic;
    var inputLayer = new Layer(2);
    var hiddenLayer = new Layer(3);
    var outputLayer = new Layer(1);
    inputLayer.project(hiddenLayout);
    hiddenLayout.project(outputLayer);
    var myNetwork = new NetWork({
        input: inputLayer,
        hiddem: [hiddenLayout],
        output: outputLayer
    });
    // train the network - learn XOR 学习异或运算
    var learningRate = .3;
    for (var i = 0; i < 20000; i++) {
        // 0 ,0 => 0
        myNetwork.activate([0,0]);
        myNetwork.propagate(learningRate, [0]);
        // 0 ,1 => 1
        myNetwork.activate([0,1]); // 输入值
        myNetwork.propagate(learningRate, [1]); // 权衡权重的常量
        // 1 ,0 => 1
        myNetwork.activate([1,0])
        myNetwork.propagate(learningRate, [1]);
        // 1 ,1 => 0
        myNetwork.activate([1,1])
        myNetwork.propagate(learningRate, [0]);
    }
    • 运行 myNetwork.activate([0,0]); 区间为输入值,对应的异或运算为 false,为 0,这个是向前的传播,称为激活网络。每次前向传播之后需要做一次反向传播更新权重和偏差
    • 对于运算的结果取最接近的整数,就能得到正确的异或运算结果

summary

  • 创建简单的神经网络,可以解决一些异或运算的问题过程,算法原理才是神经网络的重点,这里涉及了太多的数学科学知识,所以不再展开,适当了解。