适用于浏览器和Node.js的GPU加速神经网络JavaScript库
<p style="text-align: center" align="center"><a href="https://brain.js.org"><img src="https://img.shields.io/website?up_message=brain.js.org&url=https%3A%2F%2Fbrain.js.org" alt="GitHub"></a>
<a href="https://twitter.com/brainjsfnd"><img src="https://img.shields.io/twitter/follow/brainjsfnd?label=Twitter&style=social" alt="Twitter"></a>
brain.js
是一个用JavaScript编写的GPU加速神经网络库。
:bulb: 这是harthur/brain的延续,该项目已不再维护。更多信息
您可以使用npm安装brain.js
:
npm install brain.js
<script src="//unpkg.com/brain.js"></script>
Brain.js
依赖于原生模块headless-gl
来支持GPU。在大多数情况下,从npm安装brain.js
应该能正常工作。但是,如果遇到问题,这意味着无法从GitHub仓库下载预构建的二进制文件,您可能需要自己构建。
请确保已安装并更新以下依赖项,然后运行:
npm rebuild
apt
的build-essential
包获得)sudo apt-get install -y build-essential libglew-dev libglu1-mesa-dev libxi-dev pkg-config
npm config set msvs_version 2022
注意:这在npm的现代版本中不再有效。npm config set python python3
注意:这在npm的现代版本中不再有效。* 如果您使用的是Build Tools 2017
,则运行npm config set msvs_version 2017
注意:这在npm的现代版本中不再有效。
以下是一个使用brain.js
近似XOR函数的示例:
有关配置的更多信息,请参见此处。
:bulb: Brain.js的有趣实用介绍
// 提供可选的配置对象(或undefined)。显示默认值。 const config = { binaryThresh: 0.5, hiddenLayers: [3], // 网络中隐藏层大小的整数数组 activation: 'sigmoid', // 支持的激活类型:['sigmoid', 'relu', 'leaky-relu', 'tanh'] leakyReluAlpha: 0.01, // 支持'leaky-relu'激活类型 }; // 创建一个简单的前馈神经网络,使用反向传播 const net = new brain.NeuralNetwork(config); net.train([ { input: [0, 0], output: [0] }, { input: [0, 1], output: [1] }, { input: [1, 0], output: [1] }, { input: [1, 1], output: [0] }, ]); const output = net.run([1, 0]); // [0.987]
或者 有关配置的更多信息,请参见此处。
// 提供可选的配置对象,显示默认值。 const config = { inputSize: 20, inputRange: 20, hiddenLayers: [20, 20], outputSize: 20, learningRate: 0.01, decayRate: 0.999, }; // 创建一个简单的循环神经网络 const net = new brain.recurrent.RNN(config); net.train([ { input: [0, 0], output: [0] }, { input: [0, 1], output: [1] }, { input: [1, 0], output: [1] }, { input: [1, 1], output: [0] }, ]); let output = net.run([0, 0]); // [0] output = net.run([0, 1]); // [1] output = net.run([1, 0]); // [1] output = net.run([1, 1]); // [0]
然而,没有必要使用神经网络来解决异或问题。(-: 所以,这里有一个更复杂、更现实的例子: 演示:训练神经网络识别颜色对比度。
你可以查看这个精彩的屏幕录像,它解释了如何使用真实世界的数据集训练一个简单的神经网络:如何使用 Brain.js 在浏览器中创建神经网络。
使用 train()
方法来用一组训练数据训练网络。网络必须在一次 train()
调用中批量训练所有数据。更多的训练模式可能需要更长的训练时间,但通常会得到一个更擅长分类新模式的网络。
训练在计算上是昂贵的,所以你应该尝试离线(或在 Worker 中)训练网络,并使用 toFunction()
或 toJSON()
选项将预训练的网络插入到你的网站中。
NeuralNetwork
进行训练每个训练模式应该有一个 input
和一个 output
,两者都可以是从 0
到 1
的数字数组,或者是从 0
到 1
的数字哈希。对于颜色对比度演示,它看起来像这样:
const 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: { white: 1 } }, { input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 } }, ]); const output = net.run({ r: 1, g: 0.4, b: 0 }); // { white: 0.99, black: 0.002 }
这是上述例子的另一个变体。(注意,输入对象不需要相似。)
net.train([ { input: { r: 0.03, g: 0.7 }, output: { black: 1 } }, { input: { r: 0.16, b: 0.2 }, output: { white: 1 } }, { input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 } }, ]); const output = net.run({ r: 1, g: 0.4, b: 0 }); // { white: 0.81, black: 0.18 }
RNNTimeStep
、LSTMTimeStep
和 GRUTimeStep
进行训练每个训练模式可以是:
使用数字数组的例子:
const net = new brain.recurrent.LSTMTimeStep(); net.train([[1, 2, 3]]); const output = net.run([1, 2]); // 3
使用数字数组的数组的例子:
const net = new brain.recurrent.LSTMTimeStep({ inputSize: 2, hiddenLayers: [10], outputSize: 2, }); net.train([ [1, 3], [2, 2], [3, 1], ]); const output = net.run([ [1, 3], [2, 2], ]); // [3, 1]
RNN
、LSTM
和 GRU
进行训练每个训练模式可以是:
input
和一个 output
注意:当使用值数组时,你可以使用任何值,但是,这些值在神经网络中由单个输入表示。所以越多的不同值,输入层就越大。如果你有数百、数千或数百万个浮点值,这不是适合的类。此外,当偏离字符串时,这进入了测试阶段。
使用直接字符串的例子: 使用 Brainjs 的 Hello World
const net = new brain.recurrent.LSTM(); net.train(['I am brainjs, Hello World!']); const output = net.run('I am brainjs'); alert(output);
const net = new brain.recurrent.LSTM(); net.train([ 'doe, a deer, a female deer', 'ray, a drop of golden sun', 'me, a name I call myself', ]); const output = net.run('doe'); // ', a deer, a female deer'
使用带有输入和输出的 字符串的例子:
const net = new brain.recurrent.LSTM(); net.train([ { input: 'I feel great about the world!', output: 'happy' }, { input: 'The world is a terrible place!', output: 'sad' }, ]); const output = net.run('I feel great about the world!'); // 'happy'
AE
进行训练每个训练模式可以是:
训练一个自编码器来压缩异或计算的值:
const net = new brain.AE( { hiddenLayers: [ 5, 2, 5 ] } ); net.train([ [ 0, 0, 0 ], [ 0, 1, 1 ], [ 1, 0, 1 ], [ 1, 1, 0 ] ]);
编码/解码:
const input = [ 0, 1, 1 ]; const encoded = net.encode(input); const decoded = net.decode(encoded);
去噪嘈杂数据:
const noisyData = [ 0, 1, 0 ]; const data = net.denoise(noisyData);
测试数据样本中的异常:
const shouldBeFalse = net.includesAnomalies([0, 1, 1]); const shouldBeTrue = net.includesAnomalies([0, 1, 0]);
train()
方法的第二个参数是一个选项哈希:
net.train(data, { // 默认值 --> 预期验证 iterations: 20000, // 迭代训练数据的最大次数 --> 大于 0 的数字 errorThresh: 0.005, // 可接 受的训练数据误差百分比 --> 0 到 1 之间的数字 log: false, // true 使用 console.log,当提供函数时使用该函数 --> true 或函数 logPeriod: 10, // 日志输出之间的迭代次数 --> 大于 0 的数字 learningRate: 0.3, // 与 delta 一起缩放以影响训练速率 --> 0 到 1 之间的数字 momentum: 0.1, // 与下一层的变化值一起缩放 --> 0 到 1 之间的数字 callback: null, // 训练过程中可以触发的周期性回调 --> null 或函数 callbackPeriod: 10, // 回调调用之间的训练数据迭代次数 --> 大于 0 的数字 timeout: number, // 训练的最大毫秒数 --> 大于 0 的数字。默认 --> 无限 });
当满足以下两个条件之一时,网络将停止训练:训练误差低于阈值(默认 0.005
),或达到最大迭代次数(默认 20000
)。
默认情况下,训练不会让你知道它的进展,直到结束,但将 log
设置为 true
可以获得网络当前训练误差的定期更新。训练误差应该每次都会减少。更新将打印到控制台。如果你将 log
设置为一个函数,这 个函数将被调用来处理更新,而不是打印到控制台。
然而,如果你想在自己的输出中使用更新的值,可以将 callback
设置为一个函数来实现。
学习率是一个影响网络训练速度的参数。它是一个从 0
到 1
的数字。如果学习率接近 0
,训练时间会更长。如果学习率接近 1
,训练会更快,但训练结果可能会被限制在局部最小值,对新数据表现不佳(过拟合)。默认学习率是 0.3
。
动量类似于学习率,也期望一个从 0
到 1
的值,但它是乘以下一层的变化值。默认值是 0.1
。
这些训练选项中的任何一个都可以传入构造函数或传入 updateTrainingOptions(opts)
方法,它们将被保存在网络上并在训练时使用。如果你将网络保存为 json,这些训练选项也会被保存和恢复(除了 callback 和 log,callback 将被遗忘,log 将使用 console.log 恢复)。
默认情况下,一个名为invalidTrainOptsShouldThrow
的布尔属性被设置为true
。当该选项为true
时,如果输入的训练选项超出正常范围,将抛出一个错误,并附带有关异常选项的消息。当该选项设置为false
时,不会抛出错误,但相关信息仍会通过console.warn
发送。
trainAsync()
接受与train相同的参数(数据和选项)。它不会直接返回训练结果对象,而是返回一个promise,当promise解决时会返回训练结果对象。不适用于以下类型:
brain.recurrent.RNN
brain.recurrent.GRU
brain.recurrent.LSTM
brain.recurrent.RNNTimeStep
brain.recurrent.GRUTimeStep
brain.recurrent.LSTMTimeStep
const net = new brain.NeuralNetwork(); net .trainAsync(data, options) .then((res) => { // 使用训练好的网络做些事情 }) .catch(handleError);
对于多个网络,你可以像这样并行训练:
const net = new brain.NeuralNetwork(); const net2 = new brain.NeuralNetwork(); const p1 = net.trainAsync(data, options); const p2 = net2.trainAsync(data, options); Promise.all([p1, p2]) .then((values) => { const res = values[0]; const res2 = values[1]; console.log( `net训练了${res.iterations}次迭代,net2训练了${res2.iterations}次迭代` ); // 用两个训练好的网络做一些很酷的事情 }) .catch(handleError);
交叉验证可以为大型数据集的训练提供一种更稳健的方法。brain.js API提供了以下交叉验证示例:
const crossValidate = new brain.CrossValidate(() => new brain.NeuralNetwork(networkOptions)); crossValidate.train(data, trainingOptions, k); // 注意k(或KFolds)是可选 的 const json = crossValidate.toJSON(); // 所有统计信息以及神经网络都在json中 const net = crossValidate.toNeuralNetwork(); // 从`crossValidate`中获取表现最佳的网络 // 可选的后续操作 const json = crossValidate.toJSON(); const net = crossValidate.fromJSON(json);
CrossValidate
可以与以下类一起使用:
brain.NeuralNetwork
brain.RNNTimeStep
brain.LSTMTimeStep
brain.GRUTimeStep
使用交叉验证的示例可以在cross-validate.ts中找到
train(trainingData)
-> trainingStatustrain()
的输出是一个包含训练信息的哈希:
{ error: 0.0039139985510105032, // 训练误差 iterations: 406 // 训练迭代次数 }
run(input)
-> prediction支持以下类:
brain.NeuralNetwork
brain.NeuralNetworkGPU
-> 具有brain.NeuralNetwork
的所有功能,但在GPU上运行(通过gpu.js在WebGL2、WebGL1上运行,或回退到CPU)brain.recurrent.RNN
brain.recurrent.LSTM
brain.recurrent.GRU
brain.recurrent.RNNTimeStep
brain.recurrent.LSTMTimeStep
brain.recurrent.GRUTimeStep
示例:
// 前馈网络 const net = new brain.NeuralNetwork(); net.fromJSON(json); net.run(input); // 时间步长 const net = new brain.LSTMTimeStep(); net.fromJSON(json); net.run(input); // 循环网络 const net = new brain.LSTM(); net.fromJSON(json); net.run(input);
forecast(input, count)
-> predictions以下类可用。输出预测数组。预测是输入的延续。
brain.recurrent.RNNTimeStep
brain.recurrent.LSTMTimeStep
brain.recurrent.GRUTimeStep
示例:
const net = new brain.LSTMTimeStep(); net.fromJSON(json); net.forecast(input, 3);
toJSON() -> json
将神经网络序列化为json
fromJSON(json)
从json反序列化神经网络
如果网络训练失败,错误将超过错误阈值。这可能是因为训练数据太嘈杂(最有可能),网络没有足够的隐藏层或节 点来处理数据的复杂性,或者没有进行足够的迭代训练。
如果在20000次迭代后,训练误差仍然很大,比如0.4
,这是一个很好的迹象,表明网络无法理解给定的数据。
网络实例的maxPredictionLength
属性(默认为100)可以设置来调整网络的输出;
示例:
const net = new brain.recurrent.LSTM(); // 在代码的后面,在训练了几部小说之后,给我写一部新的! net.maxPredictionLength = 1000000000; // 小心使用! net.run('从前有一个');
使用JSON序列化或加载训练好的网络状态:
const json = net.toJSON(); net.fromJSON(json);
你还可以从训练好的网络获取一个自定义的独立函数,其行为与run()
相同:
const run = net.toFunction(); const output = run({ r: 1, g: 0.4, b: 0 }); console.log(run.toString()); // 复制粘贴!无需导入brain.js
NeuralNetwork()
接受一个选项哈希:
const net = new brain.NeuralNetwork({ activation: 'sigmoid', // 激活函数 hiddenLayers: [4], learningRate: 0.6, // 全局学习率,在使用流进行训练时很有用 });
这个参数让你指定神经网络应该使用哪个激活函数。目前支持四种激活函数 ,sigmoid是默认的:
这里有一个表格(感谢维基百科!)总结了大量的激活函数 — 激活函数
你可以使用这个来指定网络中隐藏层的数量和每层的大小。例如,如果你想要两个隐藏层 - 第一层有3个节点,第二层有4个节点,你可以这样设置:
hiddenLayers: [3, 4];
默认情况下,brain.js
使用一个隐藏层,其大小与输入数组的大小成正比。
使用https://www.npmjs.com/package/train-stream 将数据流式传输到NeuralNetwork
likely
const likely = require('brain/likely'); const key = likely(input, net);
Likely示例参见:简单字母识别
toSVG
<script src="../../src/utilities/svg.js"></script>
渲染前馈网络的网络拓扑
document.getElementById('result').innerHTML = brain.utilities.toSVG( network, options );
toSVG示例参见:网络渲染
使用的用户界面:
brain.NeuralNetwork
- 具有反向传播的前馈神经网络brain.NeuralNetworkGPU
- 具有反向传播的前馈神经网络,GPU版本brain.AE
- 具有反向传播和GPU支持的自编码器或"AE"brain.recurrent.RNNTimeStep
- 时间步长递归神经网络或"RNN"brain.recurrent.LSTMTimeStep
- 时间步长长短期记忆神经网络或"LSTM"brain.recurrent.GRUTimeStep
- 时间步长门控循环单元或"GRU"brain.recurrent.RNN
- 递归神经网络或"RNN"brain.recurrent.LSTM
- 长短期记忆神经网络或"LSTM"brain.recurrent.GRU
- 门控循环单元或"GRU"brain.FeedForward
- 具有反向传播的高度可定制的前馈神经网络brain.Recurrent
- 具有反向传播的高度可定制的递归神经网络不同的神经网络擅长做不同的事情。例如:
如果你是开发者,或者只是关心机器学习API应该是什么样子,请参与并加入W3C社区,分享你的观点或simply支持你喜欢或同意的观点。
Brain.js是JavaScript世界中广泛采用的开源机器学习库。这有几个原因,但最显著的是使用简单同时不牺牲性能。 我们希望在W3C标准方面也保持学习简单、使用简单和高性能。我们认为目前的brain.js API非常接近我们期望成为标准的样子。 由于提供支持不需要太多努力,但仍然可以产生巨大的影响,欢迎加入W3C社区组,并支持我们使用类似brain.js的API。
在这里参与W3C机器学习正在进行的标准化进程。 你也可以在这里加入我们关于标准化的公开讨论。
如果你有问题,无论是bug还是你认为对你的项目有益的功能,请让我们知道,我们会尽最大努力。
在这里创建问题并按照模板进行操作。
brain.js.org
的源代码可在Brain.js.org仓库获得。使用了出色的vue.js
和bulma
构建。欢迎随时贡献。
这个项目的存在要感谢所有做出贡献的人。[贡献]。 <a href="https://github.com/BrainJS/brain.js/graphs/contributors"><img src="https://yellow-cdn.veclightyear.com/835a84d5/529a3ec0-4039-40fa-8d61-4b44847f2daa.svg?width=890&button=false" /></a>
感谢所有我们的支持者!🙏 [成为支持者]
<a href="https://opencollective.com/brainjs#backers" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/f3822f5b-8c63-412b-9192-f8f5b79642c8.svg?width=890"></a>
通过成为赞助商来支持这个项目。你的logo将出现在这里,并附有到你网站的链接。[成为赞助商]
<a href="https://opencollective.com/brainjs/sponsor/0/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/13f6c935-4da3-4ad7-862a-d65121491e85.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/1/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/d95de445-a5c5-499e-bd04-06c0443f49a9.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/2/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/1a52d529-1eb5-46e1-9f0a-0a8111fa5b57.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/3/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/6d346982-7774-4d97-b67d-d8b3a901ab1e.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/4/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/1c350f6b-5cf1-4995-a767-67b1bf5363c3.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/5/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/d3399ba3-4a88-4d9f-8d29-50dd70ceabb6.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/6/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/e73cfaca-9d2e-4b3a-afd9-541388c1bf56.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/7/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/6884cc58-99d1-4b69-aaee-85dae10145a5.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/8/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/9922bbcc-021c-4f73-b591-5e8348c50081.svg"></a> <a href="https://opencollective.com/brainjs/sponsor/9/website" target="_blank"><img src="https://yellow-cdn.veclightyear.com/835a84d5/62278327-3f46-45c3-b9c0-82560e67d74c.svg"></a>
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻 略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让 内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应 用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号