手撕bp——基于sigmoid的前向传播与反向传播推导

该博客详细介绍了如何手动推导和实现一个包含Sigmoid激活函数的神经网络的前向传播和反向传播过程。作者使用Python的NumPy库进行矩阵运算,并加载了预训练的权重来处理数据集。通过计算准确率,结果显示模型在测试集上的预测准确率为97.52%。
摘要由CSDN通过智能技术生成

1)目标

打算手撕一遍前向传播与反向传播的公式推导以及代码

2)推导

本次使用的神经网络模型。
在这里插入图片描述

3)手撕

全程使用sigmoid。
反向传播没考虑矩阵维度。
在这里插入图片描述

4)代码

import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
import scipy.optimize as opt

data = scio.loadmat('D:\python\homewrok\data_sets\ex3data1.mat')
weights = scio.loadmat('D:\python\homewrok\data_sets\ex3weights.mat')

x = data['X']
y = data['y']
a = {}
z = {}
theta = {}
theta1 = weights['Theta1']
theta[1] = theta1.T
theta2 = weights['Theta2']
theta[2] = theta2.T

a[1]=x
n=3
def g(x):
    return 1/(1+np.exp(-x))

def plus1(x):
    return np.c_[np.ones(len(x)),x]

for i in range(1,n):
    a[i] = plus1(a[i])
    z[i+1] = a[i] @ theta[i]
    a[i+1] = g(z[i+1])

#z4 = a3 @ theta3T
#a4 = g(z4)

def predict(prob):
    y_predict = np.zeros((prob.shape[0], 1))
    for i in range(prob.shape[0]):
        y_predict[i] = np.unravel_index(np.argmax(prob[i, :]), prob[i, :].shape)[0] + 1
    return y_predict

def accuracy(y_predict, y=y):
    m = y.size
    count = 0
    for i in range(y.shape[0]):
        if y_predict[i] == y[i]:
            j = 1
        else:
            j = 0
        count = j + count  # 计数预测值和期望值相等的项
    return count / m

prob = a[3]
y_predict = predict(prob)
accuracy(y_predict)
print ('accuracy = {0}%'.format(accuracy(y_predict) * 100))

5) 结果

accuracy = 97.52%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值