赞
踩
感知机对于复杂的处理,理论上是可以将其表示出来的,但是确定其合适的权重,还是需要人工干预。该工作往往是复杂且庞大的,神经网络的出现就是为了解决这个问题的。具体地讲,神经网络的一 个重要性质是它可以自动地从数据中学习到合适的权重参数。
y
=
h
(
b
+
w
1
x
1
+
w
2
x
2
)
y = h(b+w_1x_1+w_2x_2)
y=h(b+w1x1+w2x2)
h
(
x
)
=
{
0
(
x
≤
0
)
1
(
x
>
0
)
h(x) =
上文中的h(x)函数会将输入信号的总和转换为输出信号,这种函数 一般称为激活函数。如“激活”一词所示,激活函数的 作用在于决定如何来激活输入信号的总和。激活函数是连接感知机和神经网络的 桥梁。
形如h(x) 的称为阶跃函数,如果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。
h ( x ) = 1 1 + e x p ( − x ) h(x)=\frac{1}{1+exp(-x)} h(x)=1+exp(−x)1
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x):
return np.array(1/(1 + np.exp(-x)))
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # 指定y轴的范围
plt.show()
import numpy as np
import matplotlib.pylab as plt
def step_function(x):
return np.array(x > 0, dtype = np.int)
x = np.arange(-5.0, 5.0, 0.1) #在−5.0到5.0的范围内,以0.1为单位,生成NumPy数组([-5.0, -4.9, ..., 4.9])
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # 指定y轴的范围
plt.show()
h
(
x
)
=
{
0
(
x
≤
0
)
x
(
x
>
0
)
h(x) =
import numpy as np
import matplotlib.pylab as plt
def relu(x):
return np.maximum(0,x)
x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # 指定y轴的范围
plt.show()
线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无 隐藏层的神经网络”。为了具体地(稍微直观地)理解这一点,我们来思 考下面这个简单的例子。这里我们考虑把线性函数 h(x) = cx 作为激活 函数,把y(x) = h(h(h(x)))的运算对应3层神经网络A。这个运算会进行 y(x) = c × c × c × x的乘法运算,但是同样的处理可以由y(x) = ax(注意, a = c^3)这一次乘法运算(即没有隐藏层的神经网络)来表示。如本例所示, 使用线性函数时,无法发挥多层网络带来的优势。因此,为了发挥叠加层所 带来的优势,激活函数必须使用非线性函数。
第一层实现如下
代码
import numpy as np
def sigmoid(x):
return np.array(1/(1 + np.exp(-x)))
X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])
A1 = np.dot(X, W1) + B1
Z1 = sigmoid(A1)
print(A1)
print(Z1)
第二层和第三层的构造及实现与第一层类似,不做赘述。
三层完整的代码实现
import numpy as np def sigmoid(x): return np.array(1/(1 + np.exp(-x))) def identity_function(x): return x def init_network(): #进行权重和偏置的初始化 network = {} #network 为一个字典 network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) network['b1'] = np.array([0.1, 0.2, 0.3]) network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]) network['b2'] = np.array([0.1, 0.2]) network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]]) network['b3'] = np.array([0.1, 0.2]) return network def forward(network, x): #封装了将输入信号转换为输出信号的处理过程 W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] a1 = np.dot(x,W1) + b1 z1 = sigmoid(a1) a2 = np.dot(z1,W2) + b2 z2 = sigmoid(a2) a3 = np.dot(z2,W3) + b3 y = identity_function(a3) return y network = init_network() x = np.array([1.0, 0.5]) y = forward(network, x) print(y)
输 出 层 共 有 n 个 神 经 元 , 计 算 第 k 个 神 经 元 的 输 出 : y k = e x p ( a k ) ∑ i = 1 n e x p ( a i ) 输出层共有n个神经元,计算第k个神经元的输出: y_k = \frac{exp(a_k)}{ \sum_{i=1}^{n}{exp(a_i)}} 输出层共有n个神经元,计算第k个神经元的输出:yk=∑i=1nexp(ai)exp(ak)
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
上式说明,在进行softmax的指数函数的运算时,加上(或者减去) 某个常数并不会改变运算的结果。这里的C 可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值。
代码实现
def softmax(a):
exp_a = np.exp(a - np.max(a))
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
softmax函数的输出是0.0到1.0之间的实数。并且,softmax 函数的输出值的总和是1。输出总和为1是softmax函数的一个重要性质。正 因为有了这个性质,我们才可以把softmax函数的输出解释为“概率”。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。