基于Python的深度学习理论与实现(P3——神经网络的实现与输出)

神经网络的实现与输出

 由上一篇的内容可以看出,神经网络可以认为是多层的、每层由平滑激活函数激活的朴素感知机。至此我们可以实现一个三层神经网络的向前传播。向前传播表示从输入到输出方向的传递处理,它表示的是一次完整的映射过程;与之向对应的是向后传播,它表示从输出层到输入层的传递,向后传播是一次完整的过程,这部分内容也是神经网络的精髓,在后续内容中会着重涉及。
 现在我们使用Python实现一个三层神经网络,其中的权重和偏置均为人工标定且没有学习过程:

import numpy as np
import activationFunc

def init_network():
    net = {}
    net['W1'] = np.array([[0.1,0.3,0.5],
                                [0.2,0.4,0.6]])
    net['B1'] = np.array([0.1,0.2,0.3])
    net['W2'] = np.array([[0.1,0.4],
                                [0.2,0.5],
                                [0.3,0.6]])
    net['B2'] = np.array([0.1,0.2])
    net['W3'] = np.array([[0.1,0.3],[0.2,0.4]])
    net['B3'] = np.array([0.1,0.2])
    return net
def forward(net,x):
    a1 = activationFunc.sigmoid( np.dot(x,net['W1'])+ net['B1'])
    a2 = activationFunc.sigmoid( np.dot(a1,net['W2']) + net['B2'])
    return (np.dot(a2,net['W3'])+net['B3'])

if __name__ == "__main__":
    inet = init_network()
    print(forward(inet,np.array([1.0,0.5])))

 注意到上述代码中引入了前面写好放在activationFunc中的sigmoid函数作为激活函数。下面为以上代码的图示:
三层神经网络图示
 从图示和代码中可以看到,我们将输入通过神经网络的向前传播得到了输出,但是在输出层没有使用任何激活函数。这是因为输出层的输出根据不同的应用场景有所不同,往往输出层的激活函数不使用前面所提到的一些激活函数,我们可以把输出层的激活函数称为输出函数,输出函数常使用:

  • 恒等函数——针对回归问题所使用的输出函数;
  • softmax函数——针对分类问题用常输出函数;
     恒等函数会将输入原样输出,因此,在使用恒等函数时,输入信号会原封不动的被输出。
     softmax函数的数学表达如下:
    y = e x p ( a k ) ∑ n i = 1 e x p ( a i ) y = \frac{exp(a_{k})}{\sum_{n}^{i=1}exp(a_{i})} y=ni=1exp(ai)exp(ak)
     softmax函数的Python实现如下:
def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a-c)
    sum_exp_a = np.sum(exp_a)
    return exp_a /sum_exp_a

 在softmax函数实现中,使用了numpy广播原理以及使用了溢出对策,即用通过减去输入信号中的最大值,来防止指数计算的溢出。
 softmax函数的输出是0.0到1.0之间的实数,并且,softmax的输出值总和恒定为1,正因为以上两个性质,我们可以将softmax的输出解释为概率;如:

a = np.array([0.3,2.9,4.0])
y = softmax(a)
print(y)

得到[0.01821127,0.24519181,0.73659691],这个结果可以解释为,y[0]出现概率为1.8%;y[1]出现的概率为24.5%;y[2]出现的概率为73.7%;这种输出恰好可以解释神经网络进行预测获得的结果——我们可以将概率最高的作为分类结果。
 关于softmax函数还需要注意的是,在使用神经网络进行分类时,输出层的softmax函数可以省略;因为即使使用softmax函数,输出值的最大的神经元位置也不会改变,但是计算机中的指数函数会耗费额外的算力。
 那为什么需要输出函数呢?使用神经网络解决问题分为训练和推理两个阶段,也可以称为学习和预测两个阶段。在训练阶段,我们需要使用softmax函数映射的输出进行损失分析,这个过程中需要使用带微积分,这个时候softmax的平滑性质会起到至关重要的作用。所以在训练阶段往往会在输出层使用softmax映射,而在推理阶段往往会将其省略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值