我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别_1.docx
《我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别_1.docx》由会员分享,可在线阅读,更多相关《我的Go+语言初体验——Go+语言构建神经网络实战手写数字识别_1.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、我的Go+语言初体验Go+语言构建神经网络实战手写数字识别我的Go+语言初体验Go+语言构建神经网络实战手写数字识别盼小辉丶2021-12-0910:56:230.前言之前发blink讲自己想学一门新语言很多热心的小伙伴推荐了Go这时又恰逢看到官方创作活动看了官方文档发现Go完全兼容Go语言并且代码更加易读。这不就是讲这波实际学习了一门语言却掌握了两门语言表示赚到了。于是迫不及待的开场准备体验下既然官方介绍讲Goforengineering,STEMeducation,anddatascience交融了数据科学领域的Python那作为人工智能领域的相关从业人员探究Go在人工智能领域的应用我辈当
2、然又是义不容辞了。本文首先扼要概述下神经网络的相关概念然后使用Go语言构建神经网络实战手写数字识别。1.神经网络相关概念人工神经网络的开展受到了人脑神经元的启发并且在多个领域中都已经获得了广泛的应用包括图像识别、语音识别和推荐系统等等本文并非人工智能的详尽教程但会扼要介绍相关根底为使用Go语言构建神经网络奠定根底。在人工神经网络中使用神经元承受输入数据对数据执行操作后传递到下一神经元每个神经元的输出称为激活获取激活的函数称为激活函数神经元中的参数称为权重或者偏置。每个网络层中包含假设干个神经元其中接收初始输入的网络层称为输入层产生最终结果的网络层称为输出层位于输出层与隐藏层之间的网络层称为隐藏
3、层。数据从输入到输出的整个传输经过称为正向传播而反向传播是一种训练神经网络的方法通过计算真实值与网络输出值间的误差反向修改网络的权重。在如下列图所示的全连接网络中每个节点表示一个神经元整个网络包括一层输入层、一层输出层已经两层隐藏层。固然已经有一些现有的神经网络框架可以使用但作为体验作本文将从头开场构建简单的全连接网络以更好解析神经网络的根本组成和运行原理。本文使用MNIST数据集以及gonum构建简单的全连接网络固然全连接网络是特别根底简单的神经网络但是相关的模型训练流程以及原理是相通的。2.构建神经网络实战手写数字识别2.1构建神经网络我们已经知道神经网络中的节点承受输入矩阵通过与权重矩阵
4、进展计算后通过激活函数后产生输出并传入下一层重复此经过直至输出层接下来将讲解详细计算流程。2.1.1节点计算每个神经元的计算形式如下列图所示使用公式进展描绘如下所示其中表示权重表示偏置。在Go中利用gonum实现上述计算经过如下hiddenLayerInput.Mul(x,nn.wHidden)addBHidden:func(_,colint,vfloat64)float64returnvnn.bHidden.At(0,col)hiddenLayerInput.Apply(addBHidden,hiddenLayerInput)gonum是用于高效编写数字以及科学算法的算法库可以通过执行以下命
5、令获取gogetgonum.org/v1/gonum2.1.2激活函数仅仅通过上述线性计算无法拟合现实生活中广泛存在的非线性模型因此神经网络中引入了激活函数来赋予网络非线性有很多激活函数sigmoid、ReLU以及tanh等等。这以简单的sigmoid函数为例在Go中实现sigmoid函数如下/激活函数funcsigmoid(xfloat64)float64return1.0/(1.0math.Exp(-x)2.1.3网络架构接下来构建包含一个输入层一个隐藏层一个输出层的神经网络。其中输入层包含784个神经元这是由于MNIST数据集中每张照片包含784个像素点每个像素点就是一个输入隐藏层包含5
6、12个神经元可以以使用更多或者更少的神经元数量进展测试输出层包含10个神经元每个节点对应一个数字类别这在神经网络中也称为独热编码。网络架构定义如下config:neuralNetConfig/输入层神经元inputNeurons:784,/输出层神经元outputNeurons:10,/隐藏层神经元hiddenNeurons:128,/训练Epoch数numEpochs:5000,/学习率learningRate:0.01,学习率用于控制每个Epoch中的参数的调整幅度。2.2读取手写数字MNIST数据集训练数据是由MNIST手写数字组成的MNIST数据集来自美国国家标准与技术研究所来历自25
7、0个不同人手写的数字构成其中训练集包含60000张图片测试集包含10000张图片每个图片都有其标签图片大小为28*28。1.首先需要2.然后读取数据/读取数据f,err:os.Open(new_mnist_train.csv)iferr!nillog.Fatal(err)deferf.Close()reader:csv.NewReader(f)reader.FieldsPerRecord794/读取所有CSV记录mnistData,err:reader.ReadAll()iferr!nillog.Fatal(err)/trainInputsData以及trainLabelsData用于保存所有
8、浮点值trainInputsData:make(float64,784*len(mnistData)println(len(inputsData)trainLabelsData:make(float64,10*len(mnistData)/记录输入矩阵值的当前索引vartrainInputsIndexintvartrainLabelsIndexintforidx,record:rangemnistData/跳过文件头ifidx0continue/循环读取每行的每个数据fori,val:rangerecord/将数据转换为浮点形parsedVal,err:strconv.ParseFloat(v
9、al,64)iferr!nillog.Fatal(err)/构造标签数据ifi0|i1|i2|i3|i4|i5|i6|i7|i8|i9trainLabelsDatatrainLabelsIndexparsedValtrainLabelsIndexcontinue/构建输入数据trainInputsDatatrainInputsIndexparsedValtrainInputsIndex3.最后将数据整形使得其加油可用于网络输入的形状。inputs:mat.NewDense(len(mnistData),784,trainInputsData)labels:mat.NewDense(len(mn
10、istData),10,trainLabelsData)测试数据的读取方法与训练数据完全一样不再赘述。2.3训练神经网络网络的训练可以分为两局部包括前向计算与反向传播。2.3.1前向计算网络的前向计算特别简单即通过数据通过每个网络层进展计算获得最终结果首先需要初始化网络权重以及偏置值/初始化网络权重以及偏置值wHiddenRaw:make(float64,nn.config.hiddenNeurons*nn.config.inputNeurons)bHiddenRaw:make(float64,nn.config.hiddenNeurons)wOutRaw:make(float64,nn.co
11、nfig.outputNeurons*nn.config.hiddenNeurons)bOutRaw:make(float64,nn.config.outputNeurons)for_,param:rangefloat64wHiddenRaw,bHiddenRaw,wOutRaw,bOutRawfori:rangeparamparamirandGen.Float64()wHidden:mat.NewDense(nn.config.inputNeurons,nn.config.hiddenNeurons,wHiddenRaw)bHidden:mat.NewDense(1,nn.config.hi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Go 语言 体验 构建 神经网络 实战 手写 数字 识别 _1
限制150内