上一篇文章我们介绍了如何使用Keras处理分类问题,那Tensorflow可不可以像处理回归问题一样,直接处理分类问题呢?
答案当然是肯定的。这篇文章我们就用之前 相同的数据,来学习如何用Tensorflow训练一个线性分类器。数据预处理的过程就略过了,可以参考上一篇文章。
同样的,为了方便与读者交流,所有的源代码都放在了这里:https://github.com/zht007/tensorflow-practice/tree/master/2_Classification>
1. 定义数据shape
在Keras中,我们只需要考虑数据的输入和输出shape,中间的Shape以及参数的Shape,Keras都可以自动帮我们搞定。然而在Tensorflow就必须手动定义参数的Shape了。
首先我们还是要借助keras的工具将标签y转换成one hot 的数据。
1 | import tensorflow as tf |
在定义权重W的Shape的时候,不妨教大家一个技巧,
Rows: W.shape[0] = X.shape[1], (输入的feature数);
columns: W.shape[1] = Y.shape[1], (输出的classfication数)
1 | n_features = X_train.shape[1] |
2. Variables和Placeholders
参数W和b是Variables,要训练的X和Y是Placeholders
1 | W = tf.Variable(initial_value = tf.random.normal(shape = w_shape)) |
3. 计算图谱Graph
与线性回归一样,线性分类器的计算图谱如下
1 | y_hat = tf.matmul(X,W) + b |
4. 损失函数和Optimizer
损失函数需要选择softmax_cross_entropy,Optimizer与线性回归一样,用梯度下降Optimizer就OK了。
1 | loss = tf.losses.softmax_cross_entropy(y_true, y_hat) |
5. Session中训练
初始化Vaiable之后就可以在Session中进行训练啦。为了实现在Keras中存储损失函数的记录的功能,我们手动定义了字典history,用来存储训练组和验证组的损失函数变化过程。
1 | epochs = 50000 |
6. 验证结果
最后我们将训练结果可视化,可以看到效果还不错,损失函数的下降曲线非常平滑,而且训练集和测试集的损失函数也相差不大。