该说点什么呢?黄老师那么优秀,人又长得好看,说话也好听,还是个超级美女。但黄老师自己却说她顿感力很强。为什么呢?
上面我们已经讲了神经网络的基本结构以及神经网络最重要的一个算法——梯度下降算法。那么今天我们就带大家用Python来实现一个梯度下降算法,实现一个手写数字识别的算法。
首先来介绍一下我们需要用到的数据集(MNIST数据集70000条):
我这里用50000条来作为训练集(train)、10000条作为验证集(validation)、10000条作为测试集(test)。这里的验证集的作用就是在我们训练的时候我们可以监控我们每一步学习的状况,验证集有具体的标签,也就是我们知道每一张图片的数字代表的是多少,在训练的过程中不断的来调整参数作为验证,最后我们把所有的模型训练好之后我们再在测试集上测试,所以我们在这里拆分了一下。
在这里我们定义一个神经网络的类,其中sizes表示每个神经元的个数,biasses表示偏向,weights表示权重。前面也跟大家介绍了每个神经元之间的连线,都是要经过两个步骤来计算得到的,那么我们该怎样来初始化权重和偏向呢?在这里我们分别在高斯分布的随机正态分布中随机在0、1之间随机产生的矩阵。 在这里我们可以随机的看一组随机产生的矩阵。
这里假设神经网络结构为:
net=Network([2,3,1])
分别输出为:神经网络的层数,神经网络的结构,权重、偏向
前面三个矩阵分别代表的是隐藏层3所对应的偏向,接下来的代表的是输出层所对应的偏向。后面的一个矩阵我们可以看到是一个三行两列的矩阵,我们可以对应一下前面的一张图,假设结构中输入层有2层,隐藏层有3层,他们两两之间有一条连线,对应的也刚好是6个值,也就是说前面两个输入层对应隐藏层的两个值,也就是前面第一行的两个值。总的来说当前层的两个神经元对应到下一层的第一个神经元的两条连线所对应的权重分别是前面一行的两个值。下面的两个值也是同样的道理。最后一个矩阵就显而易见了,因为我们的[2,3,1]的结构,所以分别对应的是隐藏层与输出层之间的连线的值。
从上面简单的例子我们大概把神经网络的结构给定义好了,前面跟大家讲过,每个神经元之间通过输入值x乘以每条边上的权重w加上偏向b的累加,然后通过Sigmod function得到下一个神经元的值。
Sigmod function:
定义一个Sigmod function:
defsigmoid(z):
"""The sigmoid function."""
return1.0/(1.0+np.exp(-z))
———————————————
由于重新配置环境之后,花了很多时间,所以今天就只能写到这里了。
春去秋来,一边记录,一边成长。
——《凡人周郎》
领取专属 10元无门槛券
私享最新 技术干货