在当今的人工智能领域,神经网络已经成为解决复杂问题的核心技术之一。从图像识别到自然语言处理,再到强化学习,神经网络的身影无处不在。然而,对于许多初学者来说,神经网络似乎是一个神秘而复杂的黑盒子。本文将带你用基础的 Python 代码构建一个简单的神经网络,揭开它的神秘面纱,让你真正理解神经网络的工作原理。
一、神经网络的基本原理
在深入了解代码之前,我们需要先回顾一下神经网络的基本原理。神经网络是由大量的神经元(或节点)组成的,这些神经元按照一定的层次结构连接在一起。每一层的神经元接收来自前一层神经元的输入,并通过一个激活函数生成输出,传递给下一层。
一个典型的神经网络包括:
-
输入层:接收外部数据。
-
隐藏层:对输入数据进行处理和变换。
-
输出层:生成最终的预测结果。
神经网络的学习过程主要通过调整神经元之间的连接权重来实现。通过反向传播算法(Backpropagation),网络可以根据预测结果与真实值之间的误差,逐步调整权重,使误差最小化。
二、构建神经网络的 Python 环境
在开始编写代码之前,我们需要准备好 Python 环境。本文使用的工具是 Python 3.8 及以上版本,并且需要安装以下库:
-
NumPy:用于高效的数值计算。
-
Matplotlib:用于可视化数据和训练过程。
你可以通过以下命令安装这些库:
pip install numpy matplotlib
三、用基础 Python 代码构建神经网络
1. 数据准备
为了方便理解,我们先构建一个简单的数据集,用于训练神经网络。假设我们有一个二分类问题,数据集由二维特征和对应的标签组成。
import numpy as np
# 构造简单的二分类数据集
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # 输入数据
y = np.array([0, 1, 1, 0]) # 对应的标签 (异或问题)
2. 初始化神经网络结构
我们定义一个简单的神经网络,包含一个输入层、一个隐藏层和一个输出层。隐藏层的神经元数量可以自行设置,这里我们选择 4 个神经元。
# 神经网络参数
input_size = 2 # 输入层神经元数量
hidden_size = 4 # 隐藏层神经元数量
output_size = 1 # 输出层神经元数量
# 初始化权重和偏置
np.random.seed(42) # 设置随机种子,保证结果可复现
weights_input_hidden = np.random.randn(input_size, hidden_size) # 输入层到隐藏层的权重
bias_hidden = np.zeros((1, hidden_size)) # 隐藏层偏置
weights_hidden_output = np.random.randn(hidden_size, output_size) # 隐藏层到输出层的权重
bias_output = np.zeros((1, output_size)) # 输出层偏置
3. 激活函数及其导数
激活函数是神经网络中的关键组件,它为网络引入了非线性特性。这里我们使用 Sigmoid 激活函数及其导数。
def sigmoid(x):
"""Sigmoid 激活函数"""
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
"""Sigmoid 激活函数的导数"""
retu