📅  最后修改于: 2023-12-03 14:49:23.026000             🧑  作者: Mango
深度神经网络是机器学习中广泛应用的一种模型,用于解决分类、回归和其他任务。本文将介绍如何从头开始构建一个具有正向和反向传播功能的深度神经网络。
首先,我们需要导入Python中常用的一些库,包括NumPy和Matplotlib。NumPy库用于数值计算,而Matplotlib库用于可视化结果。
import numpy as np
import matplotlib.pyplot as plt
接下来,我们需要初始化网络的参数。这包括权重和偏差(biases)。我们可以使用随机值来初始化这些参数。
def initialize_parameters(layer_dims):
parameters = {}
L = len(layer_dims)
for l in range(1, L):
parameters['W' + str(l)] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01
parameters['b' + str(l)] = np.zeros((layer_dims[l], 1))
return parameters
正向传播是指将输入数据通过网络层逐层传递,最终计算出预测结果的过程。这里我们使用ReLU激活函数。
def forward_propagation(X, parameters):
A = X
L = len(parameters) // 2
for l in range(1, L):
Z = np.dot(parameters['W' + str(l)], A) + parameters['b' + str(l)]
A = np.maximum(0, Z) # ReLU activation function
ZL = np.dot(parameters['W' + str(L)], A) + parameters['b' + str(L)]
AL = 1 / (1 + np.exp(-ZL)) # Sigmoid activation function
return AL
反向传播是指根据损失函数的导数,将误差从输出层逐层传递回输入层的过程。这里我们使用交叉熵损失函数。
def backward_propagation(AL, Y, caches, parameters):
grads = {}
L = len(caches)
m = AL.shape[1]
Y = Y.reshape(AL.shape)
dAL = - (np.divide(Y, AL) - np.divide(1 - Y, 1 - AL))
dZL = dAL * (1 / (1 + np.exp(-caches['Z' + str(L)]))) * (1 - 1 / (1 + np.exp(-caches['Z' + str(L)])))
grads['dW' + str(L)] = 1 / m * np.dot(dZL, caches['A' + str(L-1)].T)
grads['db' + str(L)] = 1 / m * np.sum(dZL, axis=1, keepdims=True)
for l in reversed(range(1, L)):
dA_prev = np.dot(parameters['W' + str(l+1)].T, dZ)
dZ = dA_prev * (caches['A' + str(l)] > 0)
grads['dW' + str(l)] = 1 / m * np.dot(dZ, caches['A' + str(l-1)].T)
grads['db' + str(l)] = 1 / m * np.sum(dZ, axis=1, keepdims=True)
return grads
在完成了一次正向传播和反向传播之后,我们需要根据反向传播计算得到的梯度更新网络的参数。
def update_parameters(parameters, grads, learning_rate):
L = len(parameters) // 2
for l in range(1, L+1):
parameters['W' + str(l)] -= learning_rate * grads['dW' + str(l)]
parameters['b' + str(l)] -= learning_rate * grads['db' + str(l)]
return parameters
下面是一个使用上述函数构建和训练一个简单深度神经网络的示例:
# 设置网络结构
layer_dims = [784, 128, 64, 10]
# 初始化参数
parameters = initialize_parameters(layer_dims)
# 正向传播
AL = forward_propagation(X, parameters)
# 计算损失
cost = compute_cost(AL, Y)
# 反向传播
grads = backward_propagation(AL, Y, caches, parameters)
# 更新参数
parameters = update_parameters(parameters, grads, learning_rate)
通过上述步骤,我们可以从头开始构建一个具有正向和反向传播功能的深度神经网络。这个网络可以用于解决各种机器学习任务,并且可以根据需要进行扩展和改进。
请注意,上述代码仅为示例,实际应用时可能需要根据具体情况进行修改和优化。