神经网络输出层的设计

在分类问题与回归问题的解决上输出层可以采用不同的激活函数!一般来说,回归问题可用恒等函数,分类问题可用softmax函数

softmax函数

表达式:$y_{k}=\frac{e^{a _{k}}} {  \sum_{i=1}^na_i }$

如上公式:分子为输入信号ak的指数函数,分母为所有输入信号的指数函数的和。用图表示输入信号在通过softmax函数之后的输出机构图。

softmax函数在网络中的
softmax函数

从图中,可以看出每一项的输出,都与每一个输入信号有关!

python实现softmax函数

过程显示

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

exp_a = np.exp(a) # 指数函数
print(exp_a) [  1.34985881  18.17414537  54.59815003]

sum_exp_a = np.sum(exp_a) # 指数函数的和
print(sum_exp_a) 74.1221542102

y = exp_a / sum_exp_a
print(y) [ 0.01821127  0.24519181  0.73659691]

实现函数

def softmax(a):    
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

关于softmax实现过程中的缺陷

因为softmax函数进行的为指数运算,但是指数运算的过程中有可能会导致数值变的特别的大,从而超过的了int的最大存储位数。因此,就会导致计算变的不在准确

因此作出如下改进:

$$ y_{k}=\frac{e^{a _{k}}} { \sum_{i=1}^na_i } \\ \qquad = \frac{ Ce^{a _{k}}} {C \sum_{i=1}^na_i } \\ \qquad \qquad \quad = \frac{ e^{(a _{k} + \ln C)}} { \sum_{i=1}^n(a_i+\ln C) } \\ \qquad \qquad = \frac{ e^{(a _{k} + C _{\prime})}} { \sum_{i=1}^n(a_i+ C _{\prime}) } $$

通过上面的推导式可以得出,softmax函数在做指数函数运算的时候,加上或者减去某个常数并不会改变运算的结果!虽然这里的常数可以为任何值,但是添加这个 常数的目的就是为了防止计算过程中溢出,因此一般会使用输入信号中的最大值

经过修改的softmax函数

def softmax(a):    
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a

    return y

softmax函数的特征

softmax函数的输出值处于0.0到1.0之间,实数。并且softmax的输出值的总和恒等于1。因为有了这个重要的性质,softmax函数的输出可以解释为“概率”。用于多分类问题上很不错。

因为softmax函数为单调递增函数,因此输入的信号值越大,输出的值也越大,这在判断哪一个输出结果为最佳结果(恒等函数可以将输出最大的作为最佳结果)的方面帮助没有那么的大,并且指数运算需要消耗计算机一定的运算量,因此输出层的softmax函数一般会被省略。

输出层的神经元数量

输出层的神经元数量需要根据待解决的问题来决定。分类问题,可以类别的数量设置为输出层的数量,就像手写数字的识别(0-9)10个数字,输出层神经元数量可以设置为10个。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇