深度学习之tensorflow——基本使用

陆瑶 陆瑶     2022-09-11     451

关键词:

一、目前主流的深度学习框架Caffe, TensorFlow, MXNet, Torch, Theano比较

库名称

开发语言

速度

灵活性

文档

适合模型

平台

上手难易

Caffe

c++/cuda

一般

全面

CNN

所有系统

中等

TensorFlow

c++/cuda/Python

中等

中等

CNN/RNN

Linux, OSX

MXNet

c++/cuda

全面

CNN

所有系统

中等

Torch

c/lua/cuda

全面

CNN/RNN

linux, OSX

中等

Theano

python/c++/cuda

中等

中等

CNN/RNN

Linux, OSX

二、TensorFlow的编程思想

  TensorFlow 使用graph来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op获得 0 个或多个 Tensor(类型化多维数组) , 执行计算, 产生 0 个或多个 Tensor . 

  一个tensorflow的图描述了计算的过程,图必须在session里被启动,session将图的op分发到cpu或gpu之类的设备上,同时提供执行op的方法,被执行后将产生的tensor返回。python语言中,返回的tensor是numpy对象;c/c++语言中,返回的是tensorflow::Tensor实例。

         计算图的两个阶段:构建阶段和执行阶段。

         构建阶段,op执行步骤被描述成一个图(创建一个图表示和训练神经网络)。执行阶段使用session执行图中的op(反复执行图中的训练op)。

(1)构建图

  第一步是创建源op(source op),不需要任何输入,源op的输出被传递给其他op做运算(python库中,op构造器的返回值代表构造出的op的输出),tensorflow python库中有一个默认图,op构造器可以为其增加节点,这个默认图对许多程序来货已经够用了。

import tensorflow as tf
# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])

# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])

# 创建一个矩阵乘法 matmul op , 把 ‘matrix1‘ 和 ‘matrix2‘ 作为输入.
# 返回值 ‘product‘ 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)
#只是构造,如果要真正进行矩阵相乘,必须在session里启动这个图。

   

函数说明:

  1.tf.constant(value,dtype=None,shape=None,name=’Const’)

  创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list。如果是一个数,那么这个常量中所有值都按该数来赋值。如果是list,那么len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分,则全部存入value的最后一个值。例如:

a = tf.constant(2,shape=[2])
b = tf.constant(2,shape=[2,2])
c = tf.constant([1,2,3],shape=[6])
d = tf.constant([1,2,3],shape=[3,2])
sess = tf.InteractiveSession()
print(sess.run(a))
#[2 2]
print(sess.run(b))
#[[2 2]
# [2 2]]
print(sess.run(c))
#[1 2 3 3 3 3]
print(sess.run(d))
#[[1 2]
# [3 3]
# [3 3]]

   2. tf.matmul()用来做矩阵乘法。若a为l*m的矩阵,b为m*n的矩阵,那么通过tf.matmul(a,b) 结果就会得到一个l*n的矩阵。

不过这个函数还提供了很多额外的功能。我们来看下函数的定义:

  matmul(a, b,

           transpose_a=False, transpose_b=False,

           a_is_sparse=False, b_is_sparse=False,

           name=None):

  可以看到还提供了transpose和is_sparse的选项。如果对应的transpose项为True,例如transpose_a=True,那么a在参与运算之前就会先转置一下。而如果a_is_sparse=True,那么a会被当做稀疏矩阵来参与运算。

(2)在一个会话session中启动图

  第一步是创建一个session对象。

# 启动默认图.
sess = tf.Session()
# 调用 sess 的 ‘run()‘ 方法来执行矩阵乘法 op, 传入 ‘product‘ 作为该方法的参数. 
# 上面提到, ‘product‘ 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取
回矩阵乘法 op 的输出. 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
# 函数调用 ‘run(product)‘ 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
# 返回值 ‘result‘ 是一个 numpy `ndarray` 对象.
result = sess.run(product)
print result
# ==> [[ 12.]]
# 任务完成, 关闭会话.释放资源
sess.close()
	Session 对象在使用完后需要关闭以释放资源. 除了显式调用 close 外, 也可以使用 "with" 代码块 来自动完成关闭动作.
with tf.Session() as sess:
  result = sess.run([product])
print result
如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow 使用这些 GPU, 你必须将 op 明确指派给它们执行. with...Device 语句用来指派特定的 CPU 或 GPU 执行操作:
with tf.Session() as sess:
  with tf.device("/gpu:1"):  #表示机器第二个GPU
    matrix1 = tf.constant([[3., 3.]])
    matrix2 = tf.constant([[2.],[2.]])
    product = tf.matmul(matrix1, matrix2)
    ...

 (3) 交互式使用

  文档中的 Python 示例使用一个会话 Session 来启动图, 并调用 Session.run() 方法执行操作. 为了便于使用诸如 IPython 之类的 Python 交互环境, 可以使用 InteractiveSession 代替 Session 类, 使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run(). 这样可以避免使用一个变量来持有会话.

# 进入一个交互式 TensorFlow 会话.
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])
# 使用初始化器 initializer op 的 run() 方法初始化 ‘x‘ 
x.initializer.run()
# 增加一个减法 sub op, 从 ‘x‘ 减去 ‘a‘. 运行减法 op, 输出结果 
sub = tf.sub(x, a)
print sub.eval()
# ==> [-2. -1.]

 

函数说明:

  1.  tf.Session()与tf.InteractiveSession()的区别?

  tf.InteractiveSession()加载它自身作为默认构建的session,tensor.eval()和operation.run()取决于默认的session. 换句话说:InteractiveSession 输入的代码少,原因就是它允许变量不需要使用session就可以产生结构(运行在没有指定会话对象的情况下运行变量)。

  2.  tf.Variable()

  一个变量通过调用run()方法来维持图的状态,我们通过构造variable类的实例来添加一个变量到图中。Variable()构造器需要一个初始值,可以是任意类型和shape 的Tensor。构造完成之后,变量的type和shape 是固定的。可以使用assign 方法来修改变量的值。

         eg:update = tf.assign(state,new_value)   #意思是state=new_value,而这个操作行为被赋给了update

  如果你想修改变量的shape,你必须使用assign 操作,并且 validate_shpe=False。  

  属性:

  device:这个变量的device

  dtype:变量的元素类型

  graph:存放变量的图

  initial_value:这个变量的初始值

  initializer :这个变量的初始化器

  name:这个变脸的名字

  **op:**The Operation of this variable.

# 创建一个变量, 初始化为标量 0.
state = tf.Variable(0, name="counter")
# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
# 启动图后, 变量必须先经过`初始化` (init) op 初始化,
# 首先必须增加一个`初始化` op 到图中.
init_op = tf.initialize_all_variables()
# 启动图, 运行 op
with tf.Session() as sess:
  # 运行 ‘init‘ op
  sess.run(init_op)
  # 打印 ‘state‘ 的初始值
  print sess.run(state)
  # 运行 op, 更新 ‘state‘, 并打印 ‘state‘
  for _ in range(3):
    sess.run(update)
    print sess.run(state)
# 输出:
# 0
# 1
# 2
# 3

 

  代码中 assign() 操作是图所描绘的表达式的一部分, 正如 add() 操作一样. 所以在调用 run() 执行表达式之前, 它并不会真正执行赋值操作.通常会将一个统计模型中的参数表示为一组变量. 例如, 你可以将一个神经网络的权重作为某个变量存储在一个 tensor 中. 在训练过程中, 通过重复运行训练图, 更新这个 tensor.

  3.  tf.Tensor.eval(feed_dict=None, session=None):

  作用: 在一个Seesion里面“评估”tensor的值(其实就是计算),首先执行之前的所有必要的操作来产生这个计算这个tensor需要的输入,然后通过这些输入产生这个tensor。在激发tensor.eval()这个函数之前,tensor的图必须已经投入到session里面,或者一个默认的session是有效的,或者显式指定session.

  参数:

  feed_dict:一个字典,用来表示tensor被feed的值(联系placeholder一起看)

  session:(可选) 用来计算(evaluate)这个tensor的session.要是没有指定的话,那么就会使用默认的session。

  返回:表示“计算”结果值的numpy ndarray

  4.  Tensor

  TensorFlow 程序使用 tensor 数据结构来代表所有的数据, 计算图中, 操作间传递的数据都是 tensor. 你可以把 TensorFlow tensor 看作是一个 n 维的数组或列表. 一个 tensor 包含一个静态类型 rank, 和一个 shape.

  5.  Fetch

  为了取回操作的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果. 在之前的例子里, 我们只取回了单个节点 state, 但是你也可以取回多个 tensor:

input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session() as sess:
  result = sess.run([mul, intermed])
  print result
# 输出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

 6.  Feed

  TensorFlow 还提供了 feed 机制, 该机制可以临时替代图中的任意操作中的 tensor 可以对图中任何操作提交补丁, 直接插入一个 tensor.feed使用一个tensor值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
# 输出:
# [array([ 14.], dtype=float32)]

 

深度学习之tensorflow安装与初体验(代码片段)

深度学习之TensorFlow安装与初体验学习前搞懂一些关系和概念首先,搞清楚一个关系:深度学习的前身是人工神经网络,深度学习只是人工智能的一种,深层次的神经网络结构就是深度学习的模型,浅层次的神经网络结构是浅度... 查看详情

tensorflow深度学习之十二:基础图像处理之二

Tensorflow深度学习之十二:基础图像处理之二from:https://blog.csdn.net/davincil/article/details/76598474 首先放出原始图像:1、图像的翻转importtensorflowastfimportcv2#这里定义一个tensorflow读取的图片格式转换为opencv读取的图片格式的函数#请... 查看详情

深度学习之tensorflow模型优化和调优实例(代码片段)

近几年深度学习作为一种技术发展迅猛,越来越多的人工智能解决方案将深度学习作为其基本技术,然而构建深度学习模型并不是一件容易的事,为了获得满意的准确性和效率,通常需要数周的时间优化模型。模... 查看详情

分享《深度学习之tensorflow:入门原理与进阶实战》pdf+源代码

下载:https://pan.baidu.com/s/1IAfr-tigqGE_njrfSATT_w《深度学习之TensorFlow:入门、原理与进阶实战》,李金洪著。中文PDF,939页,带书签目录,文字可以复制粘贴。配套源代码。如图: 查看详情

分享《深度学习之tensorflow:入门原理与进阶实战》pdf+源代码

下载:https://pan.baidu.com/s/1zI-pblJ5dEwjGVe-QQP9hQ更多资料:http://blog.51cto.com/3215120《深度学习之TensorFlow:入门、原理与进阶实战》,李金洪著。中文PDF,939页,带书签目录,文字可以复制粘贴。配套源代码。如图: 查看详情

分享《深度学习之tensorflow:入门原理与进阶实战》pdf+源代码

下载:https://pan.baidu.com/s/1zI-pblJ5dEwjGVe-QQP9hQ更多资料:http://blog.51cto.com/3215120《深度学习之TensorFlow:入门、原理与进阶实战》,李金洪著。中文PDF,939页,带书签目录,文字可以复制粘贴。配套源代码。如图: 查看详情

分享《深度学习之tensorflow:入门原理与进阶实战》pdf+源代码

下载:https://pan.baidu.com/s/1zI-pblJ5dEwjGVe-QQP9hQ更多分享资料:https://www.cnblogs.com/javapythonstudy/《深度学习之TensorFlow:入门、原理与进阶实战》,李金洪著。中文PDF,939页,带书签目录,文字可以复制粘贴。配套源代码。如图:  查看详情

深度学习之bert中文分类学习

深度学习之Bert中文分类学习BERT实验预训练结果分析tfhub_handle_preprocess="https://hub.tensorflow.google.cn/tensorflow/bert_zh_preprocess/3"bert_preprocess_model=hub.KerasLayer(tfhub_handle_preprocess)text_test=['我真是个天才啊! 查看详情

深度学习之tensorflow:卷积神经网络

基础概念:  卷积神经网络(CNN):属于人工神经网络的一种,它的权值共享的网络结构显著降低了模型的复杂度,减少了权值的数量。卷积神经网络不像传统的识别算法一样,需要对数据进行特征提取和数据重建,可以直接... 查看详情

深度学习之卷积神经网络cnn及tensorflow代码实现示例

一、CNN的引入在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的28×2828×28... 查看详情

深度学习之tensorflow模型优化和调优实例(代码片段)

...08;基于paper或者基于直觉等均可)构建神经网络(TensorFlow,Keras等均可以&# 查看详情

深度学习之基于tensorflow2.0实现vgg16网络(代码片段)

...有了提升,VGG16与VGG19是VGG系列的代表,本次基于Tensorflow2.0实现VGG16网络。1.VGG16网络简介VGG16网络模型在2014年ImageNet比赛上脱颖而出,取得了在分类任务上排名第二,在定位任务上排名第一的好成绩。VGG16网络相比... 查看详情

深度学习之tensorflow框架(上)(代码片段)

1importtensorflowastf2importos3os.environ[‘TF_CPP_MIN_LOG_LEVEL‘]=‘2‘4deftensorflow_demo():56#原生python加法运算7a=2;8b=3;9c=a+b;10print("普通加法运算的结果:",c);11#tensorflow实现加法运算12a_t=tf.constant(2)13b_t=tf.constant(3)14c_t=a_t+b_t15print("tensorflow的加法运... 查看详情

深度学习之tensorflow框架(下)(代码片段)

1deftensor_demo():2"""3张量的演示4:return:5"""6tensor1=tf.constant(4.0)7tensor2=tf.constant([1,2,3,4])8linear_squares=tf.constant([[4],[9],[16],[25]],dtype=tf.int32)9print("tensor1:",tensor1)10print("tensor2:",tensor2)11print("linear_squares:",linear_squares)1213#生成常用张量14tensor3=tf.... 查看详情

深度学习之图像修复

图像修复问题就是还原图像中缺失的部分。基于图像中已有信息,去还原图像中的缺失部分。从直观上看,这个问题能否解决是看情况的,还原的关键在于剩余信息的使用,剩余信息中如果存在有缺失部分信息的patch,那么剩下... 查看详情

深度学习之tensorflow框架(中)(代码片段)

...用于完整的程序中tf.InteractiveSession用于交互式上下文中的tensorflow查看张量的值都必须在会话里面c_new_value=new_sess.run(c_new)print("c_new_value:",c_new_value)print("a_new_value:",a_new.eval())1defsession_demo():2"""3会话的演示4:return:5"""6a_t=tf.constant(2,name... 查看详情

人工智能深度学习入门练习之(10)tensorflow–介绍

TensorFlow是一个开源的深度学习框架,由谷歌团队开发。TensorFlow使用方便,开发人员可以用来开发各种人工智能应用。TensorFlow的官方网站:www.tensorflow.orgTensorFlow的主要特性:以张量(一种多维数组)为基础,轻松定义、计算数学算... 查看详情

深度学习之batch归一化

前言       以下内容是个人学习之后的感悟,转载请注明出处~  Batch归一化  在神经网络中,我们常常会遇到梯度消失的情况,比如下图中的sigmod激活函数,当离零点很远时,梯度基本为0。为... 查看详情