前馈全连接BP神经网络介绍

前馈全连接BP(Back Propagation)神经网络是一种常用的人工神经网络模型,用于解决分类和回归问题。它由多个全连接层组成,每个神经元与相邻层的所有神经元相连。BP神经网络通过前向传播和反向传播两个过程来进行训练,通过调整神经元之间的连接权重来优化模型。

在前馈神经网络中,每个神经元的输出仅依赖于上一层的神经元输出,不存在回路或循环连接。这种结构使得神经网络的计算过程简单明了,同时也方便了梯度的计算和参数的优化。

前馈全连接BP神经网络的类图

下面是一个简化的前馈全连接BP神经网络的类图示例:

classDiagram
    class NeuralNetwork {
        - layers: List[Layer]
        - activation_function: ActivationFunction
        - learning_rate: float
        + forward_propagation(inputs: List[float])
        + backward_propagation(targets: List[float])
        + update_weights()
    }

    class Layer {
        - neurons: List[Neuron]
        + forward(inputs: List[float])
        + backward()
        + update_weights()
    }

    class Neuron {
        - weights: List[float]
        - bias: float
        + forward(inputs: List[float])
        + backward(delta: float)
        + update_weights()
    }

    class ActivationFunction {
        + activate(x: float)
        + derivative(x: float)
    }

在这个类图中,神经网络类(NeuralNetwork)包含多个层(Layer),每个层包含多个神经元(Neuron)。神经元的输出通过激活函数(ActivationFunction)进行非线性变换。通过前向传播和反向传播,神经网络可以进行训练和优化。

解决实际问题的示例

假设我们要解决一个分类问题,使用前馈全连接BP神经网络来对手写数字进行识别。我们使用MNIST数据集,其中包含了大量的手写数字图片和对应的标签。

首先,我们需要准备数据集,并对数据进行预处理。接下来,我们需要定义神经网络的结构和参数。在这个例子中,我们将使用两个隐藏层和一个输出层,每个隐藏层包含100个神经元。

# 导入相关库
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 加载数据集
digits = load_digits()
X = digits.data
y = digits.target

# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
y_one_hot = np.eye(10)[y]  # 将标签转为独热编码

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_one_hot, test_size=0.2, random_state=42)

# 定义神经网络结构和参数
input_size = X.shape[1]
hidden_size = 100
output_size = 10
learning_rate = 0.01

接下来,我们需要实现神经网络的前向传播、反向传播和权重更新等方法。

class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size, learning_rate):
        self.layers = []
        self.activation_function = ActivationFunction()
        self.learning_rate = learning_rate

        # 输入层到第一个隐藏层
        self.layers.append(Layer(input_size, hidden_size, self.activation_function, self.learning_rate))
        # 第一个隐藏层到第二个隐藏层
        self.layers.append(Layer(hidden_size, hidden_size, self.activation_function, self.learning_rate))
        # 第二个隐藏层到输出层
        self.layers.append(Layer(hidden_size, output_size, self.activation_function, self.learning_rate))

    def forward_propagation(self, inputs):
        for layer in self.layers:
            inputs = layer.forward(inputs)
        return inputs

    def backward_propagation(self, targets):
        for i in range(len(self.layers) - 1, -1, -1):
            if i == len(self.layers) - 1:
                self.layers[i].backward(targets)