使用Golang实现神经网络的探讨

使用Golang实现神经网络的探讨 是否有可以在 Go 语言中使用神经网络(以及机器学习算法)的库?

是否有人使用 Go 进行机器学习?对于如何用大约 100GB 的数据训练神经网络,有什么建议吗?

8 回复

Go语言主要用于网络和云计算领域,而非人工智能。我怀疑是否有大公司将Go作为神经网络的主要代码库。

Python是人工智能领域的“行业标准”。

更多关于使用Golang实现神经网络的探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @maykie

感谢你提供的链接。你能告诉我这些库中,哪个是 Go 语言和神经网络领域的行业标准吗?大型公司在他们的机器学习项目中主要使用哪一个?

Python 是人工智能领域的“行业标准”。

我在想这是为什么。Golang 对并发处理有很好的支持,它应该能够做到 Python 所能做的,并且在并行化方面具有优势。

你好 @NobbZ

请详细说明一下“智能地将部分工作委托给GPU”是什么意思?具体是指什么?

你能写一个非并发的程序(为单线程设计),然后它被编译,接着那个汇编/二进制代码被发送到GPU,然后GPU以某种方式将其并行化吗?

为什么在使用GPU时,用Go编写的代码在并发性方面并不比用Python编写的代码更有优势?

这可能与一个事实有关,即 Python 和 NumPy 在 Go 首次出现在 TIOBE 指数之前就已经在数据科学领域得到应用了……

同时也因为 Python 可以进行一些运算符重载,你不需要通过复杂的方法调用来实现两个定点数或大整数的加法。

后来添加的库,如 TensorFlow,能够智能地将部分工作委托给 GPU 处理。

是的,你也可以在 Go 中使用 TensorFlow,但它不支持运算符重载。因此,人工智能和数据科学领域的人员可以快速使用 Python 构建原型,这些代码通常仍保持可读性,而使用 Go 则会很快变得过于冗长。

人工智能和机器学习主要围绕高度可并行化的浮点计算展开。

如果GPU具备能力,TensorFlow可以将这些计算委托给GPU,并且会透明地回退到CPU,无论是否使用SIMD和其他优化。

如前所述,Go语言通过使用TensorFlow也能做到这一点。这并不是区别所在。

区别在于Python的绑定比Go的绑定要早得多。并且在编写这些计算时,Python允许使用更优雅的语法。

在Python中,你可以直接使用加号运算符来对两个张量进行加法运算,而这在Go中是无法做到的。

对于只涉及两三个变量的简单计算来说,这不成问题。然而,一旦计算变得更加复杂,使用重载的运算符对他们来说感觉更自然。

总的来说,Python更适合快速原型开发,因为它不会因为每个未使用的变量而导致编译失败。

GitHub - Fontinalis/fonet: fonet 是一个用于 Go 的深度神经网络包。

fonet 是一个用于 Go 的深度神经网络包。在 GitHub 上为 Fontinalis/fonet 开发做出贡献。

GitHub - patrikeh/go-deep: 人工神经网络

人工神经网络。在 GitHub 上为 patrikeh/go-deep 开发做出贡献。

GitHub - vksnk/go-fann: 用于 FANN 的 Go 绑定,FANN 是一个人工神经网络库...

用于 FANN 的 Go 绑定,FANN 是一个人工神经网络库。

GitHub - goml/gobrain: 用 Go 编写的神经网络

用 Go 编写的神经网络。在 GitHub 上为 goml/gobrain 开发做出贡献。

GitHub - surenderthakran/gomind: Go 语言中一个简化的神经网络库

Go 语言中一个简化的神经网络库。在 GitHub 上为 surenderthakran/gomind 开发做出贡献。

GitHub - dathoangnd/gonet: 用于 Go 的神经网络。

用于 Go 的神经网络。在 GitHub 上为 dathoangnd/gonet 开发做出贡献。

GitHub - gorgonia/gorgonia: Gorgonia 是一个有助于在 Go 中促进机器学习的库...

Gorgonia 是一个有助于在 Go 中促进机器学习的库。

GitHub - schuyler/neural-go: 一个用 Go 实现的多层感知器网络...

一个用 Go 实现的多层感知器网络,通过反向传播进行训练。

GitHub - owulveryck/onnx-go: onnx-go 提供了在 Go 中导入预训练神经网络的能力,而无需链接到特定框架或库。

onnx-go 提供了在 Go 中导入预训练神经网络的能力,而无需链接到特定框架或库。

GitHub - Xamber/Varis: Golang 神经网络

Golang 神经网络。在 GitHub 上为 Xamber/Varis 开发做出贡献。

在Go语言中实现神经网络是可行的,目前有几个成熟的库可供选择。以下是一些常用的Go机器学习库及其示例代码:

  1. Gorgonia:这是一个基于计算图的库,支持自动微分和GPU加速。
package main

import (
    "fmt"
    "gorgonia.org/gorgonia"
    "gorgonia.org/tensor"
)

func main() {
    g := gorgonia.NewGraph()
    x := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(2, 3), gorgonia.WithName("x"))
    w := gorgonia.NewMatrix(g, tensor.Float64, gorgonia.WithShape(3, 1), gorgonia.WithName("w"))
    b := gorgonia.NewScalar(g, tensor.Float64, gorgonia.WithName("b"))
    
    prod := gorgonia.Must(gorgonia.Mul(x, w))
    z := gorgonia.Must(gorgonia.Add(prod, b))
    a := gorgonia.Must(gorgonia.Sigmoid(z))
    
    machine := gorgonia.NewTapeMachine(g)
    defer machine.Close()
    
    // 输入数据
    xVal := tensor.New(tensor.WithShape(2, 3), tensor.WithBacking([]float64{1, 2, 3, 4, 5, 6}))
    wVal := tensor.New(tensor.WithShape(3, 1), tensor.WithBacking([]float64{0.5, 0.3, 0.2}))
    
    gorgonia.Let(x, xVal)
    gorgonia.Let(w, wVal)
    gorgonia.Let(b, 0.1)
    
    machine.RunAll()
    fmt.Printf("Output: %v\n", a.Value())
}
  1. GoLearn:这是一个功能齐全的机器学习库,包含多种算法实现。
package main

import (
    "fmt"
    "github.com/sjwhitworth/golearn/base"
    "github.com/sjwhitworth/golearn/neural"
)

func main() {
    // 加载数据
    rawData, err := base.ParseCSVToInstances("data.csv", true)
    if err != nil {
        panic(err)
    }
    
    // 创建神经网络
    nn := neural.NewMultiLayerNet([]int{4, 5, 3})
    nn.LearningRate = 0.1
    
    // 训练模型
    for i := 0; i < 1000; i++ {
        nn.Train(rawData)
    }
    
    // 预测
    predictions := nn.Predict(rawData)
    fmt.Println(predictions)
}
  1. GoML:这是一个轻量级的机器学习库。
package main

import (
    "fmt"
    "github.com/cdipaolo/goml/base"
    "github.com/cdipaolo/goml/neural"
)

func main() {
    // 创建神经网络
    nn := neural.NewNetwork(base.StochasticGradientDescent, 3, []int{4, 4, 1}, neural.Sigmoid)
    
    // 训练数据
    x := [][]float64{{0, 0, 1}, {0, 1, 1}, {1, 0, 1}, {1, 1, 1}}
    y := []float64{0, 1, 1, 0}
    
    // 训练模型
    nn.Train(x, y, 10000)
    
    // 预测
    output := nn.Predict([]float64{1, 0, 0})
    fmt.Printf("Prediction: %f\n", output[0])
}

对于100GB数据的训练,建议采用以下方法:

  1. 数据流处理:使用Go的并发特性分批读取和处理数据。
func processLargeData(filePath string, batchSize int) {
    file, err := os.Open(filePath)
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    scanner := bufio.NewScanner(file)
    buffer := make([]string, 0, batchSize)
    
    for scanner.Scan() {
        buffer = append(buffer, scanner.Text())
        if len(buffer) >= batchSize {
            processBatch(buffer)
            buffer = buffer[:0]
        }
    }
    
    if len(buffer) > 0 {
        processBatch(buffer)
    }
}
  1. 分布式训练:将数据分割到多个节点进行并行训练。
func distributedTraining(dataChunks [][]float64) {
    var wg sync.WaitGroup
    results := make(chan []float64, len(dataChunks))
    
    for _, chunk := range dataChunks {
        wg.Add(1)
        go func(data []float64) {
            defer wg.Done()
            result := trainOnChunk(data)
            results <- result
        }(chunk)
    }
    
    go func() {
        wg.Wait()
        close(results)
    }()
    
    // 聚合结果
    finalWeights := aggregateResults(results)
}
  1. 内存映射文件:对于超大型文件,使用内存映射避免一次性加载。
func mmapTraining(filePath string) {
    file, err := os.Open(filePath)
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    info, _ := file.Stat()
    data, err := syscall.Mmap(int(file.Fd()), 0, int(info.Size()), syscall.PROT_READ, syscall.MAP_SHARED)
    if err != nil {
        panic(err)
    }
    defer syscall.Munmap(data)
    
    // 处理映射的数据
    processMappedData(data)
}

这些方法结合Go的并发特性和现有的机器学习库,可以有效处理大规模神经网络训练任务。

回到顶部