从零构建的 JavaScript ML 库,按 PyTorch 设计,扩展前端 AI 应用能力。
JS-PyTorch 是一个从零开始构建的深度学习 JavaScript 库,目的是紧密跟随 PyTorch 的语法。
欢迎试用网页演示!
在这篇文章中,我们将介绍 JS-PyTorch 的简单说明和使用场景。
注:项目的文档包含所有可用操作和层的详细信息。
首先,你可以在终端运行 npm install js-pytorch 来本地安装该包。然后,在你的 JavaScript 文件中,用以下方式导入包:
const torch = require("js-pytorch");
要使用所有这些很棒的深度学习 Tensor 操作,我们需要实例化一些 Tensors:
// 实例化 Tensors:
let x = torch.randn([8,4,5]);
let w = torch.randn([8,5,4], requires_grad = true);
let b = torch.tensor([0.2, 0.5, 0.1, 0.0], requires_grad = true);
语法与 PyTorch 相同:
torch.tensor(Array) 接收一个数组并将其转换为 Tensor。
torch.randn(shape) 创建一个用正态分布随机数填充的 Tensor,具有提供的形状。
requires_grad 参数如果设置为 true,表示我们想要优化这个参数(通过跟踪其梯度)。
现在,让我们在这些 Tensors 上运行一些操作:
// 执行计算:
let out = torch.matmul(x, w);
out = torch.add(out, b);
torch.matmul(x, w) 在 x 和 w 之间执行矩阵乘法(就像 PyTorch 中一样)。
torch.add(out, b) 将两个 Tensors 相加。
注:由于 w 设置了 require_grad = true,它的子节点 out 也会被跟踪梯度。
// 计算整个计算图的梯度:
out.backward();
// 从特定 Tensors 获取梯度:
console.log(w.grad);
console.log(b.grad);
调用 out.backward() 计算所有导向它的 Tensor(其父节点)相对于 out 的梯度。
在实际应用中,我们会在 loss Tensor 上调用 .backward(),以获得减少它所需的梯度。
要访问 Tensor 的梯度,只需调用 Tensor.grad。
在这个示例中,我们实现了一个完整的神经网络,包含三个线性层和 ReLU 激活函数。nn.Module 类的语法与 PyTorch 的语法完全相同。
const torch = require("js-pytorch");
const nn = torch.nn;
const optim = torch.optim;
// 实现 Module 类:
class NeuralNet extends nn.Module {
constructor(in_size, hidden_size, out_size) {
super();
// 实例化神经网络的层:
this.w1 = new nn.Linear(in_size, hidden_size);
this.relu1 = new nn.ReLU();
this.w2 = new nn.Linear(hidden_size, hidden_size);
this.relu2 = new nn.ReLU();
this.w3 = new nn.Linear(hidden_size, out_size);
};
forward(x) {
let z;
z = this.w1.forward(x);
z = this.relu1.forward(z);
z = this.w2.forward(z);
z = this.relu2.forward(z);
z = this.w3.forward(z);
return z;
};
};
// 实例化模型:
let in_size = 16;
let hidden_size = 32;
let out_size = 10;
let batch_size = 16;
let model = new NeuralNet(in_size,hidden_size,out_size);
// 定义损失函数和优化器:
let loss_func = new nn.CrossEntropyLoss();
let optimizer = new optim.Adam(model.parameters(), 3e-3);
// 实例化输入和输出:
let x = torch.randn([batch_size, in_size]);
let y = torch.randint(0, out_size, [batch_size]);
let loss;
// 训练循环:
for (let i = 0; i < 256; i++) {
let z = model.forward(x);
// 获取损失:
loss = loss_func.forward(z, y);
// 使用 torch.tensor 的 backward() 方法反向传播损失:
loss.backward();
// 更新权重:
optimizer.step();
// 在每个训练步骤后将梯度重置为零:
optimizer.zero_grad();
// 打印当前损失:
console.log(`Iter: ${i} - Loss: ${loss.data}`);
}
要为发布构建,运行 npm run build。CJS 和 ESM 模块以及 index.d.ts 将输出到 dist/ 文件夹。
要随时使用 ESLint 检查代码,运行 npm run lint。
要使用 prettier 改进代码格式,运行 npm run prettier。
希望你喜欢这个包!
关于进一步的行动,你可能需要考虑屏蔽此人和/或举报滥用。