人工神经网络

实验目的

掌握机器学习的进阶-深度学习

实验原理

神经网络可以看作机器学习的一种进阶,与传统机器学习算法相融起到事半功倍的奇妙效果,本文只介绍简单的BP神经网络。
人工神经网络靠的是正向和反向传播来更新神经元, 从而形成一个好的神经系统, 本质上, 这是一个能让计算机处理和优化的数学模型. 而生物神经网络是通过刺激, 产生新的联结, 让信号能够通过新的联结传递而形成反馈. 虽然现在的计算机技术越来越高超, 不过我们身体里的神经系统经过了数千万年的进化, 还是独一无二的, 迄今为止, 再复杂, 再庞大的人工神经网络系统也不能替代我们的小脑袋. 我们应该感到自豪, 也应该珍惜上天的这份礼物.
在这里插入图片描述
神经网络的工作流程分为两步:前向传播和反向传播.前向传播我不再赘述
要想弄懂神经网络原理,必须搞定反向传播和链式求导法则。
一个简单的包含输入层、隐藏层、输出层的神经网络,我们选择sigmoid作为激活函数,选择均方差损失函数
(1)此时的反向传播公式为:
在这里插入图片描述
(2)链式求导法则
在这里插入图片描述
深度学习主流框架:
pytorch结构清晰主流,多用于学术上的研究。
tensorflow2.0+keras多用于工业级别应用,定制需求。

实验过程

问题程序的设计用到了房价数据集的预测(我这里没有采用任何激活函数,也就是说导数为1)
第一步,对样本明确预测输出值与损失函数
第二步,明确参数调整策略
第三步,计算输出层阈值的梯度
第四步,计算隐层到输出层连接权值的梯度
第五步,计算隐层阈值的梯度
第六步,计算输入层到隐层连接权值的梯度
第七步,引出归纳结论

import numpy as np


class DNN(object):
    def __init__(self, x1, w11, x2, w12, w2, b1, b2):
        self.x1 = x1
        self.x2 = x2
        self.w11 = w11
        self.w12 = w12
        self.b1 = b1
        self.b2 = b2
        self.w2 = w2

    def forward(self):
        self.a = self.x1 * self.w11.T + self.x2 * self.w12.T + self.b1
        self.y = self.a * self.w2.T + self.b2

    def backward(self, t, lr):
        lr = 0.01
        loss = 0.5 * np.multiply((self.y - t), (self.y - t))
        loss = np.sum(loss)
        print(loss)
        w2_gradient = ((t - self.y).T * self.a)
        b2_gradient = t - self.y
        self.w2 += lr * w2_gradient
        self.b2 += lr * b2_gradient
        b1_gradient = (t - self.y) * self.w2
        w11_gradient = ((t - self.y) * self.w2).T * self.x1
        w12_gradient = ((t - self.y) * self.w2).T * self.x2
        self.w2 += lr * w2_gradient
        self.w11 += lr * w11_gradient
        self.w12 += lr * w12_gradient
        self.b2 += lr * b2_gradient
        self.b1 += lr * b1_gradient


def guiyihua(x):
    x_min = np.min(x)
    x_max = np.max(x)
    return (x - x_min) / (x_max - x_min)


if __name__ == '__main__':
    x1 = np.matrix([[2104, 1600, 2400, 1416, 3000]])
    x1 = guiyihua(x1)
    x2 = np.matrix([[3, 3, 3, 2, 4]])
    x2 = guiyihua(x2)
    t = np.matrix([[400, 330, 369, 232, 540]])
    t = guiyihua(t)

    w11 = np.random.rand(6, 5)
    w12 = np.random.rand(6, 5)
    w2 = np.random.rand(5, 6)
    b1 = np.random.rand(1, 6)
    b2 = np.random.rand(1, 5)

    dnn = DNN(x1, w11, x2, w12, w2, b1, b2)
    for i in range(10000):
        dnn.forward()
        dnn.backward(t, lr=0.0001)

实验结果

前几轮的损失函数明显减小趋势,不必迭代10000次,50轮就可以。

133.03991295961194
5.302694196873382
0.00791654422927087
8.267125818963879e-06
8.661433867102698e-09
9.086442818990344e-12
9.5375452504142e-15
1.0013460297898702e-17
1.051419738303274e-20
1.104204535797256e-23
1.1607949553371193e-26
1.3822014024878314e-29
1.756448109281159e-31
8.936314941956774e-32
批阅人
分数
时间2021年12月31日
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值