neurolab中的神经元和激活函数

假设有一个直线,函数为y = x / 7 (-1 < x < 1),如下图所示
在这里插入图片描述

此时需要神经网络计算得到函数曲线,这里使用的是neurolab。

激活函数

常见的神经网络激活函数是sigmoid,当输入小于0时,函数的输出增长很缓慢,当输入大于0时,输出便极具增长,等到x大到一定程度后,输出保持在固定水准。

这里使用的是neurolab中的多层前馈感知器,即newff(),其输出的值范围在(-1, 1),所以他的激活函数应该不是sigmoid函数,而是tansig函数,如下图所示:
在这里插入图片描述

其公式是:
在这里插入图片描述

神经元

一个神经元会同时接收多个电信号,把这些电信号统一起来,用激活函数处理后再输出新的电信号,如下图:
在这里插入图片描述

神经网络算法中设计的神经元会同时接收多个输入参数,它把这些参数加总求和,然后代入用激活函数,产生的结果就是神经元输出的电信号。如果输入参数加总的值不大,那么输出的信号值就会很小,如果输入信号中,有某一个值很大其他的都很小,那么加总后值很大,输出的信号值就会变大,如果每个输入参数都不算太大,但加总后结果很大,于是输出的信号值就会很大,这种情况就使得运算具备一定的模糊性,这样就跟生物大脑的神经元运转方式很相像。

前一个神经元接收输入信号,处理后会把输出信号分别传送给下一层的多个神经元。在神经网络算法上也会模拟这种特性,在算法设计中,我们会构造如下的数据结构:
在这里插入图片描述

上面有三层节点,每层有三个节点,第一层的节点接收输入,进行运算后,在上一层的节点把处理后的电信号传达到下一层的节点时,输出信号会分成若干部分分别传给下一层的不同节点,每一部分都对应一个权值,如下图:
在这里插入图片描述

可以看到,第一层的节点1把输出信号传给第二层的节点1时,传递路径上有一个权值W(1,1),也就是节点1输出的电信号值乘以这个权值W(1,1)后,所得的结果才会提交给第二层的节点1,同理第一层节点1输出的信号要乘以W(1,2)这个权值后,所得结果才会传递给第二层节点2.

整个网络对输入进行运算后,在最外层产生输出,输出会跟结果进行比对,获取误差,然后网络再根据误差反过来调整这些层与层之间的传递参数。

读取并利用神经元的权值和偏置量

在神经网络对数据进行处理之后,就可以查看里面的参数。这里用一个简单的[3, 3, 1]神经网络为例,如下图所示:
在这里插入图片描述

其中layer就是每一层神经网络的数据,展开可以看到有输入输出数量,输入范围,输出等,其中np里面的w和b就是我们需要的权值和偏置量

从输入到第一层神经元

在这里插入图片描述

第一层神经元比较简单,可以看到‘w’是一个3行1列的数组,将输入的x分别乘以三个权重w并加上相对应的偏移量b,可以得到输出s(上图倒数第三行),这里用x代表输入,b代表偏移量,s1,s2,s3代表输出,得到公式如下:
在这里插入图片描述

不知道为什么这里的s只会显示每行数组的第一个值,但是不影响最终结果。将输出s代入tansig函数,获得最终的输出out(上图倒数第五行,同样只显示每行数组的第一个值)。

从输入到第n层神经元

这里如果只有两层神经元的话就跳过这一部分,两层以上会进入这一部分。
在这里插入图片描述

展开第n层神经元可以看到这里的权重是一个3行3列的数组

那么这时权重的分布是这样的:
在这里插入图片描述

在经过第一层神经元之后输入的列表变成三行,这里用x1,x2,x3代表输入,b1,b2,b3代表偏移量,s1,s2,s3代表输出,得到公式如下:
在这里插入图片描述

同样将输出s代入tansig函数,获得最终的输出out。

从输入到最后一层神经元

到了最后一层神经元就是开始收束的部分了,因为这里只需要一个输出,所以会将三行输入通过权重合并为一行,这一层的神经元如下图所示:
在这里插入图片描述

可以看到输入为3,输出为1,并且权重是一个一行三列的数组。用x1,x2,x3代表输入,b代表偏移量,s代表输出,得到公式如下:
在这里插入图片描述

同样将输出s代入tansig函数,获得最终的输出out。

至此,神经网络计算结束,得出结果。

我根据自己的理解写了一个读取神经元中w和b并且进行计算的代码,写的比较粗糙。

from matplotlib import pyplot as plt
import numpy as np
import neurolab as nl
import math


# 创建tansig激活函数
def tansig_function(z):
    fz = []
    for num in z:
        fz.append((math.exp(num) - math.exp(-num)) / (math.exp(num) + math.exp(-num)))
    return fz


if __name__ == '__main__':
    # 读取神经网络模型
    net = nl.load("D:/PYTHON/test/npy/net.nl")
    lay = net.layers
    r = net.inp_minmax
    # 获取输入范围
    min = r[0][0]
    max = r[0][1]
    inp = np.linspace(min, max, 20)
    inp = [inp[::-1]]

    out = []
    # 读取每一层layer的w和b
    for l in lay:
        n = l.np
        w = n['w']
        b = n['b']
        for net_layers in range(len(w)):
            for net_num in range(len(w[net_layers])):
                s = []
                for inpi in range(len(inp[0])):
                    sum = 0
                    for i in range(len(w[net_layers])):
                        sum += inp[i][inpi] * w[net_layers][i]  # 将inp乘权值
                    sum += b[net_layers]
                    s.append(sum)
                s = np.array(s)
            out.append(tansig_function(s))  # 代入激活函数进行计算
        # 在下一层神经网络中,此时的输出变为输入
        inp = out
        out = []
    inp = list(np.array(inp).ravel())
    inp = inp[::-1]
    print(inp)

运行之后可以得到跟生成的神经网络模型相同的结果。

总结

神经元中w的行数对应的是输出有几行,列数对应的是输入有几行。b的列数也同样对应输出的行数,同时b只有一行。

neurolab中newff()神经网络使用的激活函数是tansig函数而不是常见的sigmoid函数。

从layer里读取到的东西真正能用得上的就是np里的w和b,s和out可以作为校验使用,但是只会显示每一行第一个值代入得到的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值