Python实现的人工神经网络算法示例【基于反向传播算法】

  • Post category:Python

下面是Python实现的人工神经网络算法示例【基于反向传播算法】的完整攻略:

算法简介

人工神经网络算法是模拟人脑神经元之间相互联接的计算系统,通过对大量的数据进行学习训练,实现对未知数据的识别、分类或预测等任务。其中反向传播算法是一种基于梯度下降算法的学习算法,通过不断调整网络的权重和偏置值,使得损失函数的值最小化,从而达到对数据进行拟合的目的。

算法实现

1.数据预处理

在实现反向传播算法之前,需要对数据进行预处理,包括数据的归一化、分割为训练集和测试集等步骤。

# 加载数据
def load_data(file_path):
    data,labels = [],[]
    with open(file_path,'r') as f:
        for line in f.readlines():
            line = line.strip().split(',')
            data.append([float(x) for x in line[1:]])
            labels.append(int(line[0]))
    return np.array(data),np.array(labels)

# 归一化数据
def normalize_data(data):
    return (data - np.mean(data,axis=0)) / np.std(data,axis=0)

# 分割数据集
def split_data(data,labels,train_ratio=0.8):
    n_samples = len(labels)
    n_train = int(n_samples*train_ratio)
    shuffle_index = np.random.permutation(n_samples)
    train_index = shuffle_index[:n_train]
    test_index = shuffle_index[n_train:]
    return data[train_index],labels[train_index],data[test_index],labels[test_index]

file_path = 'data/digits.csv'
data,labels = load_data(file_path)
data = normalize_data(data)
x_train,y_train,x_test,y_test = split_data(data,labels)

2.定义网络结构

在实现反向传播算法之前,需要先定义神经网络的结构,包括层数、每层神经元的数量和激活函数等参数,本例中定义了一个包含两个隐藏层的全连接神经网络。

class NeuralNetwork:

    def __init__(self,input_dim,hidden_dims,output_dim):
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.hidden_dims = hidden_dims
        self.weights = []
        self.biases = []
        self.activations = []

        # 初始化权重和偏置值
        dims = [input_dim] + hidden_dims + [output_dim]
        for i in range(len(dims)-1):
            self.weights.append(np.random.randn(dims[i],dims[i+1]))
            self.biases.append(np.random.randn(dims[i+1]))
            self.activations.append(self.sigmoid)

    # 定义激活函数
    def sigmoid(self,x):
        return 1 / (1 + np.exp(-x))

    # 前向传播
    def forward(self,x):
        self.zs = []
        self.activations_values = [x]
        for i in range(len(self.weights)):
            z = np.dot(self.activations_values[i],self.weights[i]) + self.biases[i]
            self.zs.append(z)
            activation = self.activations[i](z)
            self.activations_values.append(activation)
        return self.activations_values[-1]

    # 计算损失函数
    def loss(self,y_pred,y_true):
        return np.sum((y_pred - y_true)**2)

    # 反向传播
    def backward(self,x,y_true):
        # 计算输出层的误差
        y_pred = self.forward(x)
        delta_output = (y_pred - y_true) * y_pred * (1 - y_pred)

        # 计算隐藏层的误差
        deltas = [delta_output]
        for i in range(len(self.weights)-1,-1,-1):
            delta = np.dot(deltas[-1],self.weights[i].T) * self.activations[i](self.zs[i],derivative=True)
            deltas.append(delta)
        deltas.reverse()

        # 更新权重和偏置值
        for i in range(len(self.weights)):
            self.weights[i] -= self.learning_rate * np.dot(self.activations_values[i].T,deltas[i])
            self.biases[i] -= self.learning_rate * np.sum(deltas[i],axis=0)

3.训练模型

定义好神经网络结构之后,就可以开始训练模型了,训练模型的过程是通过多次迭代,不断调整权重和偏置值的值,使得损失函数的值逐渐减小,达到可接受的误差范围后结束训练。

# 定义训练过程
def train(model,x_train,y_train,batch_size=100,learning_rate=0.01,epochs=10):
    n_samples = len(y_train)
    n_batches = int(n_samples / batch_size)
    model.learning_rate = learning_rate

    # 迭代训练epoch次
    for i in range(epochs):
        print('Epoch: {}/{}'.format(i+1,epochs))
        shuffle_index = np.random.permutation(n_samples)

        # 对每个batch进行训练
        for j in range(n_batches):
            # 获取当前batch的数据
            batch_index = shuffle_index[j*batch_size:(j+1)*batch_size]
            x_batch = x_train[batch_index]
            y_batch = y_train[batch_index]

            # 进行反向传播,更新权重和偏置值
            model.backward(x_batch,y_batch)

        # 每个epoch结束后打印损失函数的值
        y_pred = model.forward(x_train)
        loss = model.loss(y_pred,y_train)
        print('Loss: {}'.format(loss))

# 创建神经网络模型
model = NeuralNetwork(input_dim=64,hidden_dims=[50,20],output_dim=10)

# 训练模型
train(model,x_train,y_train,batch_size=100,learning_rate=0.01,epochs=10)

4.测试模型

最后一步是用测试集数据测试训练好的模型,统计模型在测试集上的准确率和损失函数值等指标,以评估模型的性能。

# 定义测试过程
def test(model,x_test,y_test):
    y_pred = model.forward(x_test)
    pred_labels = np.argmax(y_pred,axis=1)
    true_labels = y_test
    accuracy = np.sum(pred_labels==true_labels) / len(true_labels)
    loss = model.loss(y_pred,y_test)
    print('Accuracy: {:.2f}%'.format(accuracy*100))
    print('Loss: {}'.format(loss))

# 测试模型
test(model,x_test,y_test)

示例1:手写数字识别

下面是手写数字识别的例子,训练样本使用的是MNIST数据集,该数据集包含大约6万张28×28的图片,每张图片表示一个手写数字,训练集和测试集的比例为8:2,目标是对测试集的手写数字进行识别。

# 加载数据
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784',version=1)
data = mnist.data / 255.
labels = mnist.target.astype(int)

# 归一化、分割数据集
data = normalize_data(data)
x_train,y_train,x_test,y_test = split_data(data,labels)

# 创建神经网络模型
model = NeuralNetwork(input_dim=784,hidden_dims=[256,128],output_dim=10)

# 训练模型
train(model,x_train,y_train,batch_size=100,learning_rate=0.01,epochs=10)

# 测试模型
test(model,x_test,y_test)

示例2:鸢尾花分类

下面是鸢尾花分类的例子,样本数据使用的是iris数据集,该数据集包含150个样本,每个样本包含4个特征值,分别为花萼长度、花萼宽度、花瓣长度和花瓣宽度,样本分为三类鸢尾花,目标是对新的样本进行分类。

# 加载数据
from sklearn.datasets import load_iris
iris = load_iris()
data = iris.data
labels = iris.target

# 归一化、分割数据集
data = normalize_data(data)
x_train,y_train,x_test,y_test = split_data(data,labels)

# 创建神经网络模型
model = NeuralNetwork(input_dim=4,hidden_dims=[5,3],output_dim=3)

# 训练模型
train(model,x_train,y_train,batch_size=10,learning_rate=0.01,epochs=10)

# 测试模型
test(model,x_test,y_test)

以上就是Python实现的人工神经网络算法示例【基于反向传播算法】的完整攻略。