>백엔드 개발 >Golang >머신러닝 개발에 Go 언어를 사용하는 방법은 무엇입니까?

머신러닝 개발에 Go 언어를 사용하는 방법은 무엇입니까?

WBOY
WBOY원래의
2023-06-10 11:19:371283검색

다양한 분야에서 머신러닝이 광범위하게 적용되면서 프로그래머들은 머신러닝 모델을 빠르고 효과적으로 개발하는 방법에 점점 더 관심을 기울이고 있습니다. Python, R과 같은 전통적인 기계 학습 언어는 기계 학습 분야의 표준 도구가 되었지만 점점 더 많은 프로그래머가 Go 언어의 동시성과 성능에 매료됩니다. 이번 글에서는 머신러닝 개발에 Go 언어를 사용하는 방법에 대해 설명하겠습니다.

  1. Go 설치

먼저 운영 체제에 Go를 설치해야 합니다. Go 공식 홈페이지에서 설치 프로그램을 다운로드하여 설치할 수 있습니다. 설치가 완료되면 명령줄에서 go version 명령을 실행하여 Go가 올바르게 설치되었는지 확인하세요.

  1. 머신러닝 라이브러리 설치

Go에는 머신러닝 라이브러리가 내장되어 있지 않지만 tensorflow, gorgonia, goml 등과 같은 타사 머신러닝 프레임워크가 많이 있습니다. 여기서는 Gorgonia를 예로 들어 Go를 머신러닝에 활용하는 방법을 소개하겠습니다.

Gorgonia를 설치하려면 명령줄에서 다음 명령을 실행하세요.

go get gorgonia.org/gorgonia

설치가 완료된 후 다음 명령을 실행하여 올바르게 설치되었는지 확인할 수 있습니다.

package main

import "gorgonia.org/gorgonia"

func main() {
    gorgonia.NewGraph()
}

오류가 보고되지 않으면 고르고니아를 성공적으로 설치했습니다.

  1. Gorgonia 사용

다음으로 Gorgonia를 사용하여 손으로 쓴 숫자 이미지를 분류하기 위한 기본 신경망을 구축해 보겠습니다. 먼저 데이터를 준비해야 합니다. gorgonia에는 mnist 데이터 세트를 다운로드하고 압축을 푸는 데 사용할 수 있는 mnist 패키지가 있습니다.

package main

import (
    "fmt"
    "gorgonia.org/datasets/mnist"
    "gorgonia.org/gorgonia"
)

func main() {
    // 下载和解压缩 mnist 数据集
    trainData, testData, err := mnist.Load(root)
    if err != nil {
        panic(err)
    }

    // 打印训练和测试数据及标签的形状
    fmt.Printf("train data shape: %v
", trainData.X.Shape())
    fmt.Printf("train labels shape: %v
", trainData.Y.Shape())
    fmt.Printf("test data shape: %v
", testData.X.Shape()) 
    fmt.Printf("test labels shape: %v
", testData.Y.Shape())
}

출력 결과는 다음과 같습니다.

train data shape: (60000, 28, 28, 1)
train labels shape: (60000, 10)
test data shape: (10000, 28, 28, 1)
test labels shape: (10000, 10)

훈련 데이터에는 60,000개의 28x28 회색조 이미지가 포함되어 있고 테스트 데이터에는 동일한 모양의 10,000개의 이미지가 포함되어 있습니다. 각 레이블은 이미지가 속한 숫자를 나타내는 10차원 벡터입니다.

다음으로 신경망의 아키텍처를 정의하겠습니다. 우리는 두 개의 숨겨진 레이어가 있는 심층 신경망을 사용할 것입니다. 각 은닉층에는 128개의 뉴런이 있습니다. 출력 레이어에서 relu 활성화 함수와 Softmax 활성화 함수를 사용하여 이미지를 분류하겠습니다.

dataShape := trainData.X.Shape()
dataSize := dataShape[0]
inputSize := dataShape[1] * dataShape[2] * dataShape[3]
outputSize := testData.Y.Shape()[1]

// 构建神经网络
g := gorgonia.NewGraph()
x := gorgonia.NewTensor(g, tensor.Float32, 4, gorgonia.WithShape(dataSize, dataShape[1], dataShape[2], dataShape[3]), gorgonia.WithName("x"))
y := gorgonia.NewMatrix(g, tensor.Float32, gorgonia.WithShape(dataSize, outputSize), gorgonia.WithName("y"))

hiddenSize := 128
hidden1 := gorgonia.Must(gorgonia.NodeFromAny(g, tensor.Zero(tensor.Float32, hiddenSize), gorgonia.WithName("hidden1")))
hidden2 := gorgonia.Must(gorgonia.NodeFromAny(g, tensor.Zero(tensor.Float32, hiddenSize), gorgonia.WithName("hidden2")))

w1 := gorgonia.NewMatrix(g, tensor.Float32, gorgonia.WithShape(inputSize, hiddenSize), gorgonia.WithName("w1"))
w2 := gorgonia.NewMatrix(g, tensor.Float32, gorgonia.WithShape(hiddenSize, hiddenSize), gorgonia.WithName("w2"))
w3 := gorgonia.NewMatrix(g, tensor.Float32, gorgonia.WithShape(hiddenSize, outputSize), gorgonia.WithName("w3"))

b1 := gorgonia.NewVector(g, tensor.Float32, gorgonia.WithShape(hiddenSize), gorgonia.WithName("b1"))
b2 := gorgonia.NewVector(g, tensor.Float32, gorgonia.WithShape(hiddenSize), gorgonia.WithName("b2"))
b3 := gorgonia.NewVector(g, tensor.Float32, gorgonia.WithShape(outputSize), gorgonia.WithName("b3"))

hidden1Dot, err1 := gorgonia.Mul(x, w1)
hidden1Add, err2 := gorgonia.BroadcastAdd(hidden1Dot, b1, []byte{0})
hidden1Activate := gorgonia.Must(gorgonia.Rectify(hidden1Add))

hidden2Dot, err3 := gorgonia.Mul(hidden1Activate, w2)
hidden2Add, err4 := gorgonia.BroadcastAdd(hidden2Dot, b2, []byte{0})
hidden2Activate := gorgonia.Must(gorgonia.Rectify(hidden2Add))

yDot, err5 := gorgonia.Mul(hidden2Activate, w3)
yAdd, err6 := gorgonia.BroadcastAdd(yDot, b3, []byte{0})
ySoftMax := gorgonia.Must(gorgonia.SoftMax(yAdd))

우리는 SGD(확률적 경사하강법) 방법을 사용하여 모델을 훈련합니다. 각 에포크에서 훈련 데이터를 배치로 나누고 기울기를 계산하고 각 배치의 매개변수를 업데이트합니다.

iterations := 10
batchSize := 32
learningRate := 0.01

// 定义代价函数(交叉熵)
cost := gorgonia.Must(gorgonia.Mean(gorgonia.Must(gorgonia.Neg(gorgonia.Must(gorgonia.HadamardProd(y, gorgonia.Must(gorgonia.Log(ySoftMax)))))))

// 定义优化器
optimizer := gorgonia.NewVanillaSolver(g, gorgonia.WithLearnRate(learningRate))

// 表示模型将进行训练
vm := gorgonia.NewTapeMachine(g)

// 进行训练
for i := 0; i < iterations; i++ {
    fmt.Printf("Epoch %d
", i+1)

    for j := 0; j < dataSize; j += batchSize {
        upperBound := j + batchSize
        if upperBound > dataSize {
            upperBound = dataSize
        }
        xBatch := trainData.X.Slice(s{j, upperBound})
        yBatch := trainData.Y.Slice(s{j, upperBound})

        if err := gorgonia.Let(x, xBatch); err != nil {
            panic(err)
        }
        if err := gorgonia.Let(y, yBatch); err != nil {
            panic(err)
        }

        if err := vm.RunAll(); err != nil {
            panic(err)
        }

        if err := optimizer.Step(gorgonia.NodesToValueGrads(w1, b1, w2, b2, w3, b3)); err != nil {
            panic(err)
        }
    }

    // 测试准确率
    xTest := testData.X
    yTest := testData.Y

    if err := gorgonia.Let(x, xTest); err != nil {
        panic(err)
    }
    if err := gorgonia.Let(y, yTest); err != nil {
        panic(err)
    }

    if err := vm.RunAll(); err != nil {
        panic(err)
    }

    predict := gorgonia.Must(gorgonia.Argmax(ySoftMax, 1))
    label := gorgonia.Must(gorgonia.Argmax(yTest, 1))

    correct := 0
    for i := range label.Data().([]float32) {
        if predict.Data().([]float32)[i] == label.Data().([]float32)[i] {
            correct++
        }
    }

    fmt.Printf("Accuracy: %v
", float32(correct)/float32(len(label.Data().([]float32))))
}

간단한 머신러닝 모델 개발을 완료했습니다. 더 많은 숨겨진 레이어를 추가하거나 다양한 최적화 도구를 사용하는 등 필요에 따라 확장하고 최적화할 수 있습니다.

  1. 요약

이 기사에서는 기계 학습 개발에 Go 언어를 사용하는 방법을 논의하고 gorgonia 및 mnist 데이터 세트를 예로 들어 손으로 쓴 숫자 이미지를 분류하기 위한 기본 신경망을 구축하는 방법을 보여주었습니다. Go는 기계 학습 분야에서 선택하는 언어가 아닐 수도 있지만 동시성 및 성능 이점이 뛰어나며 일부 시나리오에서는 좋은 선택이 될 수 있습니다.

위 내용은 머신러닝 개발에 Go 언어를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.