DJL 2.3 多输入神经元的概念及应用

我们的游戏难度要加大了,现在每次执行轰炸的飞机速度都不一样,

为了更好的解决这个问题,我们需要学习多输入神经元的概念

上一节我们讲到了一个输入对应一个输出的神经元,这种是一个特例,更多的神经元是多输入的,就是多个输入对应一个输出。就像函数有多个参数,但是只有一个输出。
两个输入
三个已经更多输入
多输入的神经元的数学表达式是这样的
f(x1,x2…xn)=w1x1 + w2x2 + … + wnxn + b
这个表达式中每一个输入都对应一个w超参,但只有一个b参数

对应的代码

    //神经元
    private static int neuron(int[] xArr,int[] wArr,int b){
        int res = 0;
        for (int i = 0; i < xArr.length; i++) {
            res += wArr[i] + xArr[i];
        }
        
        res += b;
        return res;
    }

多神经元输入在神经网络的应用中非常常见,比如课程刚开始我们看到的那张神经网络图就是由一个输入层+三个隐藏层+一个输出构成由众多神经元组成的神经网络(这里神经网络分成的细节我们会在后面学习,这里只做了解),其中隐藏层和输出层的神经元都是多输入单输出的。
多层神经网络
回到升级的轰炸机游戏这个问题上,飞机每次起飞的速度都不相同,所以这个数就不再是常量
结合投弹点公式 y = x - v * Math.sqrt(2 * h / g)
我们依然知道Math.sqrt(2 * h / g)是一个常量,我们令 w2 = Math.sqrt(2 * h / g)
可以得到 y = x - v * w2 => 也就是 f(x,v) = x - v * w2
已知两个输入的的神经元表达式 f(x1,x2) = w1 * x1 + w2 * x2 + b
本例中相对简单一点,其中w1 = 1,b = 0,我们只需要找到w2的值就可以了

运行实例代码

  public static void main(String[] args) {
            PlaneFire.lv2Ready((velocity,targetX) -> {
                float location = PlaneFire.lv2Demo(velocity, targetX);
                System.out.printf("velocity = %s, targetX = %s => location = %s \n", velocity, targetX, location);
                PlaneFire.fireLv2(velocity,targetX, (int)location);
            });

            //velocity = 173, targetX = 452 => location = 126.0
    }

得到 velocity = 173, targetX = 452 => location = 126.0
可以计算出w2 = 1.88

于是我们编写多输入神经元计算代码

public static void main(String[] args) {
            PlaneFire.lv2Ready((velocity,targetX) -> {
                float location = ai(velocity,targetX);
                PlaneFire.fireLv2(velocity,targetX, (int) location);
            });
    }

    //AI
    private static float ai(int velocity, Integer targetX){
        float w1 = 1f,w2 = -1.88f,b = 0f;
        float[] xArr = {targetX,velocity};
        float[] wArr = {w1,w2};
        return neuron(xArr,wArr,b);
    }

    //神经元
    private static float neuron(float[] xArr,float[] wArr,float b){
        float res = 0;
        for (int i = 0; i < xArr.length; i++) {
            res += wArr[i] * xArr[i];
        }

        res += b;
        return res;
    }

经过试验可以看到飞机准确的命中了目标,到此同学们可能会有疑问,我耐着性子看了半天你用的都是数学方法来编写代码?是的ai框架的基本原理就是使用了这些基本的数学运算,并没有多么高不可攀,ai框架的优势不在这些简单的问题上,相反在这些简单的甚至在复杂10倍的问题上数学计算都更加高效稳定,但是当输入的参数多大100或者1000的时候,比如一张1010像素的图片识别的问题是,一张100100的图片的输入就高达10000个输入,这时传统的数学方法就显得捉襟见肘。

好了,我预告一下,下一节我们的飞机投弹游戏难度会进一步增加,这回轰炸目标会同时在xy轴上变化,同学们可以尝试采用数学方法找出投弹点,思考如何用神经元方法实现。
xy轴上的变化

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值