1.1从感知机到神经网络
1.1.1神经网络的例子
最左边的一列称为输入层,最右边的一列称为输出层,中间的一列称为中间层。中间层有时也称为隐藏层。
1.1.2激活函数
激活函数的作用在于决定如何来激活输入信号的总和。
a= b+w1x1+w2x2
y=h(a)
激活函数是连接感知机和神经网络的桥梁。
“朴素感知机”是指单层网络,指的是激活函数使用了阶跃函数的模型。
“多层感知机”是指神经网络,即使用sigmoid函数等平滑的激活函数的多层网络。
1.2激活函数
1.2.1阶跃函数的实现
参数x只能接受实数(浮点数),但不允许参数取NumPy数组,例如step_function(np.array([1.0,2.0])。
对NumPy数组进行不等号运算后,数组的各个元素都会进行不等号运算,生成一个布尔型数组。这里数组x中大于0的元素被转换为True,小于等于0的元素被转换为False,从而生成一个新的数组y。
如上所示,可以用astype()方法转换NumPy数组的类型。astype()方法通过参数指定期望的类型,这个例子中是np.int型。Python中将布尔型转换为int型后,True会转换为1,False会转换为0。
1.2.2 阶跃函数的图形
1.2.3 sigmoid函数的实现
这里,np.exp(-x)对应exp(-x)。注意参数x为NumPy数组时,结果也能被正确计算。
1.2.4 sigmoid函数和阶跃函数的比较
sigmoid函数的平滑性对神经网络的学习具有重要意义。
感知机中的神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号。
1.2.5 非线性函数
阶跃函数和sigmoid函数均为非线性函数。
函数本来是输入某个值后会返回一个值的转换器。
神经网络的激活函数必须使用非线性函数。
线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。如h(x)=cx,对应的三层神经网络,y(x)=cxcxcxx,即y=ax,a=c^3,
1.2.6 代码实现
1.6 手写数字识别
1.6.1 MNIST数据集
load_mnist函数以“(训练图像,训练标签),(测试图像,测试标签)”的形式返回读入的MNIST数据。
flatten=Trule时,读入的图像是以一列(一维)NumPy数组的形式保存的。
图像的显示会使用PIL(python image Library)模块。
把保存为NumPy数组的图像数据转换为PIL用的数据对象,这个转换处理由Image.fromarray()来完成。
1.6.2 神经网络的推力处理
1.6.3 批处理
rang(start,end,step)
参数axis = 1。 指定了在100x10的数组中,沿着第1维方向(以第1维为轴)找到值最大的元素的索引。矩阵的第维是列方向,第1维是行方向。