AiTechYun
编辑:xiaoshan.xiang
本文的内容并不是关于神经网络的深度教程,在这里既不会深入研究输入层、激活函数的内部原理,也不会教你如何使用Tensorflow。它只是一个简单的,初学者级别的文章,这篇文章是关于如何实现Brain.js的浅显解释。
以下是我们将要做的:
1.创建起始文件
2.想用神经网络做什么
3.设置Brain.js并找出如何处理训练数据和用户输入
4.收集一些训练数据
5.运行神经网络
6.用处
如果你希望只下载此项目的工作版本,而不是按照文章进行操作,那么可以在这里复制GitHub存储库。
创建一个新目录并在其中放置一个线上的index.html样板文件。然后创建三个JS文件:brain.js,training-data.js和scripts.js(或用于默认JS文件的任何通用术语),当然,还可以将所有这些文件导入到index.html文件的底部。
文件结构
到目前为止很容易。
现在到这里获取Brain.js的源代码。把整个文件复制粘贴到你的brain.js文件,点击save和bam: 4个文件中的2个完成。
接下来是有趣的部分:决定你的机器学习什么。你可以用类似的方法解决无数的实际问题;情绪分析或图像分类。我认为处理文本的机器学习应用程序作为输入是非常有趣的,因为你可以在任何地方找到训练数据,并且他们有很多潜在的用例,所以我们在这里使用的例子将是一个处理分类文本的例子:
我们将决定一条推文是由Donald Trump还是Kim Kardashian写的。
这可能不是最有用的应用。但是推特是机器学习素材的宝库,尽管它可能是无用的,但我们的推文作者标识符仍然是一个非常明显的标志。一旦经过训练,我们的神经网络将能够看到一条从未见过的推文,然后通过识别他们写的东西的模式,判断出它是由Donald Trump还是Kim Kardashian写的。为了做到这一点,我们需要给它提供尽可能多的训练数据,以便我们可以将它复制/粘贴到我们的training-data.js文件中,然后我们可以看看否能识别出一些推文的作者。
现在,要做的就是在我们的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值被传递,而另外两个输入传递一个R,G和B值。另外,即使上面的例子将输入显示为对象,但你也可以使用数组。我提到这很大程度上是因为我们将在我们的项目中传递不同长度的数组。
其次,这些不是有效的RGB值。如果你真的想要使用它们,它们中的每一个都会变成黑色。这是因为输入值必须介于0和1之间才能让Brain.js一起工作。所以,在上面的例子中,每一种颜色都必须被处理(很可能是通过一个除以255的函数——RGB的最大值),以使其工作。我们也会做同样的事情。
因此,如果我们想让神经网络接受推文(即字符串)作为输入,我们需要通过一个类似的函数(以下称为encode())来运行它们,这会将字符串中的每个字符转换为介于0和1并将其存储在一个数组中。幸运的是,Javascript有一个固有方法将任何字符转换为ASCII码,称为charCodeAt()
。因此,我们将使用它并将结果除以扩展ASCII字符的最大值:255(我们使用扩展ASCII,以防遇到像é或½这样的边缘情况),这将确保我们获得的值<1 。
另外,我们会将我们的训练数据存储为纯文本(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中,然后准备开始下一步。
最后是我们的训练数据。就像我之前提到的,我们将所有推文存储为文本,并将它们编码为数字值,这将使你在实际需要复制/粘贴训练数据时变得更加轻松。没有必要的格式。只需粘贴文本并添加一个新行。
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个样本;我只是不想让这个样本占太多空间。当然,神经网络的准确性将会与所提供的训练数据的数量成比例地增加,所以你可以随意使用样本,看看它是如何影响你的结果的。
现在,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!"));
结果是:
现在你有一个神经网络,可以训练你想要的任何文本。你可以轻松地调整它,以识别电子邮件或公司的在线评论,识别垃圾邮件,分类博客帖子,确定邮件是否紧急等。尽管我们的推特标识符是无用的,但它仍然说明了一个非常有趣的观点:像这样的神经网络可以根据作者的写作方式执行任务。
所以,即使你不去创建一个以机器学习为动力的创新工具,这仍然对你开发者工具非常有帮助。
更多内容了解,请关注。