TensorFlow笔记(一) tf基础知识


最近在看的一本书,蒋子阳《TensorFlow深度学习算法原理与编程实战》的学习笔记(一)

TensorFlow 基础

tf以计算图为基础,整个计算过程包括 ① 构建图 ②执行图

TensorFlow首先创建一个骨架图,里面包含所有组件,此时没有数据和计算的产生,只有当会话执行时,数据进入图中进行流动,才有实际的结果产生。

tf的三个模型:

计算图 – 计算模型

图:是相互连接的实体的集合,通常称为节点node,节点通过边edge连接

TensorFlow中的图的每一个节点表示一个操作,并可应用在某个输入或生成传递给其他节点的输出

依赖关系:一个节点的输入取值于另一个节点的输出,那么这两个节点具有依赖关系。存在依赖关系的节点通过边相互连接。

张量(tensor)就是在边中流动(flow)的数据,这也是TensorFlow名称的由来。此外,存在一种不流动数据的边,它们起着依赖控制(control dependencies)作用,让起始节点执行完后才执行下一个目标节点,但中间没有数据传输。

创建图

eg.定义一个简单的graph。 a b相乘得到c, d等于c的正弦,e等于b d的商

import tensorflow as tf
a = tf.constant(5,tf.float32)  # 定义常量
b = tf.constant(10,tf.float32)
print(b) # Tensor("Const_1:0", shape=(), dtype=float32) 名称为const_1:0的tensor对象,类型是float32
c = b*a  # c = tf.mul(a,b)    c定义了这个乘法操作
d = tf.sin(c)
e = b / d

with tf.Session() as sess: # 使用with语句打开会话可以保证计算完成后将会话自动关闭,否则使用sess.close()操作
    fetches = [a,b,c,d,e]
    out1 = sess.run(fetches) # sess.run可以同时计算多个节点列表 sess.run参数称为fetches(提取),将节点传入参数,用来计算该节点的值
    # TensorFlow仅利用依赖关系的集合来计算节点 例如,e依赖 b和d,则通过b d计算e
    outs = sess.run(e)
print(out1,type(out1),out1[0])

在这里插入图片描述

tf的计算图

导入tf的时候,会自动生成一个空白图,后续的操作都与该默认图关联。

可以通过tf.Graph()创建一个新的空白图,并可以自定义操作与它关联。任何一个节点都可以通过graph属性查看是否属于某个图

import tensorflow as tf
print(tf.get_default_graph()) #默认空白图
g = tf.Graph()
print(g)
a = tf.constant(5)
print(a.graph is tf.get_default_graph()) # 结果是true
print(a.graph is g) #结果是false

多个计算图的管理

with语句可以用于上下文管理,它设置了enter块和exit块,因此可以用它管理某个计算图,使用with语句和as_default()返回上下文管理器,指定某个计算图成为该部分的默认图,同时在该部分定义的计算关联与该图

g1 = tf.get_default_graph()
g2 = tf.Graph()
print(g1 is tf.get_default_graph())  # True

with g2.as_default():
    print(g1 is tf.get_default_graph()) # False

print(g1 is tf.get_default_graph())  # true

张量 – 数据模型

张量tensor类似于数组array,但是张量只保存了运算结果的属性,而没有保存它的具体数值。

import tensorflow as tf
a = tf.constant([1.0, 2.0],name = 'a' , dytpe= tf.float32)  # 定义常量
print(a) # Tensor(""Const_1:0", shape=(2,), dtype=float32")

每一个张量都具有操作op、维度shape和数据类型dtype三种属性。

操作op

op是一个张量的名字,也算它的唯一标识符。计算图的每个节点都是一个运算,张量保存的是运算的属性,命名规则是“ node:src_output”。node是节点名称,如const、add、mul等,src_output表示该张量是节点的第几个输出,从0开始编号。

维度shape

类似array的维度,一维标量scalar、二维向量vector…直至n维数组

数据类型dtype

tf支持十四种类型 int8/16/32/64 、uint8、float32/64、布尔bool、复数complex64/128、字符串string和qint8/32、quint8

会话 – 运行模型

完成数据和计算图的定义后需要使用会话session执行。

两种开启会话的方式:with语句更方便,自动关闭。

sess = tf.Session() # 开启
sess.run() # 执行
sess.close() # 关闭
with tf.Session() as sess:
    sess.run()

placeholder与变量Variable

tf.constant定义的是计算图中的常量,可以通过placeholder和变量来定义可变数据。

palceholder机制

placeholder相当于在计算图中指定了一个位置,数据在程序运行时才给出。placeholder机制用于解决数据量过大的问题,可以将数据分批次传入节点,在编程时只需要传入holder位置即可,这样在有限的节点高效传入大量的数据。

函数原型 placeholder(dtype, shape=None, name=None)

a = tf.placeholder(tf.float32,shape=(None,2),name = "input")
b = tf.placeholder(tf.float32,shape=(None,2),name = "input")
ans =a + b
with tf.Session() as sess:
    sess.run(ans, feed_dict={a:[1.0,2.0],
                             b:[2.0,3.0]})
print(ans)

定义placeholder时,数据类型dtype必须给出且不可改变,shape若是给出时不确定可以用None,不给出的时候程序自动推断。

运行时通过sess.run的feed_dict参数传入holder的取值,它是一个字典数据,传入时的数据类型必须与placeholder定义时的类型一致,否则会报错。

TensorFlow的变量

变量的作用是保存网络中的参数,对参数的更新就是对相应变量值的更新,使用Variable()声明变量,同时需要提供初始值。通常是采用随机分布赋初值。tf提供了正态分布、平均分布、伽马分布等多种类型。

此外变量的初值还可以是常量、其他变量的初值计算而来。z

# 声明一个变量并随机赋值,返回大小3×4 均值0 标准差1 满足正态分布的随机矩阵
weights = tf.Variable(tf.random_normal([3,4], stddev=1))

几种随机分布和常量初始化

函数名功能函数名功能
random_normal正态分布zeros全0数组
truncate_normal正态分布ones全1数组
random_uniform平均分布fill全为给定值的数组
random_gamma伽马分布constant给定值的常量

获取一个变量的值通过initialized_value()方法

bias = tf.Variable(tf.zeros([3])) #全为1的一维数组,长度3
b1 = tf.Variable(bias.initialized_value()*3) # 使用bias的值乘3初始化bl

批量初始化:

tf.global_variables_initializer() # 初始化全部变量
tf.initialize_all_variables() # 较早版本tf的写法,1.12中仍存在,和上面的方法功能一样

变量和张量

变量在TensorFlow中是一个运算,对应tensorboard里面计算图的一个节点,这个运算的输出结果就是一个具有name、shape和type属性的张量。

变量在构建后数据类型就不能更改,但shape可以发生变化,需要设置validate_shape=False

tf.assign(w1,w2,validate_shape=False) # 将w2赋给w1,若是shape不一致,仍旧可以进行赋值

变量空间

除了Variable()外,可以通过get_variable()创建或者获取变量,该函数的使用类似Variable,但有所不同。name参数此时必须指明,同时通过initializer参数指明初始化方法。

a = tf.get_variable(name= "a", shape=[1],initializer=tf.constant_initializer(1.0))

initializer参数的取值也包括常量和随机分布等初始化方法。

初始化函数初始化为指定常量
constant_initializer正态分布初始化
random_normal_initializer正态分布初始化
truncate_uniform_initializer平均分布初始化
random_uint_scaling_initialize平均分布但不影响输出数量级
random_gamma_initialize伽马分布
zeros_initialize全零初始化
ones_initialize全1初始化

variable_scope() 与name_scope(): 在变量空间使用get_variable获取已经创建过的变量

可以通过variable_scope指定一个变量空间,在该空间定义两个name相同的变量会报错。

with tf.variable_scope("one"):
    a1 = tf.get_variable("a",[1],initializer=tf.constant_initializer(1.0))
    
with tf.variable_scope("one"): #报错 因为one空间已经存在一个name=a的变量,错误信息提示是否将reuse设置True
    a2 = tf.get_variable("a",[1])    
with tf.variable_scope("one",reuse=True):# 不报错,因为reuse=True,可以重复使用,get_variable将获取one空间的name=a的变量赋值给a2
    a3 = tf.get_variable("a",[1])
    print(a1.name,a3.name) # 输出是 one/a:0 one/a:0 变量空间内的变量name通常会带上空间名字作为前缀
with tf.variable_scope("two",reuse=True): # 报错,尽管reuse=True,但这是在变量空间two,函数只能在该对应空间选择定义过的变量,two空间没有name为a的变量
    a4 = tf.get_variable("a",[1])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop是一个开源的分布式计算框架,可用于大数据的存储和处理。它采用了分布式文件系统(HDFS)和分布式计算框架(MapReduce),能够将大数据分割成小的数据块,并在集群中的多台计算机上并行处理这些数据块。 HDFS是Hadoop的分布式文件系统,它将大文件切分为多个数据块,并将这些数据块存储在集群中的多个计算机上。HDFS使用主从架构,其中NameNode负责管理文件系统的元数据,而多个DataNode负责实际存储数据。HDFS具有高容错性,能够自动复制数据块以保证数据的可靠性。 MapReduce是Hadoop的分布式计算框架,它通过将计算任务划分为多个Map和Reduce阶段来进行并行计算。Map阶段将输入数据切分为多个独立的小任务,并在集群中的多个计算机上并行执行。Reduce阶段将Map阶段的输出合并并进行聚合计算。MapReduce具有自动并行化、容错性和可扩展性等优点,能够高效地处理大规模数据集。 在学习Hadoop时,首先要了解Hadoop的核心组件,包括HDFS和MapReduce。然后,需要学习Hadoop的架构和工作原理,理解Hadoop如何实现分布式存储和计算。接下来,需要学习Hadoop的安装和配置,包括在单机和集群环境下的安装和配置过程。此外,还需要学习Hadoop的命令行工具和管理工具,以及Hadoop的API和编程模型。 在实际使用Hadoop时,需要掌握Hadoop的常用操作和管理技巧,如如何上传和下载文件、如何执行MapReduce作业、如何监控和管理Hadoop集群等。同时,需要学习Hadoop的优化技术和调优方法,以提高Hadoop集群的性能和效率。 总之,对于Hadoop的学习,除了理解其基础知识和工作原理外,还需要熟悉其常用操作和管理技巧,以及灵活运用Hadoop来解决实际的大数据问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值