飞道的博客

深度学习导论--线性神经网络、delta学习规则、梯度下降法(python实现)

324人阅读  评论(0)

线性神经网络

  1. 与感知器区别
    • 感知器激活函数输出两种值,使用sign函数调整权值
    • 线性神经网络激活函数(线性函数)输出任意值,使用LMS(最小均方)调整权值和偏置
    • purelin函数(y=x)

LMS学习规则:最小均方规则

线性神经网络结构

  • purelin用于训练

  • sign用于预测

delta学习规则:连续感知器学习规则

利用梯度下降法的一般性学习法则

代价函数(损失函数)

梯度下降

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

在单变量的实值函数的情况,梯度只是导数,或者,对于一个线性函数,也就是线的斜率

梯度下降的问题

  1. 学习率难取
    1. 太大震荡大
    2. 太小收敛慢
  2. 容易陷入局部最优解

解决异或问题

下面的代码部分,就是在输入中添加非线性输入,实现解决异或问题

代码

import numpy as np
import matplotlib.pyplot as plt

class LinearNeuralNetwork(object):
    def __init__(self, data, label,learing_rate,epoch):
        self.data = data
        self.label = label
        self.learning_rate = learing_rate
        self.W = (np.random.random(data.shape[1]) - 0.5) * 2
        self.output = 0
        self.epoch=epoch
        
        
    #更新权值
    def update(self, data, label):
        self.output = np.dot(data, self.W.T)
        # 取平均后,收敛得更快了
        delta_W = self.learning_rate * ((label - (self.output).T).dot(data)) 
        self.W += delta_W
        #self.output = np.sign(np.dot(self.W, data))
    #训练
    def fit(self, data, label):
        n = 0
        while n<self.epoch:
            self.update(data, label)
            o=np.sign(np.dot(data, self.W.T))#公式写错,应该是data*W,不是W*data结果不同
            n += 1
        print("epochs:", n)
        print(self.W)
        print("output:")
        print(o)
        return
    #获取权值
    def getW(self):
        return self.W
    #预测
    def predict(self, testData):
        return np.sign(np.dot(self.W, testData))
if __name__ == '__main__':
    #输入数据
    X = np.array([[1,0,0,0,0,0],[1,0,1,0,0,1],[1,1,0,1,0,0],[1,1,1,1,1,1]])
    #标签
    Y = np.array([-1,1,1,-1])
    LNN=LinearNeuralNetwork(X,Y,0.11,10000)
    LNN.fit(X,Y)
#求解表达式
def calculate(x,root):
    a = W[5]
    b = W[2]+x*W[4]
    c = W[0]+x*W[1]+x*x*W[3]
    if root==1:
        return (-b+np.sqrt(b*b-4*a*c))/(2*a)
    if root==2:
        return (-b-np.sqrt(b*b-4*a*c))/(2*a)
x1 = [0,1]
y1 = [1,0]
#负样本
x2 = [0,1]
y2 = [0,1]
W=LNN.getW()    

xdata = np.linspace(-1,2)

plt.figure()

plt.plot(xdata,calculate(xdata,1),'r')
plt.plot(xdata,calculate(xdata,2),'r')

plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show()

print(W)


转载:https://blog.csdn.net/weixin_42297075/article/details/104640642
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场