📅  最后修改于: 2023-12-03 14:49:07.846000             🧑  作者: Mango
人工神经网络(Artificial Neural Network,简称ANN),是一种模拟人脑神经网络的计算模型。在机器学习、数据挖掘、语音识别、图像识别等领域被广泛应用。
本教程将介绍人工神经网络的基本概念、结构、算法,并使用Python实现一个简单的神经网络模型。
神经元是神经网络的基本单元,它接收输入,进行处理后产生输出。一个神经元通常具有多个输入和一个输出,每个输入都有一个权重,输出是输入的加权和。
神经网络由多个层组成,每一层由多个神经元组成。最基本的神经网络有输入层、输出层和中间层(也称为隐含层)。输入层中每个神经元代表一个输入特征,输出层中每个神经元代表一个输出分类,中间层则是信息处理的主要部分。
每个神经元接收到的输入都有一个权重,它表示该输入对神经元的影响程度。权重可以通过训练优化,以达到最优化的分类结果。
每个神经元还有一个偏置,它表示神经元的内部状态。偏置通常设置为1,它可以使神经元更容易被激活。
激活函数将神经元的加权和转化为神经元的输出。常见的激活函数包括Sigmoid、ReLU、Tanh等。
前向传播指的是神经网络计算输出的过程。输入特征经过输入层后,依次经过中间层,最终输出分类结果。
反向传播是神经网络训练的核心算法。通过计算训练样本的误差,反向传播可以调整神经网络的权重和偏置,以最小化误差。
我们可以用一个简单的三层神经网络来解释神经网络的结构。
import numpy as np
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
# 初始化权重和偏置
self.W1 = np.random.randn(input_size, hidden_size)
self.b1 = np.zeros((1, hidden_size))
self.W2 = np.random.randn(hidden_size, output_size)
self.b2 = np.zeros((1, output_size))
def forward(self, X):
# 前向传播
self.z1 = np.dot(X, self.W1) + self.b1
self.a1 = np.tanh(self.z1)
self.z2 = np.dot(self.a1, self.W2) + self.b2
y = self.softmax(self.z2)
return y
def softmax(self, X):
# softmax激活函数
expX = np.exp(X)
return expX / expX.sum(axis=1, keepdims=True)
def cost(self, X, y):
# 计算交叉熵成本函数
y_pred = self.forward(X)
return -np.mean(np.sum(y * np.log(y_pred), axis=1))
def backprop(self, X, y, learning_rate):
# 反向传播
delta3 = self.forward(X) - y
dW2 = np.dot(self.a1.T, delta3)
db2 = np.sum(delta3, axis=0, keepdims=True)
delta2 = np.dot(delta3, self.W2.T) * (1 - np.power(self.a1, 2))
dW1 = np.dot(X.T, delta2)
db1 = np.sum(delta2, axis=0)
# 更新参数
self.W1 -= learning_rate * dW1
self.b1 -= learning_rate * db1
self.W2 -= learning_rate * dW2
self.b2 -= learning_rate * db2
def train(self, X, y, learning_rate, num_epochs):
# 训练神经网络
for epoch in range(num_epochs):
self.backprop(X, y, learning_rate)
cost = self.cost(X, y)
if epoch % 10 == 0:
print("Epoch %d: cost = %.4f" % (epoch, cost))
在这个神经网络中,我们定义了一个三层结构。输入层具有3个特征,中间层(也称为隐含层)具有4个神经元,输出层具有2个分类。
初始化权重和偏置:
def __init__(self, input_size, hidden_size, output_size):
self.W1 = np.random.randn(input_size, hidden_size)
self.b1 = np.zeros((1, hidden_size))
self.W2 = np.random.randn(hidden_size, output_size)
self.b2 = np.zeros((1, output_size))
计算前向传播:
def forward(self, X):
self.z1 = np.dot(X, self.W1) + self.b1
self.a1 = np.tanh(self.z1)
self.z2 = np.dot(self.a1, self.W2) + self.b2
y = self.softmax(self.z2)
return y
计算成本函数(交叉熵):
def cost(self, X, y):
y_pred = self.forward(X)
return -np.mean(np.sum(y * np.log(y_pred), axis=1))
计算反向传播:
def backprop(self, X, y, learning_rate):
delta3 = self.forward(X) - y
dW2 = np.dot(self.a1.T, delta3)
db2 = np.sum(delta3, axis=0, keepdims=True)
delta2 = np.dot(delta3, self.W2.T) * (1 - np.power(self.a1, 2))
dW1 = np.dot(X.T, delta2)
db1 = np.sum(delta2, axis=0)
self.W1 -= learning_rate * dW1
self.b1 -= learning_rate * db1
self.W2 -= learning_rate * dW2
self.b2 -= learning_rate * db2
训练神经网络:
def train(self, X, y, learning_rate, num_epochs):
for epoch in range(num_epochs):
self.backprop(X, y, learning_rate)
cost = self.cost(X, y)
if epoch % 10 == 0:
print("Epoch %d: cost = %.4f" % (epoch, cost))
到此为止,我们已经完成了一个简单的神经网络模型。现在我们来看一个使用神经网络解决分类问题的例子。
import numpy as np
from sklearn.datasets import make_moons
# 生成数据集
X, y = make_moons(n_samples=1000, noise=0.1, random_state=42)
# 将输出转换为独热编码
y_onehot = np.eye(2)[y]
# 创建神经网络
nn = NeuralNetwork(input_size=2, hidden_size=4, output_size=2)
# 训练神经网络
nn.train(X, y_onehot, learning_rate=0.1, num_epochs=1000)
# 测试神经网络
y_pred = np.argmax(nn.forward(X), axis=1)
# 计算精度
accuracy = np.mean(y_pred == y)
print("Accuracy = %.4f" % accuracy)
这个例子通过生成月亮形状的数据集,创建了一个具有2个特征值、4个隐含层神经元和2个输出类别的神经网络。我们将网络训练1000次,并计算在训练集上的准确率。
本教程简单介绍了人工神经网络的基本概念、结构和算法,并使用Python实现了一个简单的神经网络模型。神经网络是一种非常强大的机器学习算法,可以解决分类、回归、聚类等各种问题。希望这个教程能够帮助你入门神经网络,并掌握其实现和应用。