感知机的一个问题是设定权重的工作还是由人来完成的。而神经网络的一个重要性质是它可以自动从数据中学习合适的权重参数。
输入层:最左边的输入信息的一列
输出层:最右边的输出信息的一列
中间层(隐藏层):中间的神经元
感知机是对输入信息进行权重乘积加和后与一个阈值进行比较,是线性传递,无法发挥多层网络的优势(因为线性的乘积可以用一次乘积来表示h(x)=cx,y(x)=h(h(h(x))),则y(x)=ce3x)感知机用的是阶跃函数,如果使用其他的就进入了神经网络的范畴
神经网络是对输入信息权重乘积加和加上偏置后,对齐使用一个非线性激活函数进行处理,
阶跃函数、sigmoid函数、ReLU函数
python_keys:
y.astype(np.int)#将y转化为int类型
np.exe(x)#指数函数
np.maximum(x,y)#返回较大的值
阶跃函数与sigmoid函数
python_keys:
np.ndim(x)#数组的维数
x.shape#数组的大小,返回结果是元组
np.dot(A,B)#矩阵乘法
这里使用的是前向算法,假设网络的权重和偏置参数已经被算出来了,在这里使用网络对于输入的x进行判断。
机器学习问题分为学习和推理两个阶段。学习是训练模型的阶段。推理是利用模型判断或预测的阶段。
网络:
import numpy as np
import math
def sigmoid(x):
return 1.0/(1+np.exp(-x))
def init_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=a3
return y
network=init_network()
x=np.array([1.0,0.5])
y=forward(network,x)
print(y)
上面已经讲述了神经网络从输入到乘以权重加上偏置然后迭代加深。现在最后是输出。
一般而言,输出函数,回归问题(根据某个输入预测一个连续的数值的问题)使用恒等函数,分类问题使用softmax函数。
恒等函数就是等号赋值。
softmax函数分子使用输入信号Ak的指数函数,分母是所有Ai的知数函数的和。
**note:**指数函数可能会由于数值过大导致存储溢出。可以通过分子分母同时加上一个常数来避免,一般使用输入信号的最大值。
python_keys:
a=np.array([1,2,3])
c=np.max(a)#即3
a=a-c#a=[-2,-1,0]
np.exp(a-c)/np.sum(np.exp(a-c))#在指数函数内部减去常量
softmax函数特征:输出是0-1之间的实数,且所有输出值的总和是1,因此才可以解释为概率
输出层的神经元个数根据需要解决的问题来决定
书中使用了现成的数据和已经训练完成的网络来进行推理。在这里只介绍一些主要的知识点。
识别精度:即在多大程度上能够正确分类。(可以使用:正确分类数/分类总数 来进行计算)
正规化:将数据限制到某一范围内。
预处理:对神经网络的输入数据进行某种既定的转换。
数据白化:将数据整体的分布形状均匀化的方法。
批处理:对数据进行打包处理。好处:减轻数据总线的符合,即相对于数据读入可以将更多的时间用于计算。
python_keys:
from PIL import Image #图像显示模块
img=img.shape #假设这里为(784,)
img=img.reshape(28,28) #改变数组形状
img=Image.fromarray(imgnp.uint(img)) #将numpy数组转化为PIL用的数据对象
img.show()#展示
#---------分割-----------
y=np.array([1,2,3])#获取最大元素的索引,在输出函数的时候可以用来判断最后的分类类别。
print(np.argmax(y,axis=1))#axis=1返回列索引
>>>2
#---------分割-----------
range(start,end,step)#[start,end)间隔为step
#---------分割-----------
y=np.array([1,2,3])
t=np.array([1,1,1])
print(y==t)#array支持比较运算符
>>>[True,False,Flase]
print(np.sum(y==t))
>>>1