📜  人工神经网络教程(1)

📅  最后修改于: 2023-12-03 14:49:07.846000             🧑  作者: Mango

人工神经网络教程

人工神经网络(Artificial Neural Network,简称ANN),是一种模拟人脑神经网络的计算模型。在机器学习、数据挖掘、语音识别、图像识别等领域被广泛应用。

本教程将介绍人工神经网络的基本概念、结构、算法,并使用Python实现一个简单的神经网络模型。

基本概念
神经元(Neuron)

神经元是神经网络的基本单元,它接收输入,进行处理后产生输出。一个神经元通常具有多个输入和一个输出,每个输入都有一个权重,输出是输入的加权和。

层(Layer)

神经网络由多个层组成,每一层由多个神经元组成。最基本的神经网络有输入层、输出层和中间层(也称为隐含层)。输入层中每个神经元代表一个输入特征,输出层中每个神经元代表一个输出分类,中间层则是信息处理的主要部分。

权重(Weight)

每个神经元接收到的输入都有一个权重,它表示该输入对神经元的影响程度。权重可以通过训练优化,以达到最优化的分类结果。

偏置(Bias)

每个神经元还有一个偏置,它表示神经元的内部状态。偏置通常设置为1,它可以使神经元更容易被激活。

激活函数(Activation Function)

激活函数将神经元的加权和转化为神经元的输出。常见的激活函数包括Sigmoid、ReLU、Tanh等。

前向传播(Forward Propagation)

前向传播指的是神经网络计算输出的过程。输入特征经过输入层后,依次经过中间层,最终输出分类结果。

反向传播(Back Propagation)

反向传播是神经网络训练的核心算法。通过计算训练样本的误差,反向传播可以调整神经网络的权重和偏置,以最小化误差。

神经网络结构

我们可以用一个简单的三层神经网络来解释神经网络的结构。

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实现了一个简单的神经网络模型。神经网络是一种非常强大的机器学习算法,可以解决分类、回归、聚类等各种问题。希望这个教程能够帮助你入门神经网络,并掌握其实现和应用。