g := gorgonia.NewGraph()
x := gorgonia.NewMatrix(g, gorgonia.Float32, gorgonia.WithShape(1, 160*60*3), gorgonia.WithName("x"))
y := gorgonia.NewMatrix(g, gorgonia.Float32, gorgonia.WithShape(1, 36*4), gorgonia.WithName("y")) // 假设4位验证码,字符集36个
pred, _ := buildModel(g, x, 36*4)
loss := gorgonia.Must(gorgonia.Mean(gorgonia.Must(gorgonia.Square(gorgonia.Must(gorgonia.Sub(pred, y))))))
vm := gorgonia.NewTapeMachine(g)
solver := gorgonia.NewAdamSolver(gorgonia.WithLearnRate(0.001))
// 每张图片训练一轮(也可以 batch 处理)
for epoch := 0; epoch < 10; epoch++ {
for _, imgFile := range captchaFiles {
imgTensor, labelStr, _ := loadImageTensor(imgFile)
labelVec := OneHotEncode(labelStr) // 自定义函数,将 "B7KD" 转为 one-hot 编码向量
gorgonia.Let(x, imgTensor)
gorgonia.Let(y, labelVec)
_ = vm.RunAll()
_ = solver.Step(gorgonia.Nodes{w0, w1})
vm.Reset()
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.