当前位置: 首页 > Web前端 > HTML

前端人工智能:通过机器学习推导函数方程--PlatinumⅢ

时间:2023-04-02 19:22:59 HTML

什么是tensorflow.jstensorflow.js是一个用于机器学习和机器训练的javascript库,可以运行在浏览器和nodejs上。众所周知在浏览器上用javascript计算是很慢的,而tensorflow.js会通过gpu加速基于WebGL的高性能机器学习模块的计算,让我们的前端开发者可以进行机器学习和在浏览器网络中训练神经网络。本文要讲解的项目代码是根据一些规则模拟数据,然后利用机器学习和训练,根据这些数据反向推断生成这些数据的公式函数。基本概念接下来,我们用五分钟的时间来谈谈tensorflow的基本概念。这部分主要介绍一些概念。笔者将通过一些类比的方式对一些概念进行简单的描述,旨在帮助大家快速理解,但限于篇幅和精力,具体概念的详细定义请读者参考官方文档。张量(tensors)张量其实就是一个数组,可以是一维数组,也可以是多维数组。张量是tensorflow.js中的数据单元。常量张量=tf.tensor([[1.0,2.0,3.0],[10.0,20.0,30.0]]);张量.print();会在浏览器中输出:tensorflow还提供语义张量创建函数:tf.scalar(创建零维张量)、tf.tensor1d(创建一维张量)、tf.tensor2d(创建二维张量)、tf.tensor3d(创建三维张量)、tf.tensor4d(创建四维张量)和tf.ones(张量中的值都为1)或tf.zeros(值在张量中都是0)。Variable(变量)Tensor张量是不可变的,而variable变量是可变的,variable由tensor初始化,代码如下:constinitialValues=tf.zeros([5]);//[0,0,0,0,0]constbiases=tf.variable(initialValues);//通过tensorbiases.print()初始化变量;//输出[0,0,0,0,0]operations(操作)tensor运算符可以进行操作,如add(加法)、sub(减法)、mul(乘法)、square(平方)、mean(平均的)。conste=tf.tensor2d([[1.0,2.0],[3.0,4.0]]);常量f=tf.tensor2d([[5.0,6.0],[7.0,8.0]]);conste_plus_f=e。添加(f);e_plus_f.print();上面例子的输出:内存管理(dispose和tf.tidy)dispose和tf.tidy是用来清空GPU缓存的,相当于我们写js代码的时候,通过给这个变量赋值null的意思就是清空缓存。vara={num:1};a=null;//clearcachedispose可以dispose张量和变量来清除GPU缓存:constx=tf.tensor2d([[0.0,2.0],[4.0,6.0]]);constx_squared=x.squared();x.dispose();x_squared.dispose();tf.tidy当有多个tensors和variables的时候,一个一个调用dispose太麻烦了,于是有了tf.tidy,把张量或变量操作放在tf.tidy函数中,它会自动帮我们优化和清空缓存。const平均值=tf.tidy(()=>{consty=tf.tensor1d([4.0,3.0,2.0,1.0]);constz=tf.ones([1]);returny.sub(z);});平均。print()上面例子的输出:模拟数据首先,我们需要模拟一组数据,根据这个三次方程,生成[-1,1]这个区间有误差的一些数据,数据可视化如下:假设我们不知道a、b、c、d这四个参数的值,我们需要通过这堆数据,利用机器学习和机器训练来逆向推导多项式函数方程及其四个参数值a、b、c、d。设置变量(Setupvariables)因为我们要反向推导多项式方程的a,b,c,d四个参数值,所以首先我们需要定义这四个变量,并给它们赋一些随机数作为初始值。consta=tf.variable(tf.scalar(Math.random()));constb=tf.variable(tf.scalar(Math.random()));constc=tf.variable(tf.scalar(数学。随机的()));constd=tf.variable(tf.scalar(Math.random()));上面四行代码,tf.scalar是创建一个零维张量,tf.variable是将我们的张量转换并初始化为变量variable。如果用我们平时的javascript来理解,上面四行代码相当于:leta=Math.random();letb=Math.random();letc=Math.random();letd=Math。随机的();我们给a,b,c,d四个参数值赋初始随机值后,a=0.513,b=0.261,c=0.259,d=0.504,我们把这些参数放入后得到的曲线方程如下:我们可以看到,将随机生成的a、b、c、d四个参数并入多项式后生成的数据,与真实数据模拟出的曲线有很大的不同。这就是我们接下来要做的。通过机器学习和训练,我们会不断调整a、b、c、d这四个参数,让这条曲线尽可能地无限接近实际。数据曲线。创建一个优化器(Createanoptimizer)constlearningRate=0.5;constoptimizer=tf.train.sgd(learningRate);变量learningRate是定义学习率,每次机器训练时会根据学习率的大小进行计算偏移调整范围,学习率越低,最终预测值越准确,但是response会增加程序的运行时间和计算量。学习率高会加快学习过程,但由于偏移过大,容易造成围绕正确值的波动,导致计算结果不准确。tf.train.sgd是我们在tensorflow.js中为我们选择封装的SGD优化器,也就是随机梯度下降法。在机器学习算法中,通常使用梯度下降法来训练我们的算法。梯度下降法常用的有三种形式:BGD、SGD和MBGD。我们使用SGD的batchgradientdescent方法,因为每次梯度下降更新一个训练参数,机器训练的速度会随着样本数的增加而变得很慢。随机梯度下降被提出来解决这个问题。假设一般线性回归函数的作用是:SGD利用每个样本的损失函数计算θ的偏导数得到对应的梯度来更新θ:随机梯度下降对每个样本迭代更新一次,相比batchabove梯度下降要求所有训练样本都用于一次迭代。SGD迭代次数大,在解空间的搜索过程显得盲目。但通常它会向最优值移动。随机梯度下降收敛图如下:期望函数模型(trainingprocessfunctions)写期望函数模型其实就是用一系列的操作来描述我们的函数模型functionpredict(x){//y=a*x^3+b*x^2+c*x+d返回tf.tidy(()=>{返回a.mul(x.pow(tf.scalar(3,'int32'))).add(b.mul(x.square())).add(c.mul(x)).add(d);});}a.mul(x.pow(tf.scalar(3,'int32')))描述ax^3(a乘以x的立方),b.mul(x.square()))描述bx^2(b乘以x的平方),c.mul(x)同理。注意predict函数返回时用tf.tidy包裹,这是为了方便内存管理,优化机器训练过程的内存。定义损失函数(loss)接下来我们需要定义一个损失函数,使用MSE(meansquarederror,均方误差)。数理统计中的均方误差是指参数的估计值与参数真实值之差的平方的期望值,记为MSE。MSE是一种更方便的衡量“平均误差”的方法。MSE可以评估数据变化的程度。MSE的值越小,说明预测模型描述实验数据的准确性越好。MSE的计算很简单,就是先根据给定的x求出实际y值与预测y值的差值的平方,然后计算这些差值的平方的平均值。根据以上,我们的损失函数代码如下:returnerror;}期望值预测减去标签实际值,然后计算平方后的平均值。机器训练(training)好了,上面说了这么多,铺垫和准备也做了这么多,终于到了最关键的一步了。下面的代码和函数是真正根据数据进行计算,然后通过机器学习和训练得到的。获得预期结果的最重要步骤。我们定义了基于SGD随机梯度下降的optimizer优化器,然后定义了基于MSE均方误差的损失函数。我们应该如何结合这两种设备进行机器训练和机器学习?请参阅下面的代码。constnumIterations=75;asyncfunctiontrain(xs,ys,numIterations){for(letiter=0;iter{constpred=predict(xs);//损失函数:MSE均方误差返回loss(pred,ys);});//防止阻塞浏览器awaittf.nextFrame();}}我们在外层定义了一个numIterations=75,这意味着我们要进行75次机器训练。在每个循环中,我们调用optimizer.minimize函数,它会不断调用SGD随机梯度下降法不断更新修正我们的四个参数a,b,c,d,每次返??回我们都会一直调用我们的MSE-based均方误差损失函数来减少损失。经过这75次机器训练和机器学习,加上SGD随机梯度下降优化器和loss损失函数进行标定,就会得到非常接近正确值的a,b,c,d四个参数结束。我们注意到在这个函数的末尾有一行tf.nextFrame()。该功能是为了解决在机器训练和机器学习过程中会进行大量的机器操作,会阻塞浏览器导致ui无法更新的问题。我们调用这个机器训练的函数train:import{generateData}from'./data';//这个文件在git仓库里consttrainingData=generateData(100,{a:-.8,b:-.2,c:.9,d:.5});等待火车(trainingData.xs,trainingData.ys,75);调用train函数后,我们可以得到a、b、c、d四个参数。console.log('a',a.dataSync()[0]);console.log('b',b.dataSync()[0]);console.log('c',c.dataSync()[0]);console.log('d',d.dataSync()[0]);最终得到的值为a=-0.564,b=-0.207,c=0.824,d=0.590,而原来定义的实际值a=-0.8,b=-0.2,c=0.9,d=0.5是很接近。对比图如下:项目运行与安装本文涉及的代码安装与运行步骤如下:gitclonehttps://github.com/tensorflow/tfjs-examplescdtfjs官方示例中有很多项目-examples/polynomial-regression-coreyarnwatchtensorflow.js,其中polynomial-regression-core(多项式方程回归恢复)example是我们本文重点介绍的代码,我在安装过程中不是很顺利。每次运行都会报缺少模块的错误。读者只需要根据报错信息,将缺少的模块一一安装,然后根据报错信息去谷歌搜索相应的解决方案即可。它终于奏效了。结语那么多bb,本来不想写结语的,但是想了想还是想表达一下心里的一个好笑又荒唐的想法。为什么我对这个人工智能的例子感兴趣?因为,在我的广西老家(一个偏远的山村),封建迷信比较多,我经常用一个人的生辰八字来推算和预测这个人的寿命。缘分,巴拉巴拉说了很多,我一直对这些潮流嗤之以鼻。但是,但是,但是。...荒谬的事情来了。十年前,我的岳父在一场车祸中摔断了一条腿。几年前,他带着妻子和岳父回老家探亲。我去找乡下的老人算账,老人说了一大堆,说了我公公出车祸的具体日期,准确到下午的大概时间那天。....这。...这个很有趣。..当年整个空气突然安静下来的情景,至今还历历在目。毕竟,我从来不相信这些听话的东西。我一直相信科学是引领我们飞翔的唯一真理,但是。..真的是因为这件事,让我不知道该如何评价。...嗯?这和人工智能有什么关系?我就在想,是不是我们每个人的八字是笛卡尔平面坐标系上的维度,或者出生八字是多项式函数的a,b,c,d,e系数,真的有吗一个多项式函数方程可以将这些出生日期系数串联起来得到一个公式,它可以描述你的一生,记录你的过去,预测你的未来。.....我们能不能找到对应的维度,把它和发生的事情联系起来,然后用人工智能去学习和训练一个属于我们自己生命轨迹的函数。...好了,不说了,各位看官看到了,我也心疼你们,好好学习,把我说的忘了。以上观点纯属个人意淫。搬砖要搬砖,要带娃。祝大家早日在前端一帆风顺。!^_^!作者:第一蝌蚪github地址:https://github.com/airuikun结语最后,TNFE团队为前端开发者整理了小程序和web前端技术领域的最新优质内容,周报更新?,欢迎star,github地址:https://github.com/Tnfe/TNFE-...