python实现误差逆传播算法

最近学习神经网络,自己参照源代码把误差逆传播重新写了一遍,其实挺简单的,关键是要把逆传播的几个过程搞清楚以及每一步是为了得到什么,然后知道numpy的矩阵运算操作,废话不多说,直接上代码:

# 反向传播算法
def backpro(weights, bs, x, y, nums):
    """
    逆传播计算参数的梯度
    :param weights: 权重矩阵列表,每一层一个权重矩阵,直到最后一层,整个网络构成一个矩阵集合
    :param bs: 偏置向量列表,每一层一个偏置列向量
    :param x: 输入
    :param y: 期望输出
    :param nums: 网络层数
    :return:
    """
    # 构造两个空的梯度列表,形状跟每一层权重矩阵和列向量形状相同
    nabla_weight = [np.zeros(z.shape) for z in weights]   # 每一层权重的梯度矩阵跟权重矩阵的形状相同
    nabla_b = [np.zeros(b.shape) for b in bs]  # 同理,每一层偏置的梯度列向量跟偏置列向量的形状相同

    # 定义带权输入列表,保存每一层的带权输入列向量
    zs = []
    # 定义激活值列表,保存激活值
    activation = x
    activations = [x]

    # 第一步,前向传播,计算带权输入和激活值
    for w, b in zip(weights, bs):
        # 计算当前层的带权输入z
        z = np.dot(w, activation) + b
        # 计算当前层的激活值
        activation = f(z)
        zs.append(z)
        activations.append(activation)

    # 第二步,计算输出层的误差
    delta = g(activations[-1]) * h(zs[-1])
    nabla_b[-1] = delta  # 输出层的偏置梯度即为其误差
    nabla_weight[-1] = np.dot(delta, activations[-2].transpose())

    # 第三步,误差逆传播,计算倒数第二层到第二层的误差
    for l in range(2, nums):
        # 逆传播公式,-l+1层的误差得到-l层的误差
        delta = np.dot(weights[-l+1].transpose(), delta) * h(zs[-l])
        nabla_b[-l] = delta
        nabla_weight[-l] = np.dot(delta, activations[-l-1].transpose())

    return nabla_weight, nabla_b


# 定义一个激活函数
def f(z):
    return z


# 定义一个激活函数的导函数
def h(z):
    return z


# 定义一个代价函数的导函数
def g(a):
    return a

注意:其中的激活函数及其导数,以及代价函数都没有具体的形式,自己可以根据具体情况把这是哪个函数进行修改

最后在具体操作的过程在有什么问题,欢迎大家一起交流讨论。
在下编程小白,如果有什么错误欢迎大家批评指正!
邮箱:1916728303@qq.com

神经网络误差传播算法是一种常用的神经网络训练算法,用于解决分类和回归问题。下面是一个简单的神经网络误差传播算法实验的步骤: 1.导入必要的库和数据集 ```python import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split iris = load_iris() X = iris.data y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) ``` 2.定义神经网络模型 ```python class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size self.W1 = np.random.randn(self.input_size, self.hidden_size) self.b1 = np.zeros((1, self.hidden_size)) self.W2 = np.random.randn(self.hidden_size, self.output_size) self.b2 = np.zeros((1, self.output_size)) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def sigmoid_derivative(self, x): return x * (1 - x) def forward(self, X): self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.a2 = self.sigmoid(self.z2) return self.a2 def backward(self, X, y, output): self.output_error = y - output self.output_delta = self.output_error * self.sigmoid_derivative(output) self.z2_error = self.output_delta.dot(self.W2.T) self.z2_delta = self.z2_error * self.sigmoid_derivative(self.a1) self.W1 += X.T.dot(self.z2_delta) self.b1 += np.sum(self.z2_delta, axis=0, keepdims=True) self.W2 += self.a1.T.dot(self.output_delta) self.b2 += np.sum(self.output_delta, axis=0) def train(self, X, y): output = self.forward(X) self.backward(X, y, output) ``` 3.训练神经网络模型 ```python nn = NeuralNetwork(4, 5, 3) for i in range(1000): nn.train(X_train, y_train) ``` 4.测试神经网络模型 ```python y_pred = np.argmax(nn.forward(X_test), axis=1) accuracy = np.mean(y_pred == y_test) print("Accuracy:", accuracy) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值