• 【Golang星辰图】Go语言的机器学习之旅:从基础知识到实际应用的综合指南


    Go与机器学习的完美结合:构建智能应用的高效方式

    前言

    在过去几年中,机器学习和人工智能已经成为技术界的热门话题。这些技术在许多领域都有广泛应用,包括自然语言处理、图像识别和推荐系统。随着 Go 语言的不断发展,Go 中的机器学习和人工智能生态系统也在不断扩展。在这篇文章中,我们将探索 Go 中的机器学习和人工智能,介绍一些最新的技术、工具和实践。

    欢迎订阅专栏:Golang星辰图

    1. Gorgonia

    1.1 简介

    Gorgonia 是一个用于自动微分的 Go 库,类似于 TensorFlow 和 PyTorch。它使您能够动态构建计算图,并自动计算梯度,这对于机器学习和优化任务非常有用。

    1.2 张量和计算图

    在 Gorgonia 中,您使用的是张量,它们是数字的多维数组。您可以在这些张量上执行操作以构建计算图。库然后使用此图自动计算操作的梯度。

    以下是一个简单的例子,演示如何使用 Gorgonia 计算两个张量的和:

    package main
    
    import (
    	"log"
    
    	"gorgonia.org/gorgonia"
    	"gorgonia.org/tensor"
    )
    
    func main() {
    	g := gorgonia.NewGraph()
    
    	a := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(2, 3), gorgonia.WithValue(1, 2, 3, 4, 5, 6))
    	b := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(2, 3), gorgonia.WithValue(6, 5, 4, 3, 2, 1))
    
    	c := gorgonia.Must(gorgonia.Add(a, b))
    
    	if err := g.Run(); err != nil {
    		log.Fatal(err)
    	}
    
    	log.Printf("Result: %v", c.Value())
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这个例子中,我们首先创建一个新的计算图。然后,我们创建两个 2x3 的矩阵 ab,并计算它们的和 c。最后,我们运行计算图,并打印结果。

    1.3 模型训练和推断

    一旦构建了计算图,您可以使用它来训练机器学习模型。这涉及到调整模型的参数以最小化损失函数。训练后,您可以使用模型进行推断,即对新数据做出预测。

    以下是一个简单的线性回归示例:

    package main
    
    import (
    	"log"
    
    	"gorgonia.org/gorgonia"
    	"gorgonia.org/tensor"
    )
    
    func main() {
    	g := gorgonia.NewGraph()
    
    	xData := tensor.New(tensor.WithBacking([]float64{1, 2, 3, 4}), tensor.Of(tensor.Float64), tensor.WithShape(4, 1))
    	yData := tensor.New(tensor.WithBacking([]float64{3, 5, 7, 9}), tensor.Of(tensor.Float64), tensor.WithShape(4, 1))
    
    	x := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(4, 1), gorgonia.WithValue(xData.Data().([]float64)))
    	y := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(4, 1), gorgonia.WithValue(yData.Data().([]float64)))
    
    	a := gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithName("a"))
    	b := gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithName("b"))
    
    	yPred := gorgonia.Must(gorgonia.Add(gorgonia.Must(gorgonia.Mul(a, x)), b))
    
    	loss := gorgonia.Must(gorgonia.Mean(gorgonia.Must(gorgonia.Square(gorgonia.Must(gorgonia.Sub(y, yPred))))))
    
    	grads, err := gorgonia.Gradient(loss, a, b)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	// 使用梯度下降进行训练
    	learningRate := 0.01
    	for i := 0; i < 1000; i++ {
    		if err := g.Run(); err != nil {
    			log.Fatal(err)
    		}
    
    		aVal := a.Value().(tensor.Tensor)
    		bVal := b.Value().(tensor.Tensor)
    
    		a.Assign(gorgonia.Must(gorgonia.Sub(a, gorgonia.Must(gorgonia.Mul(grads[0], gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithValue(learningRate)))))))
    		b.Assign(gorgonia.Must(gorgonia.Sub(b, gorgonia.Must(gorgonia.Mul(grads[1], gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithValue(learningRate)))))))
    
    		if i%100 == 0 {
    			log.Printf("Step %d: a = %f, b = %f, loss = %f", i, aVal.Data().([]float64)[0], bVal.Data().([]float64)[0], loss.Value().(tensor.Tensor).Data().([]float64)[0])
    		}
    	}
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    在这个例子中,我们使用梯度下降法训练了一个简单的线性回归模型。我们定义了一个损失函数,并计算了关于模型参数的梯度。然后,我们使用这些梯度更新了模型参数。

    2. Go-TensorFlow

    2.1 简介

    Go-TensorFlow 是 TensorFlow 的 Go 绑定,TensorFlow 是一个由 Google 开发的流行的机器学习库。使用 Go-TensorFlow,您可以在 Go 程序中使用 TensorFlow 的功能。

    2.2 TensorFlow基础知识和概念

    TensorFlow 使用数据流图来表示计算。图中的节点表示数学操作,边表示流经它们的多维数据数组(张量)。

    2.3 在Go中使用TensorFlow进行模型训练和推断

    以下是一个使用 Go-TensorFlow 进行线性回归的示例:

    package main
    
    import (
    	"fmt"
    
    	tf "github.com/tensorflow/tensorflow/tensorflow/go"
    	"github.com/tensorflow/tensorflow/tensorflow/go/op"
    )
    
    func main() {
    	root := op.NewScope()
    	X := op.Placeholder(root.SubScope("input"), tf.Float, op.PlaceholderShape(tf.MakeShape(tf.Dim{Size: -1}, tf.Dim{Size: 1})))
    	Y := op.Placeholder(root.SubScope("output"), tf.Float, op.PlaceholderShape(tf.MakeShape(tf.Dim{Size: -1}, tf.Dim{Size: 1})))
    
    	W := op.Variable(root.SubScope("weights"), tf.Float)
    	b := op.Variable(root.SubScope("bias"), tf.Float)
    
    	op.Add(root.SubScope("model"), op.Mul(root, X, W), b)
    
    	loss := op.ReduceMean(root.SubScope("loss"), op.Square(root, op.Sub(root, Y, op.Add(root, op.Mul(root, X, W), b))))
    	trainStep := op.GradientDescent(root.SubScope("train"), loss, 0.01)
    
    	graph, err := root.Finalize()
    	if err != nil {
    		panic(err)
    	}
    
    	sess, err := tf.NewSession(graph, &tf.SessionOptions{})
    	if err != nil {
    		panic(err)
    	}
    	defer sess.Close()
    
    	xData := [][]float32{{1}, {2}, {3}, {4}}
    	yData := [][]float32{{3}, {5}, {7}, {9}}
    
    	for i := 0; i < 1000; i++ {
    		if _, err := sess.Run(map[tf.Output]*tf.Tensor{X: tensorFrom2DFloat32(xData), Y: tensorFrom2DFloat32(yData)}, []tf.Output{trainStep}, nil); err != nil {
    			panic(err)
    		}
    
    		if i%100 == 0 {
    			w, b, lossValue, err := sess.Run(map[tf.Output]*tf.Tensor{X: tensorFrom2DFloat32(xData), Y: tensorFrom2DFloat32(yData)}, []tf.Output{W, b, loss}, nil)
    			if err != nil {
    				panic(err)
    			}
    
    			fmt.Printf("Step %d: W = %v, b = %v, loss = %v\n", i, w, b, lossValue)
    		}
    	}
    }
    
    func tensorFrom2DFloat32(data [][]float32) *tf.Tensor {
    	t, err := tf.NewTensor(data)
    	if err != nil {
    		panic(err)
    	}
    	return t
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    在这个例子中,我们创建了一个线性回归模型,并使用梯度下降法进行训练。我们定义了一个损失函数,并创建了一个训练步骤。然后,我们运行了一个训练循环,在每个步骤中计算梯度并更新模型参数。

    请注意,这个例子假设您已经安装了 TensorFlow 和 Go-TensorFlow。如果您还没有安装,请按照这些说明进行操作。

    接下来,我们将讨论 Go-ONNX。

    3. Go-ONNX

    3.1 简介

    Go-ONNX 是 Open Neural Network Exchange (ONNX) 格式的 Go 绑定。ONNX 是一个用于表示机器学习模型的开放格式。使用 Go-ONNX,您可以在 Go 程序中使用 ONNX 模型。

    3.2 ONNX基础知识和概念

    ONNX 提供了一个可扩展的计算图模型定义,以及内置操作符和标准数据类型的定义。这使得 AI 框架能够使用来自其他框架的模型。

    3.3 在Go中使用ONNX进行模型推断

    以下是一个使用 Go-ONNX 进行模型推断的示例:

    package main
    
    import (
    	"fmt"
    
    	"github.com/cdipaolo/onnx-go/onnx"
    )
    
    func main() {
    	model, err := onnx.LoadModel("model.onnx")
    	if err != nil {
    		panic(err)
    	}
    	defer model.Close()
    
    	session, err := model.NewSession()
    	if err != nil {
    		panic(err)
    	}
    	defer session.Close()
    
    	inputNames := session.InputNames()
    	outputNames := session.OutputNames()
    
    	inputData := []float32{1, 2, 3, 4}
    	inputTensor, err := onnx.NewTensorFromData("input", inputData)
    	if err != nil {
    		panic(err)
    	}
    
    	outputs, err := session.Run([]*onnx.Tensor{inputTensor}, outputNames...)
    	if err != nil {
    		panic(err)
    	}
    
    	outputData := outputs[0].Data().([]float32)
    
    	fmt.Printf("Input: %v\n", inputData)
    	fmt.Printf("Output: %v\n", outputData)
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这个例子中,我们从磁盘加载了一个 ONNX 模型,并创建了一个新的会话。然后,我们创建了一个输入张量,并使用模型对其进行推断。最后,我们打印了输出。

    请注意,这个例子假设您已经安装了 Go-ONNX。如果您还没有安装,请按照这些说明进行操作。

    接下来,我们将讨论 Golearn。

    4. Golearn

    4.1 简介

    Golearn 是一个 Go 机器学习库。它提供了各种机器学习算法,包括决策树、随机森林和支持向量机。

    4.2 机器学习基础知识和概念

    机器学习涉及在数据集上训练模型,然后使用该模型对新数据进行预测。有许多不同类型的机器学习,包括监督学习、无监督学习和强化学习。

    4.3 在Go中使用golearn进行数据预处理和模型训练

    以下是一个使用 Golearn 进行数据预处理和模型训练的示例:

    package main
    
    import (
    	"fmt"
    
    	"github.com/sjwhitworth/golearn/base"
    	"github.com/sjwhitworth/golearn/evaluation"
    	"github.com/sjwhitworth/golearn/knn"
    )
    
    func main() {
    	// 创建一个新的数据集
    	dataSet := base.NewBaseDataSet(base.ClassificationData)
    
    	// 添加几个示例
    	dataSet.AddExample([]float64{1, 2}, []float64{0})
    	dataSet.AddExample([]float64{2, 3}, []float64{1})
    	dataSet.AddExample([]float64{3, 4}, []float64{1})
    	dataSet.AddExample([]float64{4, 5}, []float64{0})
    
    	// 创建一个新的 k-近邻分类器
    	classifier := knn.NewClassifier("knn", dataSet, 2)
    
    	// 对数据集进行训练
    	classifier.Train(dataSet)
    
    	// 对新数据进行预测
    	predicted, err := classifier.Predict([]float64{5, 6})
    	if err != nil {
    		panic(err)
    	}
    
    	fmt.Printf("Predicted: %v\n", predicted)
    
    	// 对分类器进行评估
    	confusionMatrix, err := evaluation.GetConfusionMatrix(classifier, dataSet)
    	if err != nil {
    		panic(err)
    	}
    
    	fmt.Printf("Confusion Matrix:\n%v\n", confusionMatrix)
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这个例子中,我们创建了一个新的数据集,并添加了一些示例。然后,我们创建了一个新的 k-近邻分类器,并使用数据集对其进行了训练。接下来,我们使用分类器对新数据进行了预测。最后,我们对分类器进行了评估。

    请注意,这个例子假设您已经安装了 Golearn。如果您还没有安装,请按照这些说明进行操作。

    接下来,我们将讨论 deeplearning4go。

    5. Deeplearning4go

    5.1 简介

    Deeplearning4go 是一个 Go 深度学习库。它提供了构建和训练神经网络的工具。

    5.2 深度学习基础知识和概念

    深度学习是一种机器学习,它涉及训练人工神经网络。这些网络可以学习表示数据中的复杂模式。

    5.3 在Go中使用deeplearning4go进行深度学习任务

    以下是一个使用 Deeplearning4go 进行深度学习任务的示例:

    package main
    
    import (
    	"fmt"
    
    	"github.com/goki/mat32"
    	"github.com/goki/mat32/randmat"
    	"github.com/nlpodyssey/spago/pkg/mat"
    	"github.com/nlpodyssey/spago/pkg/ml/ag"
    	"github.com/nlpodyssey/spago/pkg/ml/nn"
    	"github.com/nlpodyssey/spago/pkg/nlp/corpus/text"
    )
    
    func main() {
    	// 创建一个新的文本数据集
    	corpus := text.NewCorpus()
    
    	// 添加几个示例
    	corpus.AddExample("hello world")
    	corpus.AddExample("deep learning is fun")
    
    	// 创建一个新的词汇表
    	vocab := corpus.Vocab()
    
    	// 创建一个新的神经网络
    	model := nn.NewSequential()
    	model.Add(nn.NewEmbedding(nn.WithVocabSize(len(vocab)), nn.WithEmbeddingSize(10)))
    	model.Add(nn.NewLinear(nn.WithInputSize(10), nn.WithOutputSize(2)))
    
    	// 编译模型
    	model.Compile(ag.WithLoss(nn.NewCrossEntropyLoss()))
    
    	// 对数据集进行训练
    	model.Train(corpus.TrainIterator())
    
    	// 对新数据进行预测
    	input := mat.NewVecDense([]float64{1, 0, 0, 0, 0, 0, 0, 0, 0, 0})
    	output := model.Predict(input)
    
    	fmt.Printf("Predicted: %v\n", output)
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这个例子中,我们创建了一个新的文本数据集,并添加了一些示例。然后,我们创建了一个新的词汇表。接下来,我们创建了一个新的神经网络,并编译了模型。然后,我们使用数据集对模型进行了训练。接下来,我们使用模型对新数据进行了预测。

    请注意,这个例子假设您已经安装了 Deeplearning4go。如果您还没有安装,请按照这些说明进行操作。

    接下来,我们将讨论 goml。

    6. Goml

    6.1 简介

    Goml 是另一个 Go 机器学习库。它提供了各种机器学习算法,包括线性回归、逻辑回归和 k-近邻。

    6.2 机器学习基础知识和概念

    Goml 涵盖了广泛的机器学习概念,从基本的线性回归到更高级的技术,如集成方法。

    6.3 在Go中使用goml进行机器学习任务

    以下是一个使用 Goml 进行机器学习任务的示例:

    package main
    
    import (
    	"fmt"
    
    	"github.com/cdipaolo/goml/base"
    	"github.com/cdipaolo/goml/linear"
    )
    
    func main() {
    	// 创建一个新的数据集
    	dataSet := base.NewDataSet(base.ClassificationData)
    
    	// 添加几个示例
    	dataSet.AddExample([]float64{1, 2}, []float64{0})
    	dataSet.AddExample([]float64{2, 3}, []float64{1})
    	dataSet.AddExample([]float64{3, 4}, []float64{1})
    	dataSet.AddExample([]float64{4, 5}, []float64{0})
    
    	// 创建一个新的逻辑回归分类器
    	classifier := linear.NewLogisticRegression()
    
    	// 对数据集进行训练
    	classifier.Train(dataSet)
    
    	// 对新数据进行预测
    	predicted, err := classifier.Predict([]float64{5, 6})
    	if err != nil {
    		panic(err)
    	}
    
    	fmt.Printf("Predicted: %v\n", predicted)
    }
    
    • 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
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这个例子中,我们创建了一个新的数据集,并添加了一些示例。然后,我们创建了一个新的逻辑回归分类器。接下来,我们使用数据集对分类器进行了训练。接下来,我们使用分类器对新数据进行了预测。

    请注意,这个例子假设您已经安装了 Goml。如果您还没有安装,请按照这些说明进行操作。

    这就结束了我们对 Go 中机器学习和人工智能的探索。我希望您发现这些信息有用,并且能够在您自己的项目中应用这些概念。

    总结:

    在这篇文章中,我们探索了 Go 中的机器学习和人工智能生态系统。我们介绍了 Gorgonia、Go-TensorFlow、Go-ONNX、Golearn、Deeplearning4go 和 Goml 这些库,并提供了详细的介绍和完整的 Go 实例代码。我们还介绍了这些库的基础知识和概念,以及如何使用这些库进行数据预处理、模型训练和推断。我们希望这篇文章对您了解 Go 中的机器学习和人工智能有所帮助。

  • 相关阅读:
    抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。
    Causal Inference理论学习篇-Tree Based-Causal Tree
    Linux打包和使用动静态库
    Win11如何开启移动热点?Win11开启移动热点的方法
    一文2000字手把手教你基于Python的UI自动化测试自学路线
    【linux命令讲解大全】006.网络工具简介:bzdiff 和 clockdiff 的用途和功能
    leetcode 5. 最长回文子串
    OpenMesh 获取一个顶点的邻接半边
    JS基础笔记-关于对象
    美国fba海运清关基本流程
  • 原文地址:https://blog.csdn.net/qq_42531954/article/details/136610271