序言
本文重点介绍如何用Python完成一个全连接层的神经元网络。虽然已经有很多库和架构可以完成这些任务,例如Tensorflow、Pytorch等,但本文旨在讲述亲自完成这一过程的重要性。作者在接触神经元网络相关工作后已有2-3年时间,曾尝试使用tensorflow或pytorch架构完成传统互联网的工作,但对反向传播等基础理论仍有些模糊。本文将详细介绍神经元网络的基本知识,并对反向传播和练习全过程进行完善的总结。

梯度方向
梯度方向是指函数公式升高更快的方向,是速度最快的方向。换句话说,正确的方向是函数公式变陡峭的方向,那时函数公式变缓的方向是减速的方向。有关基础理论、梯度消失和节点饱和状态等问题可能会影响到1、2、3层的神经元,但如果只学习表层知识则无法深入了解。因此,学有所用是必要的。
反向传播
大家都知道训练神经网络的其中一个过程是升级网络参数,升级更新的趋势是减少交叉熵值。我们该如何升级主要参数呢?我们应该测算参加练习主要参数相较于损害函数的导数,接着求得梯度方向,应用梯度下降法来升级主要参数,并迭代更新。通过这样的过程,我们可以找到一个最好的解决方案,将交叉熵降至最低。
反向传播是用来清算交叉熵相对于权重值和参考点的导函数,传递误差。这里的误差是指每层神经元网络所产生的,并且某一层楼误差是后续层误差前提下平分的,网络里第一层误差用以表明。反向传播基于4个基本方程式,通过这些方程式来测算数据误差和交叉熵。
下面是一些示例代码:
class Neural Network(object)
def __init__(self):
pass
def forward(self, x):
#Z是w和b的函数,是激活函数前的值
#A是激活函数输出值,即伤害值
#z_s,a_s
pass
def backward(self, y, z_s, a_s):
#测算前向传播的参数导函数dwdb
pass
def train(self, x, y, batch_size=10, epochs=100, lr=0.001):
pass
我们是神经网络学习全过程,其实就是练习全过程。主要分两阶段:前向传播和后向传播。
在前向传播函数中,关键是测算每一层的Z和A。Z和A指的是什么请参见前面的报表。
在反向传播中,我们测算每一层可学习的自变量W和B的导函数。
代码实现
示例代码如下:
class NeuralNetwork(object):
def __init__(self, layers=[2, 10, 1], activations=[‘sigmoid’, ‘sigmoid’]):
assert(len(layers) == len(activations) + 1)
self.layers = layers
self.activations = activations
self.weights = []
self.biases = []
for i in range(len(layers) – 1):
self.weights.append(np.random.randn(layers[i+1], layers))
self.biases.append(np.random.randn(layers[i+1], 1))
因为权重值连接每个层神经细胞的w和b,所以权重值连接了两两层之间的方程式。前向传播:
def feedforward(self, x):
#回到前向传播的值
a = np.copy(x)
z_s = []
a_s = [a]
for i in range(len(self.weights)):
activation_function = self.getActivationFunction(self.activations)
z_s.append(self.weights.dot(a) + self.biases)
a = activation_function(z_s[-1])
a_s.append(a)
return z_s, a_s
这里的激活函数返回值是一个函数。Python中可以用lambda返回一个函数,下面的代码将对其进行修改:
@staticmethod
def getActivationFunction(name):
if(name == ‘sigmoid’):
return lambda x: np.exp(x) / (1 + np.exp(x))
elif(name == ‘linear’):
return lambda x: x
elif(name == ‘relu’):
def relu(x):
y = np.copy(x)
y[y = 0] = 1
y[y < 0] = 0
return y
return relu_diff
else:
print('Unknown activation function.linear is used')
return lambda x: 1
反向传播是本文的重点,代码如
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6796.html
