深圳摇号,怎么运用Python从头开始构建一个简略的神经网络,鹰潭天气

频道:推荐新闻 日期: 浏览:203

神经网络正变得越来越受欢迎,作为机器学习和人工智能的中心范畴,它们将在未来几年的技能、科学和工业中发挥重要作用。它的高度盛行现已发生了许多结构,这些结构答应你在不知道它们背面的完好理论的情况下十分简略地完结神经网络。

为了愈加深化地了解神经网络,咱们将从头开端实践完结NN,而不运用任何结构。这或许比运用结构困难一些,但您将能够更好地了解神经网络背面的机制。当然,在大型项目中,首选结构完结,由于运用结构能够设置起来更简略,更方便。

本教程中运用numpy库(用于线性代数操作的科学库)。假定你装置了python和pip,你能够经过运转这个指令来装置numpy:

pip install numpy

神经网络实践上是许多变量的函数:它承受输入,进行核算并发生输出。咱们喜爱将其可视化为不同层中的神经元,层中的每个神经元与前一层和下一层中的一切神经元相连。一切的核算都发生在那些神经元内,并取决于将神经元相互衔接的权重。因而,咱们所要罗特克斯有限公司做的便是学习正确的权重,以取得所需的输出。

它们的结构一般十分复杂,包括许多层,乃至超越100万个神经元,以便能够处理咱们这个年代的深圳摇号,怎样运用Python从头开端构建一个简略的神经网络,鹰潭气候大型数据集。可是,为了了解大型深度神经网络是怎样作业的,咱们应该从最简略的开端。

因而,下面咱们将完结一个十分简略的两层网络。为了做到这一点,咱们还需求一个十分简略的数据集,因而咱们将在示例中运用XOR数据集,如下所示。A和B是神经网络的两个输入,A XOR B是输出。咱们将测验让咱们的神经网络学习权值,这样不管它承受哪对A和B作为输入,深圳摇号,怎样运用Python从头开端构建一个简略的神经网络,鹰潭气候它都会回来相应的成果。

首要,咱们需求界说神经网络的结构。由于咱们的数据集相对简略,只要一个躲藏层的网络就能够了。所以咱们将有一个输入层,一个躲藏层和一个输出层。接下来咱们需求激活函数。sigmoid函数是最终一层的一个很好的挑选,由于它输出0到1之间的值,而tanh(双曲正切)在躲藏层中作业得更好,可是其他常用函数都能够作业(例如ReLU)。所以神经网络的结构如下所示:

这儿,要学习的参数是权重W1,W2和误差b1,b2。如您所见,W1和b1衔接输入层和躲藏层,而W2,b2衔接躲藏层和输出层。依据NN的基本理论,咱们知道激活A1和A2核算如下:

A1 = h(W1*X + b1)
A2 = g(W2*A1 + b2)

其间g和h是咱们挑选的两个激活函数(关于咱们sigmoid和tanh),W1,W1,b1,b2一般是矩阵。

现在让咱们跳转到实践的代码中。代码风格遵从教授提出的辅导准则。

首要,咱们将完结如下界说的sigmoid激活函数:g(z)= 1 /(1 + e ^( - z))其间z一般是矩阵。走运的是numpy支撑运用矩阵进行核算,因而代码相对简略:

import numpy as np
def sigmoid(z):
return 1深圳摇号,怎样运用Python从头开端构建一个简略的神经网络,鹰潭气候/(1 + np.exp(-z))

接下来,咱们有必要初始化参数。权重矩阵W1和W2将从正态分布中随机初始化,而误差b1和b2将初始化为零。函数initialize_parameters(n_x, n_h, n_y)将每层的单元数作为输入,并正确初始化参数:

def initialize_parameters(n_x, n_h, n_y):
W1 = np.random.randn(n_h, n_x)
b1 = np.zeros((n_h, 1))
W2 = np.random.randn(n_y, n_h)
b2 = np.zeros((n_y, 1))
parameters = {
"W1": W1,
"b1" : b1,
湖南旭荣制衣有限公司"W2": W2,
"b2" : b2
}
return parameters

下一步是完结正向传达。函数forward_prop(X,深圳摇号,怎样运用Python从头开端构建一个简略的神经网络,鹰潭气候 parameters)深圳摇号,怎样运用Python从头开端构建一个简略的神经网络,鹰潭气候将神经网络输入矩阵X守夜人营地在哪和参数字典作为输入,并回来NN A2的输出,其间包括一个缓存字典,稍后在反向传达中运用。

def forward_prop(X, parameters):
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
Z1 =浅忆娱乐网 np.dot(W1, X) + b1混沌神传奇
A1 = np.tanh(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2)
cache = {
"A1": A1,
"A2": A2
}
return A2, cache

现在咱们要核算丢失函数。咱们将运用穿插熵丢失函数。Calculate_cost(A2, Y)将NN A2和groundtruth矩阵Y的成果作为输入,回来穿插熵丢失:

def calculate_cost(A2, 情荡涟漪Y):
cost = -np.sum(np.multiply(Y, np.log(A2)) + np.multiply(1-Y, np.log(1-A2)))/m
cost = np.squeeze(cost)
return cost

现在神经网络算法最困难的部分,反向传达。这个函数将回来丢失函数相关于咱们网络的4个参数(W1, W2, b1, b2)的梯度:

def backward_prop(X, Y, cache, parameters):
A1 = cache["A1"]
A2 = cache["A2"]
W2 = parameters["W2"]
dZ2 = A2 - Y
dW2 = n艾旭林布鲁克p.dot(dZ2, A1.T)/m
db2 = n大战黑人p.sum(dZ2, axis=1, keepdims=True)/m
dZ1 = np.multiply(np.dot(W2.T李淑显, dZ2), 1-np.power(A1, 2))
dW1 = np.dot(dZ1, X.T)/m
db1 = np.sum(dZ1, axis=1, keepdims=True)/m
grads = {
"dW1": dW1,
"db1": db1,
"dW2": dW2,
"db2": db2
}
return grads

咱们将运用Gradient Descent算法更新咱们的参数:

def update_parameters(parameters, grads, learning_rate):
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
dW1 = grads["dW1"]
db1 = grads["db1"]
dW2 = grads["dW2"]
db2 = grads["db2"]
W1 = W1 - learning_rate*dW1
b1 = b1 - learning_rate*db1
W2 = W2 - learning_rate*dW2
b2 = b2 - learning_rate*db2

new_parameters = {
"W1": W1,
"W2": W2,
"b1" : b1,
"b2" : b2
}
return new_parameters

到目前为止,咱们现已完结了一轮练习所需的一切函数。现在咱们要做的便是将它们放在一个名为model()的函数中,并从主程序中调用model()。

Model()函数将特征矩阵X、标签矩阵Y、单位数n_x、n_h、n_y、要运转梯度下降算法的迭代次数和梯度下降的学习率作为输入,并结合上述一切函数回来模型的练习参数:

def model(X, Y, n_x, n_h, n_y, num_of_iters, learning_rate)抗日柔情农妇随身空间:
parameters = initialize_parameters(n_x, n_h, n_y)
for i in range(0, num_of_iters+1):
a2, cache = forward_prop(X, parameters)
cost = calculate_cost(a2, Y)
grads = backward_prop(X, Y, cache, parameters)
parameters = update_parameters(parameters, grads, learning_rate)
if(i%100 == 0):
print('Cost after iteration# {:d}: {:f}'.format(i, cost))
return parameters

上述函数将回来神经网络的重生蒙古创立西北军练习参数。函数predict(X, parameters)以咱们想要核算XOR函数的2个数字和模型的练习参数作为输入,并经过运用0.5的阈值回来希望的成果y_forecast:

def predict(X, parameters):
a2, cache = forward_prop(X, parameters)
yhat = a2
yhat = np.squeeze(yhat)
if(yhat >= 0.5):
y_predict = 1
else:
y_predict = 0
return y_predict

现在让咱们转到主程序并声明咱们的矩阵X,Y和超参数n_x,n_h,n_y,幻月狂诗曲num_of_iters,learning_rate:

np.random.seed(2)
# The 4 training examples by columns
X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]])
# The outputs of the XOR for every example in X
Y = np.array([[0, 1, 1, 0]])
# No. of training examples
m = X.shape[1]
# Set the hyperparameters
n_x = 2 #No. of neurons in first layer
n_h = 2 #No. of neurons in hidden layer
n_y = 1 #No. of neurons in output layer
num_of_iters = 1000
learning_rate = 0.3

完结上述一切设置后,在其上练习模型如下述Python代码:

t深圳摇号,怎样运用Python从头开端构建一个简略的神经网络,鹰潭气候rained_parameters = model(X, Y, n_x, n_h, n_y, num_of_i艾卡时髦酒店ters, learning_rate)

最终让咱们对一对随机数进行猜测:

# Test 2X1 vecto主力校草美男团r to calculate the XOR of its elements. 
# You can try any of those: (0, 0), (0, 1), (1, 0), (1, 1)
X_test = np.array([[1], [1]])
y_predict 卡阴= predic张冰洁自传t(X_test, trained_parameters)
# Print the result
print('Neural Network深圳摇号,怎样运用Python从头开端构建一个简略的神经网络,鹰潭气候 prediction for example ({:d}, {:d}) is {:d}'.format(
X_test[0][0], X_test[1][0], y_predict))

让咱们看看咱们的成果。假如咱们运斗破天地龙王求亲请排队行咱们的文件,请运用此指令说xor_nn.py

python xor_nn.py

咱们得到以下成果,这确实是正确的,由于1XOR1 = 0!

当然,为了练习具334eee有多个层和躲藏单元的大易聊网络电型网络,您或许需求运用上述算法的一些变体,例如,您或许需求运用批量梯度下降而不是梯度下降或运用更多层,可是首要思维是如上所述的简略NN。

您能够自己调整超参数,并测验不同的神经网络架构。例如,您能够测验较少的迭代次数,由于Cost好像快速下降,其间1000个或许有点大。