返回

神经网络奇遇:从头开始在 Python 中构建全连接网络

人工智能

踏上人工智能的迷人旅程,我们今天将从头开始用 Python 构建一个全连接神经网络。为什么要自己动手呢?因为这不仅是一个学习的机会,也是一段探索神经网络内部运作的奇妙冒险。准备好迎接一趟激动人心的编程之旅了吗?

入门:何为全连接神经网络?

全连接神经网络是一种强大的机器学习模型,它能够学习复杂的关系和模式。想象一下一个多层网络,每一层的神经元都与前一层的所有神经元相连接。这种广泛的连接性赋予了它们处理复杂任务的能力,例如图像识别、自然语言处理和预测建模。

从零开始:逐步构建神经网络

1. 导入必要的库

首先,让我们导入必要的 Python 库:

import numpy as np
import matplotlib.pyplot as plt

2. 定义网络架构

我们的神经网络将由输入层、隐藏层和输出层组成。对于输入层,我们将使用 784 个神经元,对应于 MNIST 数据集中的图像尺寸 (28x28)。隐藏层将有 128 个神经元,而输出层将有 10 个神经元,代表 0 到 9 的数字类别。

3. 初始化权重和偏差

神经网络的权重和偏差是决定其行为的关键参数。我们将使用正态分布随机初始化这些参数:

weights = [np.random.randn(n_inputs, n_hidden), np.random.randn(n_hidden, n_outputs)]
biases = [np.zeros((n_hidden,)), np.zeros((n_outputs,))]

4. 定义激活函数

激活函数引入了非线性,使神经网络能够学习复杂模式。我们将使用 ReLU(整流线性单元)作为我们的激活函数:

def relu(x):
    return np.maximum(0, x)

5. 前向传播

前向传播是将输入数据通过网络的过程。在每一层,我们计算加权和并应用激活函数:

def forward_pass(x):
    z1 = np.dot(x, weights[0]) + biases[0]
    a1 = relu(z1)
    z2 = np.dot(a1, weights[1]) + biases[1]
    a2 = softmax(z2)
    return a2

6. 计算损失

交叉熵损失函数衡量了网络输出与预期输出之间的差异:

def cross_entropy_loss(y_pred, y_true):
    return -np.sum(y_true * np.log(y_pred))

7. 反向传播

反向传播使用损失函数的梯度来更新网络权重和偏差:

def back_propagation(x, y_pred, y_true):
    # 计算输出层的梯度
    d_weights2 = np.dot(a1.T, (y_pred - y_true))
    d_biases2 = (y_pred - y_true)

    # 计算隐藏层的梯度
    d_z1 = np.dot((y_pred - y_true), weights[1].T)
    d_a1 = relu(d_z1) * a1 * (1 - a1)
    d_weights1 = np.dot(x.T, d_a1)
    d_biases1 = d_a1

    # 更新权重和偏差
    weights[0] -= learning_rate * d_weights1
    biases[0] -= learning_rate * d_biases1
    weights[1] -= learning_rate * d_weights2
    biases[1] -= learning_rate * d_biases2

8. 训练网络

最后,我们将使用梯度下降算法训练网络:

for epoch in range(num_epochs):
    for batch in batches:
        x_batch, y_batch = batch
        y_pred = forward_pass(x_batch)
        loss = cross_entropy_loss(y_pred, y_batch)
        back_propagation(x_batch, y_pred, y_batch)

准备起飞:用 MNIST 数据集测试网络

现在,我们的全连接神经网络已经准备就绪,让我们用 MNIST 手写数字数据集对其进行测试:

from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

我们通过几个训练周期训练网络,然后计算测试集上的准确率:

accuracy = np.mean(np.argmax(network_output, axis=1) == y_test)
print(f"Accuracy: {accuracy * 100:.2f}%")

着陆:实现成果

经过一番编码和训练,我们成功地用 Python 从头开始构建了一个全连接神经网络。这个项目不仅仅是一次编程练习,更是一次对神经网络内部运作原理的深刻探索。希望这篇教程能激发你对人工智能的热情,并激励你进一步踏上这激动人心的领域。