golang实现功能丰富的神经网络开发插件库go-deep的使用

Golang实现功能丰富的神经网络开发插件库go-deep的使用

介绍

go-deep是一个前馈/反向传播神经网络实现库,支持以下功能:

  • 激活函数:sigmoid、双曲正切、ReLU
  • 优化器:SGD、带动量的SGD、Nesterov动量、Adam
  • 分类模式:回归、多分类、多标签、二分类
  • 支持并行批量训练
  • 支持偏置节点

网络建模为一组通过突触连接的神经元。注意:该库不使用GPU计算,不适用于大规模应用。

安装

go get -u github.com/patrikeh/go-deep

使用示例

1. 基础使用

import (
	"fmt"
	deep "github.com/patrikeh/go-deep"
	"github.com/patrikeh/go-deep/training"
)

// 定义训练数据
var data = training.Examples{
	{[]float64{2.7810836, 2.550537003}, []float64{0}},
	{[]float64{1.465489372, 2.362125076}, []float64{0}},
	{[]float64{3.396561688, 4.400293529}, []float64{0}},
	{[]float64{1.38807019, 1.850220317}, []float64{0}},
	{[]float64{7.627531214, 2.759262235}, []float64{1}},
	{[]float64{5.332441248, 2.088626775}, []float64{1}},
	{[]float64{6.922596716, 1.77106367}, []float64{1}},
	{[]float64{8.675418651, -0.242068655}, []float64{1}},
}

// 创建神经网络
n := deep.NewNeural(&deep.Config{
	/* 输入维度 */
	Inputs: 2,
	/* 两个隐藏层,每层2个神经元,1个输出层 */
	Layout: []int{2, 2, 1},
	/* 激活函数: Sigmoid, Tanh, ReLU, Linear */
	Activation: deep.ActivationSigmoid,
	/* 输出层激活和损失函数:
	ModeRegression: 线性输出+MSE损失
	ModeMultiClass: softmax输出+交叉熵损失
	ModeMultiLabel: sigmoid输出+交叉熵损失
	ModeBinary: sigmoid输出+二元交叉熵损失 */
	Mode: deep.ModeBinary,
	/* 权重初始化: {deep.NewNormal(μ, σ), deep.NewUniform(μ, σ)} */
	Weight: deep.NewNormal(1.0, 0.0),
	/* 使用偏置 */
	Bias: true,
})

// 训练网络
// 参数: 学习率, 动量, alpha衰减, nesterov
optimizer := training.NewSGD(0.05, 0.1, 1e-6, true)
// 参数: 优化器, 打印频率(每50次迭代打印一次)
trainer := training.NewTrainer(optimizer, 50)

training, heldout := data.Split(0.5)
trainer.Train(n, training, heldout, 1000) // 训练集, 验证集, 迭代次数

// 预测
fmt.Println(data[0].Input, "=>", n.Predict(data[0].Input))
fmt.Println(data[5].Input, "=>", n.Predict(data[5].Input))

2. 批量并行训练

optimizer := training.NewAdam(0.001, 0.9, 0.999, 1e-8)
// 参数: 优化器, 打印频率, 批量大小, 工作线程数
trainer := training.NewBatchTrainer(optimizer, 1, 200, 4)

training, heldout := data.Split(0.75)
trainer.Train(n, training, heldout, 1000) // 训练集, 验证集, 迭代次数

训练结果示例

Epochs        Elapsed       Error
---           ---           ---
5             12.938µs      0.36438
10            125.691µs     0.02261
15            177.194µs     0.00404
...
1000          10.703839ms   0.00000

示例数据集性能

数据集 拓扑结构 训练轮次 准确率
wines [5 5] 10000 ~98%
mnist [50] 25 ~97%

注意事项

  1. 该库适合中小规模神经网络应用
  2. 对于大型数据集或复杂模型,建议使用GPU加速的深度学习框架
  3. 可以通过调整网络结构、激活函数和优化器参数来优化性能

更多关于golang实现功能丰富的神经网络开发插件库go-deep的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现功能丰富的神经网络开发插件库go-deep的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-deep实现功能丰富的神经网络开发

go-deep是一个用Go语言编写的神经网络库,它提供了构建、训练和评估各种神经网络模型的功能。下面我将介绍如何使用go-deep库实现不同类型的神经网络。

安装go-deep

首先安装go-deep库:

go get github.com/patrikeh/go-deep

基本神经网络示例

1. 创建简单的前馈神经网络

package main

import (
	"fmt"
	"github.com/patrikeh/go-deep"
	"github.com/patrikeh/go-deep/training"
)

func main() {
	// 创建神经网络: 2输入, 2隐藏层(每层4个神经元), 1输出
	n := deep.NewNeural(&deep.Config{
		Inputs:     2,
		Layout:     []int{4, 4, 1}, // 网络结构
		Activation: deep.ActivationTanh,
		Mode:       deep.ModeBinary,
		Weight:     deep.NewNormal(0.5, 0.1),
		Bias:       true,
	})

	// 训练数据: XOR问题
	inputs := [][]float64{
		{0, 0},
		{0, 1},
		{1, 0},
		{1, 1},
	}
	targets := [][]float64{
		{0},
		{1},
		{1},
		{0},
	}

	// 训练器配置
	trainer := training.NewTrainer(
		training.NewSGD(0.1, 0.1, 1e-6, true),
		training.OnBatchDone(func(batch training.Batch) {
			fmt.Printf("Epoch: %d, Loss: %.5f\n", batch.Epoch, batch.Loss)
		}),
	)
	
	// 训练网络
	trainer.Train(n, inputs, targets, 1000, 4) // epochs=1000, batchSize=4

	// 测试网络
	for _, input := range inputs {
		fmt.Printf("%.1f XOR %.1f => %.5f\n", input[0], input[1], n.Predict(input)[0])
	}
}

2. 实现回归问题

func regressionExample() {
	// 创建回归网络
	n := deep.NewNeural(&deep.Config{
		Inputs:     1,
		Layout:     []int{10, 10, 1}, // 2个隐藏层
		Activation: deep.ActivationReLU,
		Mode:       deep.ModeRegression,
		Weight:     deep.NewNormal(0.5, 0.1),
		Bias:       true,
	})

	// 生成训练数据 (y = x^2)
	var inputs, targets [][]float64
	for i := 0.0; i < 1.0; i += 0.01 {
		inputs = append(inputs, []float64{i})
		targets = append(targets, []float64{i * i})
	}

	// 使用Adam优化器
	trainer := training.NewTrainer(
		training.NewAdam(0.01, 0.9, 0.999, 1e-8),
		training.OnEpochDone(func(epoch int, loss float64) {
			if epoch%100 == 0 {
				fmt.Printf("Epoch: %d, Loss: %.5f\n", epoch, loss)
			}
		}),
	)

	trainer.Train(n, inputs, targets, 500, 10)

	// 测试
	testInput := 0.7
	fmt.Printf("%.1f^2 => %.5f (expected %.2f)\n", 
		testInput, n.Predict([]float64{testInput})[0], testInput*testInput)
}

3. 实现分类问题

func classificationExample() {
	// 创建分类网络 (3类)
	n := deep.NewNeural(&deep.Config{
		Inputs:     4, // 鸢尾花数据集特征数
		Layout:     []int{6, 3}, // 1个隐藏层(6神经元), 输出层(3神经元)
		Activation: deep.ActivationSigmoid,
		Mode:       deep.ModeMultiClass,
		Weight:     deep.NewNormal(0.5, 0.1),
		Bias:       true,
	})

	// 加载鸢尾花数据集 (简化版)
	inputs := [][]float64{
		{5.1, 3.5, 1.4, 0.2}, // setosa
		{7.0, 3.2, 4.7, 1.4}, // versicolor
		{6.3, 3.3, 6.0, 2.5}, // virginica
		// 更多数据...
	}
	targets := [][]float64{
		{1, 0, 0}, // setosa
		{0, 1, 0}, // versicolor
		{0, 0, 1}, // virginica
		// 更多数据...
	}

	trainer := training.NewTrainer(
		training.NewAdam(0.01, 0.9, 0.999, 1e-8),
		training.OnEpochDone(func(epoch int, loss float64) {
			if epoch%100 == 0 {
				fmt.Printf("Epoch: %d, Loss: %.5f\n", epoch, loss)
			}
		}),
	)

	trainer.Train(n, inputs, targets, 1000, 4)

	// 测试
	testInput := []float64{5.9, 3.0, 5.1, 1.8} // 预期virginica
	prediction := n.Predict(testInput)
	fmt.Printf("预测结果: %.2f (setosa, versicolor, virginica)\n", prediction)
}

高级功能

1. 保存和加载模型

func saveAndLoadModel() {
	// 创建并训练网络...
	n := deep.NewNeural(&deep.Config{
		Inputs:     2,
		Layout:     []int{4, 1},
		Activation: deep.ActivationTanh,
		Mode:       deep.ModeBinary,
	})
	
	// 保存模型到文件
	err := n.Save("model.gob")
	if err != nil {
		panic(err)
	}

	// 从文件加载模型
	loadedModel, err := deep.Load("model.gob")
	if err != nil {
		panic(err)
	}

	// 使用加载的模型进行预测
	fmt.Println(loadedModel.Predict([]float64{0, 1}))
}

2. 自定义激活函数

func customActivation() {
	// 定义自定义激活函数
	myActivation := func(x float64) float64 {
		return x / (1 + math.Abs(x)) // 自定义S形函数
	}

	// 创建使用自定义激活函数的网络
	n := deep.NewNeural(&deep.Config{
		Inputs:     2,
		Layout:     []int{4, 1},
		Activation: myActivation,
		Mode:       deep.ModeBinary,
	})
	
	// 训练和使用网络...
}

3. 使用Dropout防止过拟合

func withDropout() {
	n := deep.NewNeural(&deep.Config{
		Inputs:     10,
		Layout:     []int{20, 20, 5}, // 2个隐藏层
		Activation: deep.ActivationReLU,
		Mode:       deep.ModeMultiClass,
		Weight:     deep.NewNormal(0.5, 0.1),
		Bias:       true,
		Dropout:    0.2, // 20%的dropout率
	})
	
	// 训练和使用网络...
}

性能优化技巧

  1. 批量大小调整:较大的批量可以提高训练速度,但可能影响模型质量
  2. 学习率调度:训练过程中动态调整学习率
  3. 提前停止:监控验证集性能,在性能不再提升时停止训练
func advancedTraining() {
	n := deep.NewNeural(&deep.Config{
		Inputs:     8,
		Layout:     []int{32, 32, 1},
		Activation: deep.ActivationLeakyReLU,
		Mode:       deep.ModeRegression,
	})
	
	// 创建学习率调度器
	scheduler := training.NewRateScheduler(
		0.01, // 初始学习率
		training.RateSchedule{
			{Epoch: 100, Rate: 0.005},
			{Epoch: 200, Rate: 0.001},
		},
	)
	
	trainer := training.NewTrainer(
		training.NewAdam(0.01, 0.9, 0.999, 1e-8),
		training.WithLearnable(scheduler),
		training.WithBatchSize(64),
		training.WithEarlyStop(20, 0.01), // 20轮无改善,最小改善0.01
		training.OnEpochDone(func(epoch int, loss float64) {
			fmt.Printf("Epoch: %d, LR: %.5f, Loss: %.5f\n", 
				epoch, scheduler.GetRate(), loss)
		}),
	)
	
	// 训练网络...
}

go-deep库提供了丰富的功能来构建各种神经网络模型,通过合理配置网络结构、激活函数和训练参数,可以解决多种机器学习问题。根据具体任务需求调整网络深度、宽度和训练策略,通常能获得良好的性能。

回到顶部