【学术】不懂神经网络?不怕,一文教你用JavaScript构建神经网络

AiTechYun

编辑:xiaoshan.xiang

本文的内容并不是关于神经网络的深度教程,在这里既不会深入研究输入层、激活函数的内部原理,也不会教你如何使用Tensorflow。它只是一个简单的,初学者级别的文章,这篇文章是关于如何实现Brain.js的浅显解释。

开始

以下是我们将要做的:

1.创建起始文件

2.想用神经网络做什么

3.设置Brain.js并找出如何处理训练数据和用户输入

4.收集一些训练数据

5.运行神经网络

6.用处

如果你希望只下载此项目的工作版本,而不是按照文章进行操作,那么可以在这里复制GitHub存储库。

1 起始文件

创建一个新目录并在其中放置一个线上的index.html样板文件。然后创建三个JS文件:brain.js,training-data.js和scripts.js(或用于默认JS文件的任何通用术语),当然,还可以将所有这些文件导入到index.html文件的底部。

文件结构

到目前为止很容易。

现在到这里获取Brain.js的源代码。把整个文件复制粘贴到你的brain.js文件,点击save和bam: 4个文件中的2个完成。

2 “我的目的是什么?”

接下来是有趣的部分:决定你的机器学习什么。你可以用类似的方法解决无数的实际问题;情绪分析或图像分类。我认为处理文本的机器学习应用程序作为输入是非常有趣的,因为你可以在任何地方找到训练数据,并且他们有很多潜在的用例,所以我们在这里使用的例子将是一个处理分类文本的例子:

我们将决定一条推文是由Donald Trump还是Kim Kardashian写的。

这可能不是最有用的应用。但是推特是机器学习素材的宝库,尽管它可能是无用的,但我们的推文作者标识符仍然是一个非常明显的标志。一旦经过训练,我们的神经网络将能够看到一条从未见过的推文,然后通过识别他们写的东西的模式,判断出它是由Donald Trump还是Kim Kardashian写的。为了做到这一点,我们需要给它提供尽可能多的训练数据,以便我们可以将它复制/粘贴到我们的training-data.js文件中,然后我们可以看看否能识别出一些推文的作者。

3 设置和数据处理

现在,要做的就是在我们的scripts.js文件中设置Brain.js,并在training-data.js文件中为其提供一些训练数据。但在我们做这些之前,让我们先换一个角度看看所有这些将如何工作。

设置Brain.js非常简单,所以我们不会花费太多时间,但是有一些关于如何预测其输入数据格式化的细节,我们应该先完成。我们先看一下文档中包含的设置示例,这些示例很好地说明了这一点:

let net= new brain.NeuralNetwork();

net.train([
  {
    Input: { r:0.03, g:0.7, b:0.5 },
    Output: { black:1 }
  },{
    Input: { r:0.16, g:0.09, b:0.2 },
    Output: { black:1 }
  },{
    Input: { r:0.5, b:0.5 },
    Output: { black:1 }
  }
]);

let output= net.run({ r:1, g:0.4, b:0 });

首先,上面的例子实际上是通过观察给定的颜色,告诉你黑色文本或白色文本哪个会更清晰。这可以说明Brain.js容易使用。只需要实例化,训练,然后运行。就可以了。我的意思是,如果你可以将训练数据内联为3行代码,那很酷。

现在让我们来解释一下训练数据。在上面的例子中,除了:input: {}, output: {} 格式的训练数据之外,还有两件重要的事情需要注意。

首先,数据不需要长度都相同。正如你在上面第11行所看到的,只有一个R和一个B值被传递,而另外两个输入传递一个RGB值。另外,即使上面的例子将输入显示为对象,但你也可以使用数组。我提到这很大程度上是因为我们将在我们的项目中传递不同长度的数组。

其次,这些不是有效的RGB值。如果你真的想要使用它们,它们中的每一个都会变成黑色。这是因为输入值必须介于0和1之间才能让Brain.js一起工作。所以,在上面的例子中,每一种颜色都必须被处理(很可能是通过一个除以255的函数——RGB的最大值),以使其工作。我们也会做同样的事情。

3.1 encode()

因此,如果我们想让神经网络接受推文(即字符串)作为输入,我们需要通过一个类似的函数(以下称为encode())来运行它们,这会将字符串中的每个字符转换为介于0和1并将其存储在一个数组中。幸运的是,Javascript有一个固有方法将任何字符转换为ASCII码,称为charCodeAt()。因此,我们将使用它并将结果除以扩展ASCII字符的最大值:255(我们使用扩展ASCII,以防遇到像é或½这样的边缘情况),这将确保我们获得的值<1 。

3.2 processTrainingData()

另外,我们会将我们的训练数据存储为纯文本(plain text),而不是将编码数据存储到我们的A.I.中。所以我们需要另一个函数(以下称为processTrainingData()),它将前面提到的编码函数应用于我们的训练数据,有选择地将文本转换为编码字符,并返回一组训练数据,这些数据将非常适合Brain.js。

这里是所有的代码(这会进入’scripts.js’文件中):

let trainedNet;

function encode(arg) {
   return arg.split('').map(x => (x.charCodeAt(0) / 255));
}

function processTrainingData(data) {
   return data.map(d => {
       return {
           input: encode(d.input),
           output: d.output
       }
   })
}

function train(data) {
   let net = new brain.NeuralNetwork();
   net.train(processTrainingData(data));
   trainedNet = net.toFunction();
   console.log('Finished training...');
};

function execute(input) {
   let results = trainedNet(encode(input));
   let output;
   results.trump > results.kardashian ? output = 'Trump' : output = 'Kardashian';
   return output;
}

train(trainingData);

在这里你会注意到,在前面的文档中没有提到的东西(除了我们已经讨论过的两个辅助函数之外)在train()函数中的第20行,它将训练过的神经网络保存到一个名为trainedNet的全局变量中。这可以防止我们每次使用它时重新训练神经网络。一旦网络被训练并保存到变量中,我们就可以把它当作一个函数,然后传入我们的编码输入(如execute()函数中的第25行所示)来使用A.I。

好的,现在你的index.html,brain.js和scripts.js文件已经完成了。现在我们需要的是将一些东西放入training-data.js中,然后准备开始下一步。

4 训练

最后是我们的训练数据。就像我之前提到的,我们将所有推文存储为文本,并将它们编码为数字值,这将使你在实际需要复制/粘贴训练数据时变得更加轻松。没有必要的格式。只需粘贴文本并添加一个新行。

const trainingData= [
   {
       input:"Inside Chi's nursery",
       output: { kardashian:1 }
   },{
       input:"Why I dyed my hair pink",
       output: { kardashian:1 }
   },{
       input:"Feeling Blue (wearing @kkwbeauty powder contour in medium & dark contour kit as eye shadow, & a new lip coming soon)",
       output: { kardashian:1 }
   },{
       input:"I will be interviewed by @JudgeJeanine on @FoxNews at 9:00 P.M. Enjoy!",
       output: { trump:1 }
   },{
       input:"Dem Memo: FBI did not disclose who the clients were - the Clinton Campaign and the DNC. Wow!",
       output: { trump:1 }
   },{
       input:"Thank you to the great men and women of the United States @SecretService for a job well done!",
       output: { trump:1 }
   }
]

再加上你的training-data.js文件,就完成了!

注:虽然上面的示例显示每个人有3个样本,但我使用了10个样本;我只是不想让这个样本占太多空间。当然,神经网络的准确性将会与所提供的训练数据的数量成比例地增加,所以你可以随意使用样本,看看它是如何影响你的结果的。

5 执行

现在,script.js文件底部加一行以运行新训练的神经网络,该文件调用execute()函数,并传递来自Trump或Kardashian的推文;确认console.log。因为我们还没有创建UI。这是Kim Kardashian的一条推文,它不在我的训练数据中(也就是说,神经网络从来没有遇到过这条推文):

console.log(execute("These aren't real. Kanye would never write Yeezy on the side"));

然后打开本地主机上index.html页面,检查控制台。

该神经网络正确地识别了一条从未见过的推文,这条推文是金·卡戴珊(Kim Kardashian)发的,可能性为86%。

现在让我们再来试试Trump的推文。

console.log(execute("Whether we are Republican or Democrat, we must now focus on strengthening Background Checks!"));

结果是:

6 用处

现在你有一个神经网络,可以训练你想要的任何文本。你可以轻松地调整它,以识别电子邮件或公司的在线评论,识别垃圾邮件,分类博客帖子,确定邮件是否紧急等。尽管我们的推特标识符是无用的,但它仍然说明了一个非常有趣的观点:像这样的神经网络可以根据作者的写作方式执行任务。

所以,即使你不去创建一个以机器学习为动力的创新工具,这仍然对你开发者工具非常有帮助。

更多内容了解,请关注。

原文发布于微信公众号 - ATYUN订阅号(atyun_com)

原文发表时间:2018-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

R语言数据处理:飞机航行距离与到达延误时间有什么关系??

数据分析有一半以上的时间会花在对原始数据的整理及变换上,包括选取特定的分析变量、汇总并筛选满足条件的数据、排序、加工处理原始变量并生成新的变量、以及分组汇总数...

38640
来自专栏javascript趣味编程

3.1 Contour绘制

首先一起学习利用百度的开源项目绘制contour,百度搜索“echarts heatmap”,找到热力图的一个案例(http://echarts.baidu.c...

14000
来自专栏媒矿工厂

基于MCMC的X265编码参数优化方法

新一代视频编码标准,包括高效视频编码HEVC和音频视频编码标准AVS2近年来已被提出以进一步提高H.264/AVC编码标准的压缩性能。在相同的主观视觉的前提下,...

34430
来自专栏ACM算法日常

除以3,乘以2(STL+排序)- Codeforces 997D

Polycarp likes to play with numbers. He takes some integer number x, writes it d...

12420
来自专栏数据小魔方

带实际执行进度的甘特图

今天要跟大家分享的图标是带实际执行进度的甘特图! ▽▼▽ 由于本图所用到的技巧和思路特别复杂,过程相对繁琐,所以本案例的介绍会省略掉很多细节性的步骤,否则图文会...

39750
来自专栏UAI人工智能

[译] TensorFlow 白皮书

55360
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现)。

      今天我们来花点时间再次谈谈一个模糊算法,一个超级简单但是又超级牛逼的算法,无论在效果上还是速度上都可以和Boxblur, stackblur或者是G...

426100
来自专栏数据小魔方

R语言可视化——数据地图应用(东三省)

今天是一个案例应用,采用东北三省地图进行离散颜色映射,让大家感受下R语言在地理信息空间可视化方面的强大功能,同时也会对之前强调过的地图配色技巧进行应用。 加载工...

1.1K50
来自专栏深度学习之tensorflow实战篇

数据挖掘PageRank算法(网页排名原理)及Map-Reduce实现

方法/步骤 1 一、什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google...

48090
来自专栏机器学习和数学

[Tensorflow] TensorFlow之Hello World!(1)

哇!今天挺开心的,30天的时间,19篇文章,2459人阅读,5313人次阅读!今天开通的原创标识,恩!除了激动,就是非常感谢大家的支持!感谢大家的支持!大家的支...

35860

扫码关注云+社区

领取腾讯云代金券