技术分享

金山云 > 推荐阅读 > 在金山云KDL上运行第一个机器学习程序

在金山云KDL上运行第一个机器学习程序

发布时间: 2019-11-05 13:59:29

既然我们已经搭建好了TensorFlow,那么就到了我们的第一个识别程序的时候了。之前我们show了一下我们自己的mnist数据集,这里面放的就是手写数字的图片,所以我们来写一个简单的识别手写数字的程序。

在金山云KDL上运行第一个机器学习程序.png
 首先我们明确下我们需要做的事情:
 1.定义公式算法,也就是我们的训练逻辑
 2.定义loss,选定优化器,并制定优化器优化loss
 3.迭代的用数据对算法进行训练
 4.在测试集或验证集上对准确率进行评估。

 然后再看我们的数据集,数据集中的是28X28像素的图像,对图片做一维展开得到的是一个有784维特征的样本,(此例为简单样例所以忽略了2维的空间信息,会在以后复杂的样例中添加进去。)所以对应的,我们得到的训练数据就是一个55000x784的tensor,如图1。训练数据的label就是一个55000x10的tensor。并对其进行one-hot编码。变成一个10维的向量,例如0对应的laber就是[1,0,0,0,0,0,0,0,0,0,];数字3是[0,0,0,1,0,0,0,0,0,0,],数字10就是[0,0,0,0,0,0,0,0,0,1,],数字n就代表对应位置是1。 微信截图_20191010164028.png

 然后我们开始设计算法,这里使用Softmax Regression的算法进行手写数字的分类。数字只有0-9,所以我们要对每个图片进行进行10中模式的识别,然后得出10种情况的10种概率,然后取最大的概率对应的数字作为这个图形的最终的识别输出。Softmax Regression的原理可以认识是某类特征的相加,然后将这一特征转化为判定是否是这种可能的概率。以我们的数字识别为例,对于某个数字n,该像素如果灰度值很大或者简单说存在,就有很大可能是数字n,那么这个这个像素对于这个数字n就是正数权值,反之则是负数权值。然后我们对每个图片的所有像素做加权求和,而不同像素的权重是模型根据数据自动学习和训练得来的。

 如图2,红色代表负数权值,蓝色代表正数权值。
微信截图_20191010164122.png

 明确了以上后我们将特征代入公式,设i代表第i类,j代表一张图片的第j个像素。bi就是bias,可以理解为数据倾向性,比如大部分数字都是0,那么0的特征对应的bias就会很大。然后我们得到了一个公式1:
微信截图_20191010175020.png
 然后我们对所有特征计算softmax,然后再进行标准化(让所有概率和为1) 得公式2,22.png

 再展开就得到判断第i类的概率公式3
3.png

 我们对各个类的特征求exp函数,然后做标准化,使其和为1,然后特征值越大的类最后输出的概率也越大,反之亦然,而且标准化的好处还可以保证没有0或者为负的概率,再对其进行矩阵化。得到矩阵乘法示例:
 将上面的矩阵运算写成公式可以得到一个简介的表达: 4.png

 历尽千辛万苦,我们终于得到了算法,接下来需要用TensorFlow来实现它

获取图片资源
from tensorflow.examples.tutorials.mnist import inputdata mnist = inputdata.readdatasets("MNISTdata/",onehot=True)
加载TensorFlow的包
import tensorflow as tf
创建一个session
注:session间是相互隔离的
sess = tf.InteractiveSession()
创建一个数据的输入
x = tf.placeholder(tf.float32,[None,784])
其中tf.float32是数据类型,[None,784]表示tensor的shape,Node代表不限制条数的输入,784代表每条数据784个维度。
在TensorFlow中有个用来持久化存储模型的参数的variable对象,他可以在程序生命周期中长期存在并在每次迭代中被更新。我们用variable来存储权重W和bias的值。
(784,10)代表W的shape,784的特征维度,和10类权重
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
用TensorFlow来表示之前的表达式就是 y = tf.nn.softmax(tf.matmul(x,W) + b)


 到这里我们终于定义好了算法,接下来为了训练模型我们要实现loss,并用其来描述模型的准确率,并不断优化最后达到全局最优解或者局部最优解(实际中后者更靠谱一些)。一般我们选择cross-entropy作为loss-function,其定义如下,y是预测的概率分布,y'是真实的概率分布(即label的one-hot编码),通常可以用他来判断模型对真实概率分布评估的准确程度。
TensorFlow定义cross-entropy
y_ = tf.placeholder(tf.float32,[None,10])
crossentropy = tf.reducemean(-tf.reducesum(y * tf.log(y),reduction_indices=[1]))
tf.reduce_mean表示每个batch数据的结果求平均值


 现在我们定义了算法和loss函数,就差一个优化算法了。TensorFlow可以根据我们整个的计算图自动求导,并根据反向传播(Back Propagation)算法进行训练,并在每次迭代学习中微调参数来减小loss,TensorFlow在后台还会运行很多程序来实现反向传播和梯度下降,我们只需要封装好他,并在每轮迭代时feed数据即可。

 我们调用tf.train.GradientDescentOptimizer,并设置学习速率0.5,优化目标为crossentropy。
trainstep = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
让他跑起来 tf.globalvariablesinitializer().run()


 最后一步,我们开始训练(等了好久TT),每次从训练集中随机取100个样本组成一个mini-batch,并feed给placeholder,然后调用tarinstep对样本进行训练。这种每次使用一小部分进行训练叫随机梯度下降,与使用全局比较,计算量更小,也更容易得到局部最优解。这样绝大多数情况下会比全样本训练更容易收敛。
搞起
for i in range(1000):
batchxs,batchys = mnist.train.nextbatch(100) trainstep.run({x: batchxs, y: batchys})
训练完成,开始验证
比较预测中数字概率最大的数字与真实的数据比较是否一致
correctprediction = tf.equal(tf.argmax(y,1), tf.argmax(y,1))
统计全样本预测的准确率
accuracy = tf.reducemean(tf.cast(correctprediction, tf.float32))
输出测试的准确率
print(accuracy.eval({x: mnist.test.images, y
: mnist.test.labels}))


 到此我们的代码已经写完了,考虑到本机的性能和以后随着程序越来远大,样本的数量越来越多,我选择把程序发布到金山云的kdl平台上,进行调试。

 先建个本地的打包程序
setup.py [root@vm172-31-0-10 test]# cat setup.py import setuptools setuptools.setup(name='mnist-trainer', version='1.0', packages=['mnist-trainer'])

建个目录结构,将代码放到mnist2文件中 [root@vm172-31-0-10 mnist-trainer]# tree -L 3 ├── mnist-trainer │ ├── init.py │ └── mnist2.py(我的代码) └── setup.py
然后执行setup.py
python setup.py sdist --format=gztar

在dist目录下多个了个文件 [root@vm172-31-0-10 test]# tree -L 3 . ├── dist │ └── mnist-trainer-1.0.tar.gz
然后将其打包上传到s3
ks3util put -a Private -b machine-learn mnist-trainer-1.0.tar.gz codes/mnist-trainer-1.0.tar.gz
然后登陆KDL界面,指定类型,模块和Ks3地址后运行
进行训练 下端显示输出,可以看到我们的模型准确率达到92%,撒花~~至此第一个识别小程序结束。

以上就是金山云为您带来的推荐阅读的全部内容,如果还想了解更多内容可访问金山云官网www.ksyun.com了解其它资讯。
*免责声明:部分文章信息来源于网络以及网友投稿,本网站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如本站文章和转稿涉及版权等问题,请作者在及时联系本站,我们会尽快处理。