A lightweight, pure-MoonBit tensor computation and automatic differentiation (Autograd) library.
moon add lyjttio/moongrad@0.1.7{
"import": [
"lyjttio/moongrad"
]
}moon check
moon build
moon test
moon test --target native// 创建张量
let a = @moongrad.from_array([1.0, 2.0, 3.0, 4.0], [2, 2], requires_grad=true)
let b = @moongrad.from_array([5.0, 6.0, 7.0, 8.0], [2, 2], requires_grad=true)
// 算子重载 + 矩阵乘法
let c = (a + b) * a
let d = c.matmul(b)
// 自动微分反向传播
d.backward()let x = @moongrad.from_array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], [2, 3], requires_grad=true)
// 1. Reshape 重塑形状
let y = x.reshape([3, 2])
// 2. Transpose 矩阵转置
let z = x.t() // 转置 2D 矩阵为 [3, 2]
// 3. Slice 单维与多维切片
let s1 = x.slice(1, 1, 3) // 沿第 1 维截取 [1..3]
let s2 = x.slice_multi([(0, 2), (1, 3)]) // 多维切片
s1.backward()// 定义输入与目标
let x = @moongrad.from_array([0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0], [4, 2])
let y = @moongrad.from_array([0.0, 1.0, 1.0, 0.0], [4, 1])
// 定义网络层 (Linear 2 -> 4 -> 1)
let fc1 = @moongrad.Linear::new(2, 4, requires_grad=true)
let fc2 = @moongrad.Linear::new(4, 1, requires_grad=true)
// 收集参数与构建 SGD 优化器
let params = fc1.parameters()
let p2 = fc2.parameters()
for i in 0..<p2.length() { params.push(p2[i]) }
let optimizer = @moongrad.SGD::new(params, 1.0)
// 训练循环
for epoch in 0..<1000 {
let h1 = fc1.forward(x).sigmoid()
let pred = fc2.forward(h1).sigmoid()
let loss = @moongrad.mse_loss(pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
}# 在 JavaScript 目标后端上运行演示
moon run cmd/main --target jsmoon add lyjttio/moongradmoon check
moon build
moon test
moon test --target nativelet x = @moongrad.from_array([1.0, 2.0, 3.0, 4.0], [2, 2], requires_grad=true)
let total = x.sum() // scalar tensor
let row_mean = x.mean_dim(1, false) // shape [2]
let column_max = x.max_dim(0, true) // shape [1, 2]
let argmax = x.argmax_dim(1, false)
total.backward()let logits = @moongrad.from_array([
2.0, 0.5, -1.0,
-0.5, 1.0, 2.5,
], [2, 3], requires_grad=true)
let labels = @moongrad.from_array([0.0, 2.0], [2])
let loss = @moongrad.cross_entropy(logits, labels)
loss.backward()let params = layer.parameters()
let optimizer = @moongrad.MomentumSGD::new(params, 0.05, 0.9)
for _ in 0..<100 {
optimizer.zero_grad()
let loss = @moongrad.mse_loss(layer.forward(input), target)
loss.backward()
let norm = @moongrad.clip_grad_norm(params, 1.0)
optimizer.step()
}let model = @moongrad.Sequential::new([
@moongrad.Linear::new(4, 8),
@moongrad.Linear::new(8, 2),
])
let logits = model.forward(batch).relu()
let accuracy = @moongrad.classification_accuracy(logits, labels)moon fmt --check
moon check --warn-list +73
moon build
moon build --target native
moon test
moon test --target native
moon info
git diff --checkpub enum Op {
Add(Tensor, Tensor)
Sub(Tensor, Tensor)
Mul(Tensor, Tensor)
Div(Tensor, Tensor)
MatMul(Tensor, Tensor)
Reshape(Tensor, Array[Int])
Transpose(Tensor, Int, Int)
Slice(Tensor, Int, Int, Int)
SliceMulti(Tensor, Array[(Int, Int)])
ReLU(Tensor)
Sigmoid(Tensor)
Tanh(Tensor)
MSELoss(Tensor, Tensor)
ReduceSum(Tensor, Int?, Bool, Bool)
Softmax(Tensor, Int)
LogSoftmax(Tensor, Int)
CrossEntropy(Tensor, Tensor)
Abs(Tensor)
Sqrt(Tensor)
Exp(Tensor)
Log(Tensor)
Pow(Tensor, Double)
Clamp(Tensor, Double, Double)
}A lightweight, pure-MoonBit tensor computation and automatic differentiation (Autograd) library.