📜  从头开始具有正向和反向传播的深度神经网络 - Python(1)

📅  最后修改于: 2023-12-03 14:49:23.026000             🧑  作者: Mango

从头开始具有正向和反向传播的深度神经网络 - Python
简介

深度神经网络是机器学习中广泛应用的一种模型,用于解决分类、回归和其他任务。本文将介绍如何从头开始构建一个具有正向和反向传播功能的深度神经网络。

步骤

1.导入必要的库

首先,我们需要导入Python中常用的一些库,包括NumPy和Matplotlib。NumPy库用于数值计算,而Matplotlib库用于可视化结果。

import numpy as np
import matplotlib.pyplot as plt

2.初始化网络参数

接下来,我们需要初始化网络的参数。这包括权重和偏差(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

3.实现正向传播

正向传播是指将输入数据通过网络层逐层传递,最终计算出预测结果的过程。这里我们使用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

4.实现反向传播

反向传播是指根据损失函数的导数,将误差从输出层逐层传递回输入层的过程。这里我们使用交叉熵损失函数。

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

5.更新参数

在完成了一次正向传播和反向传播之后,我们需要根据反向传播计算得到的梯度更新网络的参数。

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)
结论

通过上述步骤,我们可以从头开始构建一个具有正向和反向传播功能的深度神经网络。这个网络可以用于解决各种机器学习任务,并且可以根据需要进行扩展和改进。

请注意,上述代码仅为示例,实际应用时可能需要根据具体情况进行修改和优化。