Python BP反向传播神经网络

152 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

BP反向传播神经网络

在这里插入图片描述 Code:

# -*- coding: utf-8 -*-
import numpy as np
"""Sigmod激活函数"""
def sigmod(x):
    return 1.0/(1.0 + np.exp(-x))

def BackpropCE(W1,W2,X,D):
    alpha = 0.9 #学习率

    N=4 #4层网络
    for k in range(N):
        x = X[k,:].T  #对数据每行转置
        d = D[k]      #每行对应结果(标签)

        #正向计算
        v1 = np.matmul(W1, x)
        y1 = sigmod(v1) #对隐藏层结点进行sigmod处理
        v = np.matmul(W2,y1)
        y = sigmod(v)   #对输出层结点进行sigmod处理

        #误差逆向传播
        e = d - y     #误差,即真实值-预测值
        delta = e*y*(1-y)   #使得e^2最小,对e^2的一阶导数

        e1 = np.matmul(W2.T,delta)  #隐藏层结点误差
        delta1 = y1*(1-y1)*e1

        # 修正输入层到隐藏层的权重系数
        # dW1 = (alpha*delta1).reshape(4,1)
        W1 += (alpha*delta1).reshape(4,1)   #更新权重,朝着梯度下降方向,使得误差局部最小

        # 修正隐藏层到输出层的权重系数
        #dW2 = alpha * delta * y1
        W2 += alpha * delta * y1


    return W1,W2

def TestBackpropCE():
    X = np.array([[0,0,1],
                 [0,1,1],
                 [1,0,1],
                 [1,1,1]])
    D = np.array([[0],[1],[1],[0]])

    W1 = 2*np.random.random((4,3))-1
    W2 = 2*np.random.random((1,4))-1


    for epoch in range(10000):
        W1,W2 = BackpropCE(W1, W2, X, D)

    N = 4
    for k in range(N):
        x = X[k,:].T
        v1 = np.matmul(W1,x)
        y1 = sigmod(v1)
        v = np.matmul(W2,y1)
        y = sigmod(v)
        print(y)

if __name__ == "__main__":
    TestBackpropCE()


输出结果: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述