神经网络(四):应用示例之分类

一、 传统分类模型的局限

在之前的文章中(《神经网络(一)》《神经网络(二)》《神经网络(三)》),我们讨论的重点是神经网络的理论知识。现在来看一个实际的例子,如何利用神经网络解决分类问题。(为了更好地展示神经网络的特点,我们在这个示例中并不划分训练集和测试集)。

分类是机器学习最常见的应用之一,之前的章节也讨论过很多解决分类问题的机器学习模型,比如逻辑回归和支持向量学习机等。但这些模型最大的局限性是它们都有比较明确的适用范围,如果训练数据符合模型的假设,则分类效果很好。否则,分类的效果就会很差。

比如图11中展示了4种不同分布类型的数据。具体来说,数据里有两个自变量,分别对应着坐标系的横纵轴;数据分为两类,在图中用三角形表示类别0,用圆点表示类别1。如果使用逻辑回归对数据进行分类,只有图中标记1中的模型效果较好(图中的灰色区域里,模型的预测结果是类别0;白色区域里,模型的预测结果是类别1),因为在已知类别的情况下,数据服从正态分布(不同类别,分布的中心不同),符合逻辑回归的模型假设。对于标记2、3、4中的数据,由于类别与自变量之间的关系是非线性的,如果想取得比较好的分类效果,则需要其他的建模技巧。比如先使用核函数对数据进行升维,再使用支持向量学习机进行分类。

图1

二、 神经网络的优势

这样的建模方法是比较辛苦的,要求搭建模型的数据科学家对不同模型的假设以及优缺点有比较深刻的理解。但如果使用神经网络对数据进行分类,则整个建模过程就比较轻松了,只需设计神经网络的形状(包括神经网络的层数以及每一层里的神经元个数),然后将数据输入给模型即可。
在这个例子中,使用的神经网络如图2所示,是一个3-层的全连接神经网络。

图2

使用这个神经网络对数据进行分类,得到的结果如图3所示,可以看到同一个神经网络(结构相同,但具体的模型参数是不同的)对4种不同分布类型的数据都能较好地进行分类。

图3

三、 代码实现(完整的代码请见)

这一节节将讨论如何借助第三方库TensorFlow来实现神经网络,。

第一步是定义神经网络的结构,如程序清单1所示。

  1. 我们使用类(class)来实现神经网络,如第4行代码所示。在Python的类中可以定义相应的函数,但在类中,函数的定义与普通函数的定义有所不同,它的参数个数必须大于1,且第一个参数表示类本身,如第7行代码里的“self”变量。但在调用这个函数时,却不需要“手动”地传入这个参数,Python会自动地进行参数传递,比如defineANN函数的调用方式是“defineANN()”。
  2. 在ANN类中,“self.input”对应着训练数据里的自变量(它的类型是tf.placeholder),如第12行代码所示,“self.input.shape[1].value”表示输入层的神经元个数(针对如图2的神经网络,这个值等于2)。而“self.size”是表示神经网络结构的数组(针对如图2的神经网络,这个值等于[4, 4, 2])。在ANN类中,“self.input”对应着训练数据里的自变量(它的类型是tf.placeholder),如第12行代码所示,“self.input.shape[1].value”表示输入层的神经元个数(针对如图12-8的神经网络,这个值等于2)。而“self.size”是表示神经网络结构的数组(针对如图2的神经网络,这个值等于[4, 4, 2])。
  3. 接下来是定义网络的隐藏层。首先是神经元里的线性模型部分,如第18~21行代码所示,定义权重项“weights”和截距项“biases”。因此,权重项是一个的矩阵,而截距项是一个维度等于的行向量。值得注意的是,在定义权重项时,使用tf.truncated_normal函数(近似地对应着正态分布)来生成初始值,在生成初始值的过程中,我们用如下的命令来规定分布的标准差“stddev=1.0 / np.sqrt(float(prevSize))”,这样操作的原因是为了使神经网络更快收敛。定义好线性模型后,就需要定义神经元的激活函数,如第22行代码所示,使用的激活函数是tf.nn.sigmoid,它对应着sigmoid函数。
  4. 最后是定义神经网络的输出层,如第25~29行代码所示。具体的过程和隐藏层类似,唯一不同的是,输出层并没有激活函数,因此只需定义线性模型部分“tf.matmul(prevOut, weights) + biases”。
程序清单1 定义神经网络的结构
 1	|  import numpy as np
 2	|  import tensorflow as tf
 3	|  
 4	|  class ANN(object):
 5	|      # 省略掉其他部分
 6	|  
 7	|      def defineANN(self):
 8	|          
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值