0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TensorFlow的运行环境及求解过程详解

lviY_AI_shequ 2017-12-05 17:21 次阅读

首先,何谓tensor?即高维向量,例如矩阵是二维,tensor是更广义意义上的n维向量(有type+shape)

TensorFlow执行过程为定义图,其中定义子节点,计算时只计算所需节点所依赖的节点,是一种高效且适应大规模的数据计算,方便分布式设计,对于复杂神经网络的计算,可将其拆开到其他核中同时计算。

Theano——torch———caffe(尤其是图像处理)——deeplearning5j——H20——MXNet,TensorFlow

运行环境

下载docker

打开docker quickstart terminal

标红地方显示该docker虚拟机IP地址(即之后的localhost)

docker tensorflow/tensorflow//自动找到TensorFlow容器并下载

docker images//浏览当前容器

docker run -p 8888:8888 tensorflow/tensorflow//在8888端口运行

会出现一个token,复制该链接并替换掉localhost,既可以打开TensorFlow的一个编写器,jupyter

大体雏形#python导入importtensorflowastf#定义变量(节点)x = tf.Variable(3, name="x")y = tf.Variable(4, name="y")f = x*x*y + y +2#定义sessionsess = tf.Session()#为已经定义的节点赋值sess.run(x.initializer)sess.run(y.initializer)#运行sessionresult = sess.run(f)print(result) #42#释放空间sess.close

还有一个更简洁的一种定义并运行session方法

# a better waywith tf.Session()assess: x.initializer.run() y.initializer.run()#即evaluate,求解f的值 result = f.eval()

初始化的两行也可以写作

init = tf.global_variables_initializer()

init.run()

而session可以改作sess=tf.InteractiveSession()运行起来更方便

init =tf.global_variables_initializer()sess =tf.InteractiveSession()init.run()result =f.eval()print(result)

因而TensorFlow的代码分为两部分,定义部分和执行部分

TensorFlow是一个图的操作,有自动缺省的默认图和你自己定义的图

#系统默认缺省的图>>> x1 = tf.Variable(1)>>> x1.graph is tf.get_default_graph()True#自定义的图>>> graph = tf.Graph()>>> with graph.as_default():x2 = tf.Variable(2)>>> x2.graph is graphTrue>>> x2.graph is tf.get_default_graph()False节点的生命周期

第二种方法可以找出公共部分,避免x被计算2次。

运行结束后所有节点的值都被清空,如果没有单独保存,还需重新run一遍。

w=tf.constant(3)x=w+2y=x+5z=x*3withtf.Session()assess: print(y.eval()) #10 print(z.eval()) #15withtf.Session()assess: y_val, z_val = sess.run([y,z]) print(y_val) #10 print(z_val) #15Linear Regression with TensorFlow

(线性回归上的应用)

y = wx+b = wx'//这里x'是相较于x多了一维全是1的向量

这里引用California housing的数据

TensorFlow上向量是列向量,需要reshape(-1,1)即转置成列向量

使用normal equation方法求解

import numpyasnpfrom sklearn.datasets import fetch_california_housinghousing = fetch_california_housing()#获得数据维度,矩阵的行列长度m, n = housing.data.shape#np.c_是连接的含义,加了一个全为1的维度housing_data_plus_bias = np.c_[np.ones((m,1)), housing.data]#数据量并不大,可以直接用常量节点装载进来,但是之后海量数据无法使用(会用minbatch的方式导入数据)X=tf.constant(housing_data_plus_bias, dtype=tf.float32, name="X")#转置成列向量y=tf.constant(housing.target.reshape(-1,1), dtype=tf.float32, name="y")XT =tf.transpose(X)#使用normalequation的方法求解theta,之前线性模型中有提及theta =tf.matmul(tf.matmul(tf.matrix_inverse(tf.matmul(XT,X)), XT),y)#求出权重withtf.Session()assess: theta_value = theta.eval()

如果是原本的方法,可能更直接些。但由于使用底层的库不同,它们计算出来的值不完全相同。

#使用numpyX = housing_data_plus_biasy = housing.target.reshape(-1,1)theta_numpy = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)#使用sklearnfromsklearn.linear_modelimportLinearRegressionlin_reg = LinearRegression()lin_reg.fit(housing.data, housing.target.reshape(-1,1))

这里不禁感到疑惑,为什么TensorFlow感觉变复杂了呢?其实,这不过因为这里数据规模较小,进行大规模的计算时,TensorFlow的自动优化所发挥的效果,是十分厉害的。

使用gradient descent(梯度下降)方法求解

#使用gradient时需要scale一下from sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaled_housing_data = scaler.fit_transform(housing.data)scaled_housing_data_plus_bias = np.c_[np.ones((m,1)), scaled_housing_data]#迭代1000次n_epochs =1000learning_rate =0.01#由于使用gradient,写入x的值需要scale一下X=tf.constant(scaled_housing_data_plus_bias, dtype=tf.float32, name="X")y=tf.constant(housing.target.reshape(-1,1), dtype=tf.float32, name="y")#使用gradient需要有一个初值theta =tf.Variable(tf.random_uniform([n +1,1], -1.0,1.0), name="theta")#当前预测的y,x是m*(n+1),theta是(n+1)*1,刚好是y的维度y_pred =tf.matmul(X, theta, name="predictions")#整体误差error = y_pred -y#TensorFlow求解均值功能强大,可以指定维数,也可以像下面方法求整体的mse =tf.reduce_mean(tf.square(error), name="mse")#暂时自己写出训练过程,实际可以采用TensorFlow自带的功能更强大的自动求解autodiff方法gradients =2/m*tf.matmul(tf.transpose(X), error)training_op =tf.assign(theta, theta - learning_rate * gradients)#初始化并开始求解init =tf.global_variables_initializer()withtf.Session()assess: sess.run(init) forepoch inrange(n_epochs): #每运行100次打印一下当前平均误差 ifepoch %100==0: print("Epoch", epoch,"MSE =", mse.eval()) sess.run(training_op) best_theta = theta.eval()

上述代码中的autodiff如下,可以自动求出gradient

gradients= tf.gradients(mse, [theta])[0]

使用Optimizer

上述的整个梯度下降和迭代方法,都封装了在如下方法中

optimizer= tf.train.GradientDescentOptimizer(learning_rate=learning_rate)

training_op= optimizer.minimize(mse)

这样的optimizer还有很多

例如带冲量的optimizer = tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9)

Feeding data to training algorithm

当数据量达到几G,几十G时,使用constant直接导入数据显然是不现实的,因而我们用placeholder做一个占位符

(一般行都是none,即数据量是任意的)

真正运行,run的时候再feed数据。可以不断使用新的数据。

>>>A = tf.placeholder(tf.float32, shape=(None,3))>>>B = A +5>>>withtf.Session()assess:...B_val_1 = B.eval(feed_dict={A: [[1,2,3]]})...B_val_2 = B.eval(feed_dict={A: [[4,5,6], [7,8,9]]})...>>>print(B_val_1)[[6.7.8.]]>>>print(B_val_2)[[9.10.11.][12.13.14.]]

这样,就可以通过定义min_batch来分批次随机抽取指定数量的数据,即便是几T的数据也可以抽取。

batch_size =100n_batches = int(np.ceil(m / batch_size))#有放回的随机抽取数据deffetch_batch(epoch, batch_index, batch_size): #定义一个随机种子 np.random.seed(epoch * n_batches + batch_index) # not shown in the book indices = np.random.randint(m, size=batch_size) # not shown X_batch = scaled_housing_data_plus_bias[indices]# not shown y_batch = housing.target.reshape(-1,1)[indices]# not shown returnX_batch, y_batch#开始运行withtf.Session()assess: sess.run(init)#每次都抽取新的数据做训练 forepochinrange(n_epochs): forbatch_indexinrange(n_batches): X_batch, y_batch = fetch_batch(epoch, batch_index, batch_size) sess.run(training_op, feed_dict={X: X_batch, y: y_batch})#最终结果 best_theta = theta.eval()

Saving and Restoring models(保存模型)

有时候,运行几天的模型可能因故暂时无法继续跑下去,因而需要暂时保持已训练好的部分模型到硬盘上。

init =tf.global_variables_initializer()saver =tf.train.Saver()#保存模型withtf.Session()assess: sess.run(init) forepoch inrange(n_epochs): ifepoch %100==0: #print("Epoch", epoch,"MSE =", mse.eval()) save_path = saver.save(sess,"/tmp/my_model.ckpt") sess.run(training_op) best_theta = theta.eval() save_path = saver.save(sess,"/tmp/my_model_final.ckpt")#恢复模型withtf.Session()assess: saver.restore(sess,"/tmp/my_model_final.ckpt") best_theta_restored = theta.eval()关于TensorBoard

众所周知,神经网络和机器学习大多是黑盒模型,让人有点忐忑。TensorBoard所起的功能就是将这个黑盒稍微变白一些~

启用tensorboard

输入docker ps查看当前容器id

进入容器

使用tensorboard --log-dir=tf_logs命令打开已经存入的tf_logs文件,其生成代码如下所示

from datetime import datetimenow = datetime.utcnow().strftime("%Y%m%d%H%M%S")root_logdir ="tf_logs"logdir ="{}/run-{}/".format(root_logdir, now)...mse_summary =tf.summary.scalar('MSE', mse)file_writer =tf.summary.FileWriter(logdir,tf.get_default_graph())...ifbatch_index %10==0: summary_str = mse_summary.eval(feed_dict={X: X_batch,y: y_batch}) step = epoch * n_batches + batch_index file_writer.add_summary(summary_str, step)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8377

    浏览量

    132409
  • tensorflow
    +关注

    关注

    13

    文章

    328

    浏览量

    60499

原文标题:【机器学习】TensorFlow学习(一)

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问ESP32如何运行TensorFlow模型?

    请问ESP32如何运行TensorFlow模型?
    发表于 07-09 07:30

    干货!教你怎么搭建TensorFlow深度学习开发环境

    TensorFlow1.1.0 版本。TensorFlow安装过程安装之前,我们要了解TensorFlow对系统环境的要求,以Window
    发表于 09-27 13:56

    TensorFlow运行时无法加载本机

    您好,我想在AI DevCloud的计算节点中运行TensorFlow时出错。[u19741 @ c009-n031~] $ pythonPython 3.6.3 |英特尔公司| (默认,2018年
    发表于 10-19 12:00

    深度学习框架TensorFlow&TensorFlow-GPU详解

    TensorFlow&TensorFlow-GPU:深度学习框架TensorFlow&TensorFlow-GPU的简介、安装、使用方法详细攻略
    发表于 12-25 17:21

    Linux环境的CPU版本TensorFlow安装步骤

    Linux环境下安装CPU版本的TensorFlow
    发表于 09-05 09:26

    怎么运行Faster RCNN的tensorflow代码

    如何运行Faster RCNN的tensorflow代码
    发表于 06-15 09:25

    TensorFlow安装和下载(超详细)

    conda 环境(Windows 调用 deactivate 命令,MAC/Ubuntu 调用 source deactivate 命令)。TensorFlow安装过程解读分析Google 使用 wheel
    发表于 07-22 10:25

    第一个TensorFlow程序(hello world)详解

    消息(W),具体取决于所使用的计算机和操作系统,并声明如果针对所使用的计算机进行编译,代码运行速度可能会更快: 如果使用 TensorFlow GPU 版本,则还会获得一系列介绍设备的提示消息(I
    发表于 07-22 10:26

    详解MCU的运行过程

    课程简介:本课程基于STM32F103RC讲解,通过从MCU上电开始启动开始分析,详解MCU的运行过程,讲师“东方青”多年从事开发经验而言,学习Cortex-M系列的MCU,我们不仅仅只是会使用固件
    发表于 11-03 07:58

    浅析为Windows on Arm设置Tensorflow的步骤

    Tensorflow在Windows on Arm上本机运行。然而,为了帮助开发人员使用这些工具,本文展示了如何使用我们为此开发的一些修补程序构建自己的Tensorflow包。该过程
    发表于 08-10 15:42

    在Ubuntu 18.04 for Arm上运行TensorFlow和PyTorch的Docker映像

    包中已经对 AArch64 有一些支持,但用户可能希望从源代码编译所有内容。原因包括使用特定工具、针对不同的运行环境以及尝试从底层库改进性能。Arm 继续努力使 ML on Arm 得到很好的支持
    发表于 10-14 14:25

    C语言的运行环境运行过程

    上机1 C语言的运行环境运行过程
    发表于 03-21 17:23 0次下载

    TensorFlow是什么?如何启动并运行TensorFlow

    TensorFlow 是一款用于数值计算的强大的开源软件库,特别适用于大规模机器学习的微调。 它的基本原理很简单:首先在 Python 中定义要执行的计算图(例如图 9-1),然后 TensorFlow 使用该图并使用优化的 C++ 代码高效
    的头像 发表于 07-29 11:16 1.7w次阅读

    如何基于 ES6 的 JavaScript 进行 TensorFlow.js 的开发

    TensorFlow.js 是 TensorFlow 的 JavaScript 版本,支持 GPU 硬件加速,可以运行在 Node.js 或浏览器环境中。它不但支持完全基于 JavaS
    的头像 发表于 10-31 11:16 3086次阅读

    在MaaXBoard RT上运行几乎任何TensorFlow模型

    电子发烧友网站提供《在MaaXBoard RT上运行几乎任何TensorFlow模型.zip》资料免费下载
    发表于 10-31 10:28 2次下载
    在MaaXBoard RT上<b class='flag-5'>运行</b>几乎任何<b class='flag-5'>TensorFlow</b>模型