golang简易神经网络实现插件库GoMind的使用

GoMind - Golang简易神经网络实现插件库使用指南

安装

要安装GoMind库,只需运行以下命令:

go get github.com/surenderthakran/gomind

关于GoMind

GoMind是一个完全用Go语言编写的神经网络库。目前它仅支持单隐藏层结构。该网络使用反向传播算法从训练集中学习。

GoMind的一些显著特点包括:

  • 支持以下激活函数:

    • Linear (默认)
    • Sigmoid
    • ReLU
    • Leaky ReLU
  • 如果在模型配置期间未给出计数,则会智能估计给定输入和输出大小的理想隐藏层神经元数量

  • 使用均方误差函数在反向传播时计算误差

使用示例

下面是一个完整的GoMind使用示例,演示如何训练一个简单的XOR神经网络:

package main

import (
	"fmt"
	"math/rand"
	"time"

	"github.com/surenderthakran/gomind"
)

func main() {
	// 设置随机种子
	rand.Seed(time.Now().UnixNano())

	// 定义训练数据集(XOR问题)
	trainingSet := [][][]float64{
		{{0, 0}, {0}},
		{{0, 1}, {1}},
		{{1, 0}, {1}},
		{{1, 1}, {0}},
	}

	// 创建神经网络模型
	mind, err := gomind.New(&gomind.ModelConfiguration{
		NumberOfInputs:                    2,   // 输入层神经元数量
		NumberOfOutputs:                   1,   // 输出层神经元数量
		NumberOfHiddenLayerNeurons:        16,  // 隐藏层神经元数量
		HiddenLayerActivationFunctionName: "relu",     // 隐藏层激活函数
		OutputLayerActivationFunctionName: "sigmoid",  // 输出层激活函数
	})
	if err != nil {
		fmt.Printf("无法创建神经网络: %v\n", err)
		return
	}

	// 训练神经网络
	for i := 0; i < 500; i++ {
		// 随机选择一个训练样本
		randIndex := rand.Intn(4)
		input := trainingSet[randIndex][0]
		output := trainingSet[randIndex][1]

		// 学习样本
		if err := mind.LearnSample(input, output); err != nil {
			fmt.Printf("学习样本时出错: 输入: %v, 目标: %v. %v\n", input, output, err)
			return
		}

		// 获取实际输出
		actual := mind.LastOutput()
		
		// 计算误差
		outputError, err := mind.CalculateError(output)
		if err != nil {
			fmt.Printf("计算误差时出错: 输入: %v, 目标: %v, 实际: %v. %v\n", input, output, actual, err)
			return
		}

		// 计算准确率
		outputAccuracy, err := mind.CalculateAccuracy(output)
		if err != nil {
			fmt.Printf("计算准确率时出错: 输入: %v, 目标: %v, 实际: %v. %v\n", input, output, actual, err)
			return
		}

		// 打印训练进度
		if i%50 == 0 {
			fmt.Printf("迭代次数: %v, 输入: %v, 目标: %v, 实际: %v, 误差: %.4f, 准确率: %.4f\n", 
				i, input, output, actual, outputError, outputAccuracy)
		}
	}

	// 测试训练好的模型
	fmt.Println("\n测试训练好的模型:")
	for _, testCase := range trainingSet {
		input := testCase[0]
		expected := testCase[1][0]
		
		output, err := mind.Predict(input)
		if err != nil {
			fmt.Printf("预测时出错: %v\n", err)
			continue
		}
		
		predicted := output[0]
		fmt.Printf("输入: %v, 期望输出: %.1f, 预测输出: %.4f\n", input, expected, predicted)
	}
}

代码说明

  1. 模型配置:

    • NumberOfInputs: 设置输入层神经元数量(对于XOR问题是2)
    • NumberOfOutputs: 设置输出层神经元数量(对于XOR问题是1)
    • NumberOfHiddenLayerNeurons: 设置隐藏层神经元数量(这里使用16个)
    • 激活函数可以选择"linear"、“sigmoid”、“relu"或"leaky_relu”
  2. 训练过程:

    • 随机选择训练样本进行学习
    • 每次迭代后计算误差和准确率
    • 每50次迭代打印一次训练进度
  3. 测试过程:

    • 训练完成后,使用所有可能的输入组合测试模型
    • 比较预测输出与期望输出

这个示例展示了如何使用GoMind解决经典的XOR问题,您可以根据需要调整网络结构和训练参数来解决其他问题。


更多关于golang简易神经网络实现插件库GoMind的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简易神经网络实现插件库GoMind的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GoMind: 一个简易的Golang神经网络实现

GoMind是一个轻量级的神经网络库,适用于Golang开发者快速实现基础的神经网络模型。下面我将介绍如何使用GoMind库来构建和训练一个简单的神经网络。

安装GoMind

首先,通过go get命令安装GoMind:

go get github.com/surenderthakran/gomind

基本用法示例

1. 创建一个简单的神经网络

package main

import (
	"fmt"
	"github.com/surenderthakran/gomind"
)

func main() {
	// 创建一个2-3-1结构的神经网络
	// 2个输入神经元,3个隐藏层神经元,1个输出神经元
	network, err := gomind.New(&gomind.ModelConfiguration{
		NumberOfInputs:  2,
		NumberOfOutputs: 1,
		HiddenLayers:    []int{3}, // 单隐藏层,3个神经元
		LearningRate:    0.3,      // 学习率
		Activation:      gomind.Sigmoid, // 激活函数
	})
	
	if err != nil {
		panic(err)
	}
	
	fmt.Println("神经网络创建成功!")
}

2. 训练神经网络

func trainNetwork(network *gomind.Model) {
	// XOR问题的训练数据
	trainingInputs := [][]float64{
		{0, 0},
		{0, 1},
		{1, 0},
		{1, 1},
	}
	
	trainingLabels := [][]float64{
		{0},
		{1},
		{1},
		{0},
	}
	
	// 训练10000次
	for i := 0; i < 10000; i++ {
		for j, input := range trainingInputs {
			if err := network.Learn(input, trainingLabels[j]); err != nil {
				panic(err)
			}
		}
	}
	
	fmt.Println("训练完成!")
}

3. 测试神经网络

func testNetwork(network *gomind.Model) {
	testInputs := [][]float64{
		{0, 0},
		{0, 1},
		{1, 0},
		{1, 1},
	}
	
	for _, input := range testInputs {
		output, err := network.Predict(input)
		if err != nil {
			panic(err)
		}
		fmt.Printf("输入: %v, 输出: %v\n", input, output)
	}
}

完整示例代码

package main

import (
	"fmt"
	"github.com/surenderthakran/gomind"
)

func main() {
	// 创建神经网络
	network, err := gomind.New(&gomind.ModelConfiguration{
		NumberOfInputs:  2,
		NumberOfOutputs: 1,
		HiddenLayers:    []int{3},
		LearningRate:    0.3,
		Activation:      gomind.Sigmoid,
	})
	
	if err != nil {
		panic(err)
	}
	
	// 训练神经网络
	trainNetwork(network)
	
	// 测试神经网络
	testNetwork(network)
}

func trainNetwork(network *gomind.Model) {
	trainingInputs := [][]float64{
		{0, 0},
		{0, 1},
		{1, 0},
		{1, 1},
	}
	
	trainingLabels := [][]float64{
		{0},
		{1},
		{1},
		{0},
	}
	
	for i := 0; i < 10000; i++ {
		for j, input := range trainingInputs {
			if err := network.Learn(input, trainingLabels[j]); err != nil {
				panic(err)
			}
		}
	}
}

func testNetwork(network *gomind.Model) {
	testInputs := [][]float64{
		{0, 0},
		{0, 1},
		{1, 0},
		{1, 1},
	}
	
	for _, input := range testInputs {
		output, err := network.Predict(input)
		if err != nil {
			panic(err)
		}
		fmt.Printf("输入: %v, 输出: %v\n", input, output)
	}
}

高级功能

1. 自定义激活函数

GoMind支持多种激活函数,包括:

  • Sigmoid
  • Tanh
  • ReLU
network, err := gomind.New(&gomind.ModelConfiguration{
	// ...其他配置
	Activation: gomind.Tanh,
})

2. 多隐藏层

network, err := gomind.New(&gomind.ModelConfiguration{
	NumberOfInputs:  10,
	NumberOfOutputs: 3,
	HiddenLayers:    []int{20, 15, 10}, // 3个隐藏层
	LearningRate:    0.1,
})

3. 保存和加载模型

// 保存模型
err := network.Save("model.json")
if err != nil {
	panic(err)
}

// 加载模型
loadedNetwork, err := gomind.Load("model.json")
if err != nil {
	panic(err)
}

注意事项

  1. GoMind是一个轻量级库,适合学习和简单应用,不适合大规模生产环境
  2. 训练数据需要适当归一化以获得更好效果
  3. 学习率和训练次数需要根据具体问题调整

这个简单的神经网络库可以帮助你理解神经网络的基本原理,并快速实现一些简单的机器学习任务。对于更复杂的需求,建议考虑使用更成熟的机器学习库如Gorgonia或GoLearn。

回到顶部