TensorFlow基础学习

一、基本概念

除了PyTorch外另一个非常广泛的深度学习框架。

  1. Tensor:张量+Flow:流,采用数据流图进行数字计算的开源软件库。
  2. 基本原理是基于图运算,可以将一个计算图划分为多个子图,然后在多个CPU或者GPU上并行执行。此外TensorFlow还支持分布式计算,可以在合理的时间内在数百台服务器上进行分割计算,在大训练集上训练巨大的神经网络。
  3. 特点:高度的灵活性;真正的可移植性;多语言支持;丰富的算法库;自动求微分;完善的文档;大量的开源项目;将科研产品联系在一起;最优化性能。

二、安装

  1. 为了快速及不宜报的错(下载太慢会报错“Downloaded bytes did not match Content-Length”),建议设置额外的源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro/
  1. 首先在Anaconda中新建虚拟环境,注意tensorflow2.0.0仅支持python3.6或3.7:
conda create --name tensorflow_gpu python=3.7
  1. 进入虚拟环境后安装tensorflow:
conda install tensorflow-gpu=2.0.0
#会自动安装匹配版本的CUDA和CUDNN
  1. 安装其他工具:
conda install jupyter
  1. 进入jupyter notebook,进行验证:
import tensorflow as tf
tf.__version__
#输出对应的版本号说明安装成功

三、张量

  1. 张量的创建:我们可以创建自己的张量,也可以从python库numpy中继承。
import tensorflow as tf
import numpy as np
x=tf.constant(np.random.rand(32).astype(np.float32))
y=tf.constant([1,4,7])
#x,y会自动称为图上的节点

​ numpy数组与TensorFlow是可以相互操作的,通常调用eval()函数会返回numpy对象,等价于Session.run(tensor_to_eval)。
​ tf.convert_to_tensor:该方法将Python对象转化为tensor对象,输入可以是tensor对象、numpy数组、Python列表、Pytho标量。
2. 张量的数学运算:略。
3. 操作:在图中描述计算顺序,图中的节点就是操作,比如一次加法、一次乘法、构建一些变量的初始值都是操作。
​ 1. 每个运算操作都有属性,它在构建图的时候就需要确定下来,操作可以和计算设备绑定,可以指定操作在某个设备上执行。
​ 2. 操作之间有顺序关系,有的操作在其它操作执行完成后才能执行,这些操作之间的依赖就是“边”。这些操作之间的顺序关系的定义很简单,在代码编程上表现出来的就是一个操作的输入时另一个操作执行的结果,那么就称第一个操作依赖第二个操作。

四、数据流图

​ TensorFlow通过一个叫数据流图的方式来组织它的数据和运算。在使用TensorFlow实现深度学习算法时,先将所有操作表达成一张图。张量从算法的开始走向结束完成一次向前计算,而残差从后向前就完成一次向后的传播来更新要训练的参数。

  1. 首先要了解“动态计算图”和“静态计算图”的含义:支持动态计算图的叫动态框架,支持静态动态图的叫静态框架,也有二者都支持的框架。
    1. 静态框架中使用的是静态声明策略,计算图的声明和执行是分开的。先定义计算执行顺序和内存空间分配策略,然后执行过程按照规定的计算执行顺序和当前需求进行计算,数据就在这张实体计算图中计算和传递。常见的有:TensorFlow、MXNet、Theano。
      好处:执行前就已经知道了所有需要的操作,可以对图中各节点的计算顺序和内存分配进行合理规划,而动态框架在每次规划、分配内存的时候只能看到局部需求,并不能做出全局最优的规划和内存分配。
    2. 动态框架中使用的是动态声明策略,生命和执行是一起进行的。虚拟计算图和实体计算图的构建就是同步进行的了。可以根据实时需求构建对应的计算图,更加灵活。常见的有:Torch、DyNet、Chainer。
  2. TensorFlow程序分为两个阶段:一是图的构建阶段(定义了程序有哪些操作,操作的顺序是什么);二是图的执行阶段(只有在构建阶段结束了才能开始执行阶段,并且图的执行阶段必须要在会话中完成)。
  3. 在定义阶段,tensorflow会自动将定义的计算转化成计算图上的节点。在tensorflow程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。通过a.graph可以查看张量a所属的计算图(没有特意指定时计算图等于当前默认计算图)。
  4. 除了使用默认计算图,tensorflow还支持通过tf.Graph函数来生成新的计算图,不同计算图上的张量和运算不会共享,并且计算图还提供了管理张量和计算的机制。计算图可以通过tf.Graph.device函数来指定运行计算的设备,这位tensorflow使用GPU提供了机制。
g=tf.Graph()
#指定计算运行的设备
with g.device('/gpu:0'):
	result = a + b
  1. 在一个计算图中,可以通过集合来管理不同类别的资源。例如:可以通过tf.add_to_collection函数将资源加入一个或多个集合中,然后通过tf.get_collection获取一个集合中的所有资源。为了方便使用tensorflow自动管理了一些最常用的资源。

五、会话

  1. 客户端程序通过创建会话(Session)与TensorFlow系统交互。Session对象是运行环境的表示。Session对象开始为空,当程序员创建不同的操作和张量时,他们被自动添加到Session,直到Run方法被调用才开始运算。
  2. Run方法的输入是需要计算的操作以及一组可选的张量,用来代替途中某些节点的输出。如果我们调用这个方法,并且有命名操作所依赖的操作,Session对象将执行所有这些操作,然后继续执行命名操作。
  3. 创建会话:
a = tf.Session()
  1. 在会话中执行计算:
#计算1+1的代码
#导入tensorflow,tensorflow开始管理很多状态,此外还会初始化一个默认的图,这个默认图存在#_default_graph_stack中,但我们需要通过tf.get_default_graph()来得到
import tensorflow as tf
#构建图,定义两个常数和加法操作,一共三个操作,默认情况下会被自动添加到默认图中
v1 = tf.constant(1, name = "value1")
#print(v1)   #输出会格式而没有实际数值,说明没有执行实际的赋值
#没有调用Run方法,并没有实际的计算操作,所有和tensorflow相关的计算都必须在会话中完成
v2 = tf.constant(1, name = "value2")
add_op = tf.add(v1, v2, name = "add_op_name")
#在会话中执行操作
with tf.Session() as sess:
	result = sess,run(add_op)
	
#可以通过graph.get_operations()来得到图中所有的运算操作
graph = tf.get_default_graph()
operations = graph.get_operations()
print("number of operations: % d" % len(operations))
print("operations:")
for op in opertions:
	print(op)
#也可以借助tensorboard可视化这些运算操作以及运算操作之间的依赖

#构建会话,并在会话中执行操作
#用with语句包装,可以在结束with语句块的时候,自动销毁会话的资源。
with tf.Session() as sess:
	#sess.run中运行的所有操作都是在tensorflow内部(因为可以在gpu上运行,效率更高)进行的计算,	#计算完成后从tensorflow内部赋值给python的result变量。
	result = sess.run(add_op)
	print("1+1=%.0f" % result)
	#将图的结构保存,后面可以通过tensorboard查看
	summary_witer = tf.summary.FileWriter('./calc_graph')
	graph = tf.get_default_graph()
	summary_writer.add_graph(graph)
	summary_writer.flush()
  1. 会话中计算的依赖:
    1. 为了优化计算,会话中执行图的运算时,并不一定要把整个图都计算一遍,tensorflow会自动根据当前要执行的操作,只计算这个操作所依赖的操作,其他不依赖的操作不会执行。
    2. 例如:
      import tensorflow as tf
      #定义变量x
      x = tf.Variable(0.0, name = "x")
      #定义x+1的操作,因为是操作所以会执行一次
      x_plus_1 = tf.assign_add(x, 1, name="x_plus")
      #下面这条with语句说明语句中的操作依赖于参数中指定的操作
      with tf.control_dependencies([x_plus_1]):
      	y=x
      	#初始化所有变量的操作
      	init = tf.global_variables_initializer()
      	with tf.Session() as sess:
      		sess.run(init)
      		for i in range(5):
      			print(y.eval())
      			
      #本例中y = x并没有新建一个操作出来,因此y的操作就是x的操作,最终只是把x重复执行了5次,
      #而x_plus_1没有任何依赖它的操作,实际上不会执行,因此五次输出y都为1.0
      
      #而如果将y = x 改为y = tf.identity(x, name="y")这是一个操作,作用是返回一个和x具有
      #相同的值、相同形状的tensor
      #因为是一个操作,而且由于with语句,y依赖于x_plus_1,x_plus_1又依赖于x,因此得到的输
      #出应该为:2.0,3.0,4.0,5.0,6.0
      

六、线性回归的TensorFlow实现

七、TensorFlow可视化

一、playground

  1. playground:一个用于教学的简单神经网络在线演示、实验的图形化平台,可视化了神经网络的训练过程。(http://playground.tensorflow.org/)
  2. 数据:在二维平面内被标记为两种颜色,深色代表正值,浅色代表负值,两种颜色表示想要区分的两类,并且提供了四种不同形状的数据,可以调整噪声大小,还可以改变训练数据和测试数据的比例。
  3. 特征:每个点都有x1,x2两个特征,由这两个特征还可以衍生出许多其他特征:x1^2。我们学习的分类器就是要结合上述的一种或多种特征,绘制一条或多条线,把原始的两种数据分开。
  4. 隐藏层:可以设置隐藏层的多少以及每个隐藏层的神经元数量。隐藏层之间的连线表示权重,神色表示用神经元的原始输出,浅色表示用神经元的负输出,可以查看具体值。
  5. 输出:输出的目的是使深浅颜色的点回归同色的背景。
  6. 有了神经网络,系统就会自己学习到哪些特征是有效的,那些是无效的,通过自己学习的这些特征,就可以做到自己分类。

二、tensorboard

  1. 是tensorflow自带的一个强大的可视化工具,也是一个web应用程序套件,运行一个本地服务器,来监听6006端口,在浏览器发出请求时,分析训练时记录的数据,绘制训练过程中的图像。目前支持七种可视化。SCALARS、IMAGES、AUDIO、GRAPHS、DISTRIBUTIONS、HISTOGRAMS、EMBEDDINGS。
  2. 通过一些操作把数据记录到文件中,读取文件完成作图。步骤如下:
    1. (1)summary:在定义计算图的时候,在适当的位置加上一些summary操作。
      (2)merge:在训练的时候可能加了多个summary操作,需要使用tf.summary.merge_all将这些summary操作合成一个操作,由它来产生所有的summary数据。
      (3)run:在没有运行的时候这些操作是不会执行任何东西的,仅仅是定义了一下,在运行(开始训练)的时候,我们需要通过tf.summary.FileWrite()指定一个目录告诉程序把产生的文件放到哪,然后在运行的时候使用 add_summary() 来将某一步的 summary 数据记录到文件中。
      ​ 2. 首先训练模型,训练完成后,启动tensorboard,需要执行:
    tensorboard --logdir=path/to/log-directory
    #注意path/to/log-directory应是你指定的目录
    
    1. 需要按照提示在浏览器打开页面。

你可能感兴趣的:(深度学习,python,tensorflow,深度学习,pytorch)