问题描述
本次使用TensorFlow对鸢尾花进行分类,鸢尾花分为三种:Iris Setosa(山鸢尾)、Iris Versicolour (变色鸢尾)以及Iris Virginica(维吉尼亚鸢尾)。
我们通过4个特征值(单位:cm)来进行区分,分别为:sepal length(萼片长度)、sepal width(萼片宽度)、petal length(花瓣长度)、petal width(花瓣宽度)。
获取数据
从网上下载数据:
1 | df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', |
一共有150条数据,每一条分别为4个特征加上标签。
数据处理
1 | #获取数据 |
标准化是指将数据按比例缩放,使之落入一个小的特定区间。
接下来转换一下标签:
- 山鸢尾->0
- 变色鸢尾->1
- 维吉尼亚鸢尾->2
1 | # 转换一下标签 |
搭建网络
开始构建神经网络,本次网络的构建为:4个结点的输入层、2个每层10个结点的隐藏层以及3个结点的输出层。
网络的权重以及偏差
1 | #权重 |
搭建网络
1 | #TensorFlow中的占位符,用于传入外部数据 |
这里说下,softmax激活函数用于多分类,它能将多个神经元的输出,映射到(0,1)区间内,这样就可以看成概率来理解,从而实现多分类。表达式为:
如下面一个神经网络的输出:
z1 = w11 * 01 + w21 * o2 + w31 * 03 + w41 * o4 + b1
z2 = w12 * 01 + w22 * o2 + w32 * 03 + w42 * o4 +b2
z3 = w13 * 01 + w23 * o2 + w33 * 03 + w43 * o4 + b3
ps: o1 代表第一个神经元的值
那么经过softmax激活可得:
损失函数以及优化器
1 | out = network(xs, weights, biases) |
损失函数使用的是交叉熵,它是一个信息论中的概念,它原来是用来估算平均编码长度的。给定两个概率分布yi和yi-,通过yi-来表示yi的交叉熵为:
交叉熵刻画的是两个概率分布之间的距离,或可以说它刻画的是通过概率分布yi-来表达概率分布yi的困难程度,yi代表正确答案,yi-代表的是预测值,交叉熵越小,两个概率的分布约接近。
优化方法使用的是梯度下降。
开始训练
训练1000次,每100次输出当前损失值。
1 | init = tf.global_variables_initializer() |
可见损失值到0.56时,梯度已经接近山底。
使用测试数据测试
1 | #获取预测值 |
可见准确率达到了百分之96。
完整代码
1 | import tensorflow as tf |