tensorflow训练csv练

利用阿里云容器服务打通TensorFlow持续训练链路
利用阿里云容器服务打通TensorFlow持续训练链路
利用阿里云容器服务打通TensorFlow持续训练链路
本系列将利用Docker和阿里云容器服务,帮助您上手TensorFlow的机器学习方案
第三篇:打通TensorFlow持续训练链路
本文是该系列中的第三篇文章, 将为您介绍如何利用阿里云的服务快速搭建TensorFlow从训练到服务的交付平台。
随着google开源TensorFlow的脚步越来越迅猛,机器学习已经渐渐由昔日王谢堂前燕,飞入寻常百姓家。如何把机器学习的成果,迅速转化成服务大众的产品。以TensorFlow为例,一个典型的交付流程,就是TensorFlow根据输入数据进行模型训练,待训练结束和验证确定后,模型会被发布到TensorFlow Serving,就可以为大众服务了。如果能像流水线生产一辆汽车一样来实现机器学习的产品化,听起来是不是让人激动不已?
但是理想很丰满,现实很骨感,一个完整可用的机器学习生产线并不是只有TensorFlow和TensorFlow Serving就够用的,如果希望这个过程更加高效和自动化,它还需要在一些基础架构层面的支持,比如:
机器学习过程中从系统到应用的监控,其中包括
整体计算资源特别是GPU的使用情况:使用率,内存,温度
每个机器学习应用的具体使用资源情况
机器学习过程的可视化
快速高效的问题诊断
通过集中化日志的管理控制台进行轻松的一站式问题诊断
一键式的失败恢复
从失败节点调度到可用节点
分布式存储保存计算中的checkpoint,可以随时在其它节点继续学习任务
模型的持续改进和发布
利用分布式存储将模型无缝迁入生产环境
下面我们就展示一下利用阿里云容器服务快速的搭建一套从模型学习到发布的过程,这会是个逐步迭代不断优化的方案.我们后面的文章会不断迭代优化这一方案,希望容器服务在应用交付和运维方面的经验帮助数据科学家们专注于机器学习价值本身,进而提供最大的价值。目前我们的方案运行在CPU机器上,未来待HPC与容器服务的集成完成后,这个方案非常容易迁移到HPC容器集群。
机器学习生产线的搭建
创建阿里云容器服务,参考
创建OSS数据卷,这个具体步骤可以参考文章
创建阿里云日志服务,具体步骤可以参考
有了这些服务,我们就可以在阿里云容器服务上和机器学习愉快的玩耍了,我们使用的例子是机器学习界的Helloworld --- MNIST
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它也包含每一张图片对应的标签,说明这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1
首先确认OSS数据卷mnist_model被创建出来了, 并且要在mnist_model创建Minst_data文件夹,并下载所需的训练集与测试集数据
训练集图片 - 55000 张 训练图片, 5000 张 验证图片
训练集图片对应的数字标签
测试集图片 - 10000 张 图片
测试集图片对应的数字标签
2. 用如下的docker-compose模板在阿里云上一键部署TensorFlow Learning的环境,
version: '2'
image: registry-vpc.cn-hangzhou.aliyuncs.com/cheyang/mnist-export
- "python"
- "/mnist_export.py"
- "--training_iteration=${TRAIN_STEPS}"
- "--export_version=${VERSION}"
- "--work_dir=/mnist_export/Minst_data"
- "/mnist_export/mnist_model"
- mnist_model:/mnist_export
- aliyun.log_store_mnist=stdout
environment:
- CUDA_VISIBLE_DEVICES=-1
aliyun.log_store_mnist 指示会把日志导入到阿里云的日志服务中,在这里默认是从stdout导入
Volumes使用的就是容器服务的OSS数据卷
由于我们的测试环境是搭建在VPC环境,所以使用的docker image都是需要访问阿里云的vpc registry
在阿里容器服务中创建应用时,就会弹出对话框,里面需要输入的是模型版本和训练参数,我们输入的模型版本为1和训练参数为100
有了aliyun.log_store_mnist,就可以在阿里云的日志服务中看到整个学习过程, 方便问题的分析和诊断
当学习任务完成后,可以登录到服务器上看到学习出来的模型
sh-4.2# cd /mnist/model/
sh-4.2# ls
3. 现在需要做的事情就是启动一个TensorFlow Serving把学习出来的模型发布到生产环境,这里提供如下的docker-compose模板
version: '2'
image: registry-vpc.cn-hangzhou.aliyuncs.com/denverdino/tensorFlow-serving
- "/serving/bazel-bin/tensorFlow_serving/model_servers/tensorFlow_model_server"
- "--enable_batching"
- "--port=9000"
- "--model_name=mnist"
- "--model_base_path=/mnist_model"
- mnist_model:/mnist_model
- aliyun.log_store_serving=stdout
environment:
- CUDA_VISIBLE_DEVICES=-1
这里TensorFlow Serving和TensorFlow Learning通过分布式存储共享学习模型(这里用的是OSS,其实更换成NAS数据卷也是非常容易的)
4. 可以在日志服务中直接查看一下TensorFlow Serving的日志,发现版本1的模型已经加载到了serving中了
同时需要查看一下该服务的Endpoint,在这里TensorFlow Serving的Endpoint是10.24.2.11:9000。当然我们还可以将服务发布到SLB上,这在文章中已经有了比较详细的描述,就不在本文中赘述了。
5. 为了验证TensorFlow Serving,需要部署一个测试的客户端,下面是测试客户端的docker-compose模板
version: '2'
image: registry-vpc.cn-hangzhou.aliyuncs.com/denverdino/tensorFlow-serving
- "/serving/bazel-bin/tensorFlow_serving/example/mnist_client"
- "--num_tests=${NUM_TESTS}"
- "--server=${SERVER}"
- "--concurrency=${CONCURRENCY}"
创建应用的时候就会需要输入测试次数NUM_TESTS,TensorFlow Serving的EndpointSERVER,以及并发访问量CONCURRENCY
当应用创建完成后,可以看到运行结果如下,我们发现这时候的错误率是13.5
serving-client_tensor_1 | T12:46:59.Z D:59.
5 ev_posix.c:101]
Using polling engine: poll
serving-client_tensor_1 | T12:47:03.Z ('Extracting', '/tmp/train-images-idx3-ubyte.gz')
serving-client_tensor_1 | T12:47:03.Z ('Extracting', '/tmp/train-labels-idx1-ubyte.gz')
serving-client_tensor_1 | T12:47:03.Z ('Extracting', '/tmp/t10k-images-idx3-ubyte.gz')
serving-client_tensor_1 | T12:47:03.Z ('Extracting', '/tmp/t10k-labels-idx1-ubyte.gz')
serving-client_tensor_1 | T12:47:04.Z ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
serving-client_tensor_1 | T12:47:04.Z Inference error rate: 13.5%
serving-client_tensor_1 | T12:47:04.Z E:04.
69 chttp2_transport.c:1810]
close_transport: {"created":"@.","description":"FD shutdown","file":"src/core/lib/iomgr/ev_poll_posix.c","file_line":427}
6. 为了提升识别效果,就需要调整参数重新运行一次TensorFlow Learning应用重新发起一次训练.可以直接在容器云服务的页面点击变更配置
这时会弹出对话框,里面需要输入的是模型版本和训练参数,我们输入的模型版本为2和训练参数为2000
当学习完成后,再次查看NAS服务器,发现多了一个新的模型
sh-4.2# pwd
/mnist/model/
sh-4.2# ls
而这个时候查看TensorFlow Serving的日志,就会发现模型已经更新到了版本2
此时重新运行测试客户端,可以发现错误率降低到8.5%,看到新的模型在识别能力上有一定的提升
serving-client_tensor_1 | T16:54:34.Z D:34.
5 ev_posix.c:101]
Using polling engine: poll
serving-client_tensor_1 | T16:54:37.Z ('Extracting', '/tmp/train-images-idx3-ubyte.gz')
serving-client_tensor_1 | T16:54:37.Z ('Extracting', '/tmp/train-labels-idx1-ubyte.gz')
serving-client_tensor_1 | T16:54:37.Z ('Extracting', '/tmp/t10k-images-idx3-ubyte.gz')
serving-client_tensor_1 | T16:54:37.Z ('Extracting', '/tmp/t10k-labels-idx1-ubyte.gz')
serving-client_tensor_1 | T16:54:39.Z ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
serving-client_tensor_1 | T16:54:39.Z Inference error rate: 8.5%
serving-client_tensor_1 | T16:54:39.Z E:39.
68 chttp2_transport.c:1810]
close_transport: {"created":"@.","description":"FD shutdown","file":"src/core/lib/iomgr/ev_poll_posix.c","file_line":427}
PS:整个工作流程中,我们并没有SSH登录到任何主机上,完全是在容器服务管理平台上操作的。
这仅仅是一个开始,TensorFlow和TensorFlow Serving也仅仅是一个描述阿里云容器服务对于高性能计算支持的一个例子,在本节中,我们通过OSS实现了从把学习出的模型交付到对外服务,并且实现了模型的迭代,同时又利用日志服务一站式查看容器工作日志。这种方式只是实现了最基本的持续学习持续改善的概念,在生产环境还需要更加严格的验证和发布流程,我们将在未来文章中,介绍我们的方法和实践。
阿里云容器服务还会和高性能计算(HPC)团队一起配合,之后在阿里云上提供结合GPU加速和Docker集群管理的机器学习解决方案,在云端提升机器学习的效能。
想了解更多容器服务内容,请访问
用云栖社区APP,舒服~
【云栖快讯】《阿里巴巴Java开发手册》(详尽版)已经上线!您的Java学好了吗?如果没有,那就赶紧加入学习吧!&&
阿里云优惠券分享给你,用优惠券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。 注意在手机上下订单不能使用优惠券的哦。
您的八折推荐码如下:vl9sqt,a9wlha,4lvolc,zo9gj0,ciqa6f,amzwf8,qh6tzz,0f6hfv
提供了高性能可伸缩的容器应用管理服务,支持在一组云服务器上通过Docker容器来进行应用生命...
一站式提供企业即时通讯、销售管理、协同办公。
基于深度学习技术及阿里巴巴多年的海量数据支撑, 提供多样化的内容识别服务,能有效帮助用户降低...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效...
云数据库HBase2.0产品发布会TensorFlow训练单特征和多特征的线性回归
TensorFlow训练单特征和多特征的线性回归:线性回归是很常见的一种回归,线性回归可以用来预测或者分类,主要解决线性问题。
在TensorFlow中进行线性回归处理重点是将样本和样本特征矩阵化。
单特征线性回归
单特征回归模型为:y=wx+b
X = tf.placeholder(tf.float32, [None, 1])
w = tf.Variable(tf.zeros([1, 1]))
b = tf.Variable(tf.zeros([1]))
y = tf.matmul(X, w) + b
Y = tf.placeholder(tf.float32, [None, 1])
构建成本函数
cost = tf.reduce_mean(tf.square(Y-y))
梯度下降最小化成本函数,梯度下降步长为0.01
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
完整代码,迭代次数为10000
import tensorflow as tf
X = tf.placeholder(tf.float32, [None, 1])
w = tf.Variable(tf.zeros([1, 1]))
b = tf.Variable(tf.zeros([1]))
y = tf.matmul(X, w) + b
Y = tf.placeholder(tf.float32, [None, 1])
# 成本函数 sum(sqr(y_-y))/n
cost = tf.reduce_mean(tf.square(Y-y))
# 用梯度下降训练
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
x_train = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]
y_train = [[10],[11.5],[12],[13],[14.5],[15.5],[16.8],[17.3],[18],[18.7]]
for i in range(10000):
sess.run(train_step, feed_dict={X: x_train, Y: y_train})
print(&w:%f& % sess.run(w))
print(&b:%f& % sess.run(b))
多特征线性回归
多特征回归模型为:y=(w1x1+w2x2+...+wnxn)+b,写为y=wx+b。
y为m行1列矩阵,x为m行n列矩阵,w为n行1列矩阵。TensorFlow中用如下来表示模型。
X = tf.placeholder(tf.float32, [None, n])
w = tf.Variable(tf.zeros([n, 1]))
b = tf.Variable(tf.zeros([1]))
y = tf.matmul(X, w) + b
Y = tf.placeholder(tf.float32, [None, 1])
构建成本函数
cost = tf.reduce_mean(tf.square(Y-y))
梯度下降最小化成本函数,梯度下降步长为0.01
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
完整代码,迭代次数为10000
import tensorflow as tf
X = tf.placeholder(tf.float32, [None, 2])
w = tf.Variable(tf.zeros([2, 1]))
b = tf.Variable(tf.zeros([1]))
y = tf.matmul(X, w) + b
Y = tf.placeholder(tf.float32, [None, 1])
# 成本函数 sum(sqr(y_-y))/n
cost = tf.reduce_mean(tf.square(Y-y))
# 用梯度下降训练
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
x_train = [[1, 2], [2, 1], [2, 3], [3, 5], [1, 3], [4, 2], [7, 3], [4, 5], [11, 3], [8, 7]]
y_train = [[7], [8], [10], [14], [8], [13], [20], [16], [28], [26]]
for i in range(10000):
sess.run(train_step, feed_dict={X: x_train, Y: y_train})
print(&w0:%f& % sess.run(w[0]))
print(&w1:%f& % sess.run(w[1]))
print(&b:%f& % sess.run(b))
在线性回归中,TensorFlow可以很方便地利用矩阵进行多特征的样本训练。没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!14.9k 人阅读
标签:至少1个,最多5个
TensorFlow是目前最流行的深度学习框架。我们先引用一段官网对于TensorFlow的介绍,来看一下Google对于它这个产品的定位。
TensorFlow(TM) is an open source software library for numerical computation using data flow graphs. Nodes in the graph represent mathematical operations, while the graph edges represent the multidimensional data arrays (tensors) communicated between them. The flexible architecture allows you to deploy computation to one or more CPUs or GPUs in a desktop, server, or mobile device with a single API.
上文并没有提到大红大紫的Deep Learning,而是聚焦在一个更广泛的科学计算应用领域。引文的关键词有:
Numerical Computation:应用领域是数值计算,所以TensorFlow不仅能支持Deep Learning,还支持其他机器学习算法,甚至包括更一般的数值计算任务(如求导、积分、变换等)。
Data Flow Graph:用graph来描述一个计算任务。
Node:代表一个数学运算(mathmatical operations,简称ops),这里面包括了深度学习模型经常需要使用的ops。
Edge:指向node的edge代表这个node的输入,从node引出来的edge代表这个node的输出,输入和输出都是multidimensional data arrays,即多维数组,在数学上又称之为tensor。这也是TensorFlow名字的由来,表示多维数组在graph中流动。
CPUs/GPUs:支持CPU和GPU两种设备,支持单机和分布式计算。
TensorFlow提供多种语言的支持,其中支持最完善的是Python语言,因此本文将聚焦于Python API。
Hello World
下面这段代码来自于TensorFlow官网的,展示了TensorFlow训练线性回归模型的能力。
import tensorflow as tf
import numpy as np
# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3, but TensorFlow will
# figure that out for us.)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b
# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# Before starting, initialize the variables.
We will 'run' this first.
init = tf.global_variables_initializer()
# Launch the graph.
sess = tf.Session()
sess.run(init)
# Fit the line.
for step in range(201):
sess.run(train)
if step % 20 == 0:
print(step, sess.run(W), sess.run(b))
# Learns best fit is W: [0.1], b: [0.3]
下面我们来剖析一下关键代码。TensorFlow的代码往往由两个部分组成:
A construction phase, that assembles a graph, and an execution phase that uses a session to execute ops in the graph.
Session是一个类,作用是把graph ops部署到Devices(CPUs/GPUs),并提供具体执行这些op的方法。
为什么要这么设计呢?考虑到Python运行性能较低,我们在执行numerical computing的时候,都会尽量使用非python语言编写的代码,比如使用NumPy这种预编译好的C代码来做矩阵运算。在Python内部计算环境和外部计算环境(如NumPy)切换需要花费的时间称为overhead cost。对于一个简单运算,比如矩阵运算,从Python环境切换到Numpy,Numpy运算得到结果,再从Numpy切回Python,这个成本,比纯粹在Python内部做同类运算的成本要低很多。但是,一个复杂数值运算由多个基本运算组合而成,如果每个基本运算来一次这种环境切换,overhead cost就不可忽视了。为了减少来回的环境切换,TensorFlow的做法是,先在Python内定义好整个Graph,然后在Python外运行整个完整的Graph。因此TensorFlow的代码结构也就对应为两个阶段了。
Build Graph
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
tf.Variable是TensorFlow的一个类,是取值可变的Tensor,构造函数的第一个参数是初始值initial_value。
initial_value: A Tensor, or Python object convertible to a Tensor, which is the initial value for the Variable.
tf.zeros(shape, dtype=tf.float32, name=None)是一个op,用于生成取值全是0的Constant Value Tensor。
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name=None)是一个op,用于生成服从uniform distribution的Random Tensor。
y = W * x_data + b
y是线性回归运算产生的Tensor。运算符*和+,等价为tf.multiple()和tf.add()这两个TensorFlow提供的数学类ops。tf.multiple()的输入是W和x_data;W是Variable,属于Tensor,可以直接作为op的输入;x_data是numpy的多维数组ndarray,TensorFlow的ops接收到ndarray的输入时,会将其转化为tensor。tf.multiple()的输出是一个tensor,和b一起交给optf.add(),得到输出结果y。
至此,线性回归的模型已经建立好,但这只是Graph的一部分,还需要定义损失。
loss = tf.reduce_mean(tf.square(y - y_data))
loss是最小二乘法需要的目标函数,是一个Tensor,具体的op不再赘述。
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
这一步指定求解器,并设定求解器的最小化目标为损失。train代表了求解器执行一次的输出Tensor。这里我们使用了梯度下降求解器,每一步会对输入loss求一次梯度,然后将loss里Variable类型的Tensor按照梯度更新取值。
init = tf.global_variables_initializer()
Build Graph阶段的代码,只是在Python内定义了Graph的结构,并不会真正执行。在Launch Graph阶段,所有的变量要先进行初始化。每个变量可以单独初始化,但这样做有些繁琐,所以TensorFlow提供了一个方便的函数global_variables_initializer()可以在graph中添加一个初始化所有变量的op。
When you launch the graph, variables have to be explicitly initialized before you can run Ops that use their value. All variables are automatically collected in the graph where they are created. By default, the constructor adds the new variable to the graph collection GraphKeys.GLOBAL_VARIABLES. The convenience function global_variables() returns the contents of that collection. The most common initialization pattern is to use the convenience function global_variables_initializer() to add an Op to the graph that initializes all the variables.
Launch Graph
sess.run(init)
在进行任何计算以前,先给Variable赋初始值。
for step in range(201):
sess.run(train)
train操作对应梯度下降法的一步迭代。当step为0时,train里的variable取值为初始值,根据初始值可以计算出梯度,然后将初始值根据梯度更新为更好的取值;当step为1时,train里的variable为上一步更新的值,根据这一步的值可以计算出一个新的梯度,然后将variable的取值更新为更好的取值;以此类推,直到达到最大迭代次数。
print(step, sess.run(W), sess.run(b))
如果我们将sess.run()赋值给Python环境的变量,或者传给Python环境的print,可以fetch执行op的输出Tensor取值,这些取值会转化为numpy的ndarray结构。因此,这就需要一次环境的切换,会增加overhead cost。所以我们一般会每隔一定步骤才fetch一下计算结果,以减少时间开销。
基础练习:线性模型
TensorFlow是一个面向数值计算的通用平台,可以方便地训练线性模型。下面这几篇文章采用TensorFlow完成Andrew Ng主讲的Deep Learning课程练习题,提供了整套源码。
进阶练习1:深度学习
TensorFlow虽然是面向通用的数值计算,但是对深度学习的支持是它最大的特色,也是它能够引爆业界获得目前这么大的流行度的主要原因。下面这几篇文章采用TensorFlow对MNIST进行建模,涵盖了Deep Learning中最重要的两类模型:卷积神经网络CNN和循环神经网络RNN。
进阶练习2:TensorBoard
TensorFlow安装时自带了一个TensorBoard,可以对数据集进行可视化地探索分析,可以对学习过程进行可视化,可以对Graph进行可视化,对于我们分析问题和改进模型有极大的帮助。
5 收藏&&|&&29
你可能感兴趣的文章
你可能感兴趣的文章
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 tensorflow训练数据 的文章

 

随机推荐