文件结构
到目前为止很容易。
现在到这里获取Brain.js的源代码。把整个文件复制粘贴到你的brain.js文件,点击save和bam: 4个文件中的2个完成。
源代码地址:https://raw.githubusercontent.com/harthur-org/brain.js/master/browser.js
接下来是有趣的部分:决定你的机器学习什么。你可以用类似的方法解决无数的实际问题;情绪分析或图像分类。我认为处理文本的机器学习应用程序作为输入是非常有趣的,因为你可以在任何地方找到训练数据,并且他们有很多潜在的用例,所以我们在这里使用的例子将是一个处理分类文本的例子:
我们将决定一条推文是由Donald Trump还是Kim Kardashian写的。
这可能不是最有用的应用。但是推特是机器学习素材的宝库,尽管它可能是无用的,但我们的推文作者标识符仍然是一个非常明显的标志。一旦经过训练,我们的神经网络将能够看到一条从未见过的推文,然后通过识别他们写的东西的模式,判断出它是由Donald Trump还是Kim Kardashian写的。为了做到这一点,我们需要给它提供尽可能多的训练数据,以便我们可以将它复制/粘贴到我们的training-data.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 });
input: {}, output: {}
格式的训练数据之外,还有两件重要的事情需要注意。charCodeAt()
。因此,我们将使用它并将结果除以扩展ASCII字符的最大值:255(我们使用扩展ASCII,以防遇到像é或½这样的边缘情况),这将确保我们获得的值<1 。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。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"));
console.log(execute("Whether we are Republican or Democrat, we must now focus on strengthening Background Checks!"));