> 文章列表 > 深入理解神经网络:使用Python实现简单的前馈神经网络

深入理解神经网络:使用Python实现简单的前馈神经网络

深入理解神经网络:使用Python实现简单的前馈神经网络

在本文中,我们将深入理解前馈神经网络的原理,并使用Python编程实现一个简单的前馈神经网络。我们将使用NumPy库来处理矩阵运算,并将逐步解释神经网络的各个组成部分,包括神经元、激活函数、前向传播、反向传播和梯度下降。最后,我们将以一个简单的手写数字识别问题作为案例,展示神经网络在实际问题中的应用。

1.引入必要的库

首先,我们需要引入Python中的NumPy库,以便处理矩阵运算。

import numpy as np

2.定义激活函数

在本例中,我们将使用Sigmoid激活函数。Sigmoid激活函数可以将输入值压缩到0和1之间,使得神经元的输出具有良好的非线性特性。

def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return x * (1 - x)

3,初始化网络参数

接下来,我们将定义一个简单的前馈神经网络,包括一个输入层(2个神经元)、一个隐藏层(2个神经元)和一个输出层(1个神经元)。我们需要随机初始化网络的权重和偏置项。

input_layer_size = 2
hidden_layer_size = 2
output_layer_size = 1np.random.seed(0)
W1 = np.random.randn(input_layer_size, hidden_layer_size)
b1 = np.zeros((1, hidden_layer_size))
W2 = np.random.randn(hidden_layer_size, output_layer_size)
b2 = np.zeros((1, output_layer_size))

4.前向传播与反向传播

定义前向传播和反向传播的函数,用于计算网络输出和更新权重。

def forward_propagation(X, W1, b1, W2, b2):# 计算隐藏层的净输入和激活值Z1 = np.dot(X, W1) + b1A1 = sigmoid(Z1)# 计算输出层的净输入和激活值Z2 = np.dot(A1, W2) + b2A2 = sigmoid(Z2)# 返回各层的净输入和激活值return Z1, A1, Z2, A2def back_propagation(X, Y, Z1, A1, Z2, A2, W1, W2, b1, b2, learning_rate):# 计算样本数量m = X.shape[0]# 计算输出层的误差和权重、偏置的梯度dZ2 = A2 - YdW2 = (1 / m) * np.dot(A1.T, dZ2)db2 = (1 / m) * np.sum(dZ2, axis=0, keepdims=True)# 计算隐藏层的误差和权重、偏置的梯度dZ1 = np.dot(dZ2, W2.T) * sigmoid_derivative(A1)dW1 = (1 / m) * np.dot(X.T, dZ1)db1 = (1 / m) * np.sum(dZ1, axis=0, keepdims=True)# 使用梯度下降法更新权重和偏置W1 -= learning_rate * dW1b1 -= learning_rate * db1W2 -= learning_rate * dW2b2 -= learning_rate * db2# 返回更新后的权重和偏置return W1, b1, W2, b2

这里,我们将前向传播与反向传播过程分为两个函数。在前向传播中,我们计算神经网络各层的净输入和激活值。在反向传播中,我们计算误差并更新权重和偏置。通过这样的分离,我们可以更清晰地理解神经网络的计算过程。

5.训练神经网络

现在我们已经定义了前向传播和反向传播函数,接下来我们将使用一个简单的手写数字识别问题作为案例,展示如何训练神经网络。

首先,我们需要生成一些训练数据。在本例中,我们使用了一个简化版的手写数字识别问题,只有两个输入特征(0或1)和一个输出(0或1)。

X = np.array([[0, 0],[0, 1],[1, 0],[1, 1]])
Y = np.array([[0],[1],[1],[0]])

然后,我们定义训练参数,并对神经网络进行训练。


epochs = 10000
learning_rate = 0.1for epoch in range(epochs):# 前向传播Z1, A1, Z2, A2 = forward_propagation(X, W1, b1, W2, b2)# 反向传播并更新权重和偏置W1, b1, W2, b2 = back_propagation(X, Y, Z1, A1, Z2, A2, W1, W2, b1, b2, learning_rate)# 每1000轮打印损失函数值if epoch % 1000 == 0:loss = np.mean(np.square(Y - A2))print(f"Epoch: {epoch}, Loss: {loss}")

6.测试神经网络

训练完成后,我们可以使用训练好的神经网络对新数据进行预测。

test_data = np.array([[0, 0],[0, 1],[1, 0],[1, 1]])_, _, _, predictions = forward_propagation(test_data, W1, b1, W2, b2)
print("Predictions:", np.round(predictions))

本文向您详细介绍了如何使用Python实现简单的前馈神经网络,包括前向传播和反向传播过程。通过这个案例,您可以更好地理解神经网络的原理和实现过程。在后续的文章中,我们将继续深入探讨神经网络的其他类型和技术,帮助您更好地应用神经网络解决实际问题。