tensorflow1.14入门函数整理(未完成,不定期更新中)

关于shape的理解
 
[[3,2]]一行两列
[[3],[2]]两行一列
[2.0,3.0]的shape=(2,)说明了这个张量是一个一维数组,这个数组的长度是2。
shape参数的个数应为维度数,每一个参数的值代表该维度上的长度
shape=(100,784) 代表该张量有两个维度,第一个维度长度为100,第二个维度长度为784,二维数组100行784列 
shape=(2,) 代表该张量有一个维度,第一个维度长度为2,一维数组1行2列
# 例:
    [[[1,2,3],[4,5,6]]]
# 第一个维度中只有一个元素[[1,2,3][4,5,6]],所以第一个维度长度为1
# 第二个维度中有两个元素[1,2,3][4,5,6],所以第二个维度长度为2
# 第三个维度中有三个元素“1,2,3”或“4,5,6”,所以第三个维度长度为3
# 那么它的shape参数就是(1,2,3)
 

 
函数使用
  • tf.get_default_graph()获取当前默认的计算图
例:a=tf.constant([1.0,2.0],name="a")
print(a.graph is tf.get_default_graph())
#输出ture
 
  • 会话:
tf.Session():创建一个会话
tf.InteractiveSession(): 创建一个默认会话
tf.Session().as_default():创建一个默认会话
例1:
result=a+a
sess= tf.Session()#把sess设置为会话,同时开启会话
print(sess.run(result))#在sess会话中计算result
#可以通过tf.Tensor.eval函数来计算一个张量的取值
#等价于print(result.eval(session=sess))#相当于把result加入sess会话中计算
sess.close()#关闭会话
 
例2:(默认会话)
result=a+a
sess=tf.InteractiveSession()#把sess设置为默认会话,同时开启会话
print(result.eval())#默认会话可以省略对函数eval()中session参数的赋值
sess.close()#关闭会话
 
例3:(默认会话)
sess=tf.Session()
with sess.as_default():
    print(result.eval())
 
例4:
with tf.Session() as sess:
    print(sess.run(result))
 
例5:(默认会话)
with tf.Session() as  sess:
    print(result.eval())
 
  • 常量constant变量Variable
常量:(像是一种赋值)
初始化函数
功能
主要参数
tf.constant_initializer
将变量初始化为给定常量
常量的取值
tf.random_normal_initializer
将变量初始化为满足正态分布的随机值
正态分布的均值和标准差
tf.truncated_uniform_initialize r
将变量初始化为满足正态分布的 随机值,但如果随机出的值偏离平均值超过2个标准差,那么这个数将会被重新随机
正态分布的均值和标准差
tf.random_uniform_initializer
将变量初始化为满足平均分布的随机值
最大、最小值,
tf.uniform_unit_scaling_initializer
将变量初始化为满足平均分布但不影响输出数量级的随机值
factor(产生随机值时乘以的系数)
tf.zeros_initializer
将变量设置为全0
变量维度
tf.ones_initializer
将变量设置为全1
变量维度
 
a=tf.constant([1.0,2.0],name="a")
a=tf.random_normal([2,3],stddev=2,seed=1)#正态分布随机常量,均值为0,标准差为2
w2=tf.random_uniform((3,1),minval=low, maxval=high, dtype=tf.float32)#返回 6*6 的矩阵,产生于 low 和 high 之间,产生的值是均匀分布的。
b=tf.zeros([2,3],tf.float32)#产生全0的数组
c=tf.fill([2,3],9)#产生全为给定数字的数组
变量:(本质是一个运算)
w=tf.Variable(一个常量)
w2=tf.Variable(w.initialized_value()*2)#用其他变量的初始值初始化新的变量,w.initialized_value()获得变量初始值
 
    
  • 常量变量运算
例1:tf.matmul(x,y)#矩阵乘法,张量x乘张量y
w1=tf.Variable(tf.random_normal((2,3),stddev=1))
w2=tf.Variable(tf.random_uniform((3,1),minval=-0.5, maxval=0.6, dtype=tf.float32))
x=tf.constant([[0.7,0.9]])
 
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)
 
sess=tf.Session()
sess.run(w1.initializer)#在会话中初始化w1
sess.run(w2.initializer)#初始化w2
print(sess.run(y))
sess.close()
 
例2:*运算符
v1=tf.constant([[1.0,2.0],[3.0,4.0]])
v2=tf.constant([[5.0,6.0],[7.0,8.8]])
 
with tf.Session() as sess:
    v=v1*v2
    print(v.eval())
 
例3:初始化方法二:所有变量初始化函数
init_op=tf.global_variables_initializer()
sess.run(init_op)
 
例4:a=tf.sigmoid(a)把张量a中所有数值转换为0~1之间的数值
相当于函数y=1/(1+exp(-x))
a=tf.random_normal((2,3),stddev=1,seed=1)
with tf.Session() as  sess:
    print(a.eval())
    a=tf.sigmoid(a)
    print(a.eval())
 
例5:tf.log() 计算张量 x 的自然对数
 
 
例6:tf.clip_by_value(1-y,1e-10,1.0)
功能:可以将一个张量中的数值限制在一个范围之内。(可以避免一些运算错误:可以保证在进行log运算时,不会出现log0这样的错误或者大于1的概率)
参数:(1)1-y:input数据(2)1e-10、1.0是对数据的限制。
当1-y小于1e-10时,输出1e-10;
当1-y大于1e-10小于1.0时,输出原值;
当1-y大于1.0时,输出1.0;
 
 
例7:tf.reduce_mean() 计算张量的各个维度上的元素的平均值(会四舍五入取整
 
例8:tf.reduce_sum(input_tensor,axis=None,keep_dims=False,name=None)
 
tensor 求和的工具。其参数中:
1. input_tensor 是要求和的 tensor;
2. axis 是要求和的 列或行,没有写出来,则默认所有维度都要求和,即所有维度的值相加;
3. keep_dims 求和后是否保持维度,不然就降维;
4. 这个操作在 graph 中可能会用到。
 
 
例9:tf.greater(V1,V2)逐个比较张量中各元素的大小,V1>V2返回True,V1<=V2返回False
v1 = tf.constant([1.0,2.0,3.0,4.0])
v2 = tf.constant([4.0,3.0,2.0,1.0])
with tf.Session() as sess :
    v=tf.greater(v1,v2)
    print(v.eval())
 
例10:tf.where(bool,v1,v2)根据bool的值决定选择V1,V2中的哪一个(逐个查找bool中的值,如果为False,选择V2,如果为True,选择V1)
v1 = tf.constant([1.0,2.0,3.0,4.0])
v2 = tf.constant([4.0,3.0,2.0,1.0])
with tf.Session() as sess :
    v=tf.greater(v1,v2)
    print(tf.where(v,v1,v2).eval())
 
例11: tf.square()是对a里的每一个元素求平方
a=tf.constant([1,2,3,4])
b=tf.square(a)
with tf.Session() as sess:
    print(sess.run(a))
    print(sess.run(b))
 
 
  • 占位符tf.placeholder()
例1:sess.run()函数中feed_dict参数的作用是替换图中的某个tensor的值。
    
 
例2:placeholder维度不一定需要定义,需要靠sess.run()函数中的feed_dict参数赋值
    
 
例3:如果维度是确定的,给出维度可以降低出错的概率
    
  • 激活函数
例1:tf.nn.relu()
a=tf.random_normal([2,3])
b=tf.nn.relu(a)
with tf.Session() as sess:
    print("张量a为:")
    print(sess.run(a))
    print("张量b为:")
    print(sess.run(b))
 
例2:tf.sigmoid()
a=tf.constant([[2.0,5.0],[-7.0,-2.0],[0.3,-0.1]])
b=tf.sigmoid(a)
with tf.Session() as sess:
    print("张量a为:")
    print(sess.run(a))
    print("张量b为:")
    print(sess.run(b))
 
例3:tf.tanh()
a=tf.constant([[2.0,5.0],[-7.0,-2.0],[0.3,-0.1]])
b=tf.tanh(a)
with tf.Session() as sess:
    print("张量a为:")
    print(sess.run(a))
    print("张量b为:")
    print(sess.run(b))
 
  • 损失函数
 
例1: 交叉熵损失函数
        
y = tf.sigmoid(y)
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))
+ (1 - y_) * tf.log(tf.clip_by_value(1 - y, 1e-10, 1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
 
或者tensorflow自带的交叉熵:(y_是标准答案,y代表了原始神经网络的输出答案)
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_ , logits=y )//把softmax回归和交叉熵功能进行统一
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_ , logits=y )//只有一个正确答案的分类问题,用该函数来加速计算
 
例2:均方误差损失函数(其中y_代表了标准答案,y代表了神经网络的输出答案)
mse = tf.reduce_mean ( tf.square ( y_ - y ) )
 
例3:自定义,yi为正确答案(实际值),yi'为神经网络得到的预测值(见课本P79)
a=10
b=1
#v1为实际值,v2为预测值
loss = tf.reduce_sum(tf.where( tf.greater(v1, v2) , (v1 - v2)*a , (v2 - v1)*b ))
 
 
  • 优化器模块 optimizer
optimizer调用 minimizer() 函数包含两步:
(1)、计算梯度
(2)、将梯度应用到参数更新中
也就是说,如果你将两步分离,比如想获取所有 trainable_variables 的梯度时,可以进行如下操作:
(1)、 optimizer.compute_gradients ()计算梯度
(2)、对梯度进行搞事情
(3)、optimizer.apply_gradients()进行参数更新
该模块定义了一个训练模型的operator的API。一般来说不会直接用到这个API,它更像是一个父类, 各种基于不同类型优化算法的optimizer都继承自这里,如: GradientDescentOptimizer ,  AdagradOptimizer ,  MomentumOptimizer
例1:tf.train.AdamOptimizer()函数是Adam优化算法:是一个寻找全局最优点的优化算法,引入了二次方梯度校正。返回一个优化器对象 optimizer
optimizer调用 minimizer() 函数(即调用最小化函数):
格式:tf.train.AdamOptimizer(学习率).minimize(损失函数)
 
train_step=tf.train.AdamOptimizer(0.001).minimize(loss)
 
执行train_step(执行训练步骤,即开始训练神经网络参数):
 
with tf.Session() as sess:
    sess.run(train_step)
  • 学习率设置——指数衰减法
例:tf.train.exponential()指数衰减算法函数
 
global_step= tf.Variable(0)
#生成能衰减的学习率,初始值为0.1,因为指定了staircase=True(默认为False),所以每训练100轮后学习率要乘以0.96
learning_rate = tf.train.exponential_decay(0.1, global_step, 100, 0.96, staircase=True)
learning_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)#梯度下降优化器
 
注释:global_step在滑动平均、优化器、指数衰减学习率等方面都有用到,这个变量的实际意义非常好理解:代表全局步数,比如在多少步该进行什么操作,现在神经网络训练到多少轮等等,类似于一个钟表
根据代码可以发现global_step的初始化值是0:
 
global_step=tf.Variable(0, trainable=False)
 
因为指数衰减的学习率是伴随global_step的变化而衰减的,所以当global_step不改变时,学习率也变成一个定值。
损失函数优化器的minimize()中global_step=global_steps能够提供global_step自动加一的操作。
这里有个额外的疑虑说明:global_steps是等号右边,在编程语言里面通常当作定值(即不会受函数影响)赋值给等号左边的global_step。然而,在这个优化器里面能够使得右边的变量自动加
 
  • 生成正则化函数(见课本P89)
tensorflow提供了tf.contrib.layers.l2_regularizer(lambda)函数,它可以 返回一个函数,这个函数可以计算一个给定的参数的L2正则化项的值。
类似的,tf.contrib.layers.l1_regularizer(lambda)所返回的函数可以计算L1正则化项的值
lambda为正则化项的权重
L1正则化
L2正则化
weights = tf.constant([[1.0, -2.0], [-3.0, 4.0]])
with tf.Session() as sess:
    #a=(|1|+|-2|+|-3|+|4|)*0.5=5.0
    a=tf.contrib.layers.l1_regularizer(0.5)(weights)
    #b=(1^2+(-2)^2+(-3)^2+4^2)*0.5=7.5
    b=tf.contrib.layers.l2_regularizer(0.5)(weights)
    print(sess.run(a))
    print(sess.run(b))
 
  • 命名空间
 
 
 
  • 计算图
系统会默认维护一个默认的计算图,通过tf.get_default_graph()函数可以获得当前默认 的计算图。
例1:a.graph与tf.get_default_graph()
 
a= tf.constant([1.0])
#通过a.graph可以查看张量所属的计算图。没特意指定的时候张量所在计算图应该等于默认的计算图
print(a.graph is tf.get_default_graph())
#输出为True
不同计算图上的张量和运算都不会共享
例2:可以通过tf.Graph()函数来生成新的计算图。 表示实例化了一个类,一个用于 tensorflow 计算和表示用的数据流图
tf.Graph() .as_default() 表示将这个类实例,也就是新生成的图作为整个 tensorflow 运行环境的默认图
tf.variable_scope("",reuse=True)
tf.get_variable("v")
tf.Graph().device('/gpu:0')指定运行计算的设备
 
#新建计算图g1
g1=tf.Graph()
#在计算图g1中定义v
with g1.as_default():
    v = tf.get_variable("v", shape=[1],initializer=tf.zeros_initializer()) # 设置初始值为0
#在计算图g1中读取变量“v”
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("",reuse=True):
        print(sess.run(tf.get_variable("v")))
#默认计算图中定义常量a
a=tf.constant([1.2,2.3], name="a")
#判断
print(a.graph is tf.get_default_graph())
with tf.Session() as sess:
    print(sess.run(a))
#新建计算图g2
g2 = tf.Graph()
#在计算图g2中定义v
with g2.as_default():
    v = tf.get_variable("v", [1], initializer = tf.ones_initializer())  # 设置初始值为1
#在计算图g1中读取变量“v”
with tf.Session(graph = g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("v")))
 
 
  • 集合
在一个计算图(tf.Graph)中,可以通过集合(collection)来管理不同类别的资源。比如通过 tf.add_to_collection 函数可以将资源加入一个或多个集合中,然后通过 tf.get_collection 获取一个集合里面的所有资源(如张量,变量,或者运行TensorFlow程序所需的队列资源等等)。比如,通过 tf.add_n(tf.get_collection('losses')) 获得总损失。
集合名称
集合内容
使用场景
tf.GraphKeys.VARIABLES
所有变量
持久化 TensorFlow 模型
tf.GraphKeys.TRAINABLE_VARIABLES
可学习的变量(一般指神经网络中的参数)
模型训练、生成模型可视化内容
tf.GraphKeys.SUMMARIES
日志生成相关的张量
TensorFlow 计算可视化
tf.GraphKeys.QUEUE_RUNNERS
处理输入的 QueueRunner
输入处理
tf.GraphKeys.MOVING_AVERAGE_VARIABLES
所有计算了滑动平均值的变量
计算变量的滑动平均值
  1. TensorFlow中的所有变量都会被自动加入tf.GraphKeys.VARIABLES集合中,通过 tf.global_variables()函数可以拿到当前计算图上的所有变量。拿到计算图上的所有变量有助于持久化整个计算图的运行状态。
  2. 当构建机器学习模型时,比如神经网络,可以通过变量声明函数中的trainable参数来区分需要优化的参数(比如神经网络的参数)和其他参数(比如迭代的轮数,即超参数),若trainable = True,则此变量会被加入tf.GraphKeys.TRAINABLE_VARIABLES集合。然后通过 tf.trainable_variables函数便可得到所有需要优化的参数。TensorFlow中提供的优化算法会将tf.GraphKeys.TRAINABLE_VARIABLES集合中的变量作为 默认的优化对象。
例1:tf.add_to_collection('name', content)第一个参数'name'是集合的名字,第二个参数content是要加入这个集合的内容(见课本P89~90)
 
# 定义一个神经网络模型的参数生成函数get_weight(shape, lambda),其中shape为需要正则化的张量的维度,lambda为该正则化项的权重(该函数会给模型参数自动生成正则化损失项)
# 获取一层神经网络边上的权重,并将这个权重的L2正则化损失加入名为'losses'的集合中,并返回生成的变量
def get_weight(shape, lambda):
    # 获取一层神经网络边上的权重(通过shape生成一个正态分布随机变量)
    var = tf.Variable(tf.random_normal(shape), dtype=tf.float32)
    # 将这个权重的 L2 正则化损失加入名称为 'losses' 的集合中
    tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(lambda)(var))
    # 返回生成的变量
    return var
 
 
 
 
 
2-1常量,op(operation操作节点),会话sess,图Graph,tensor张量(矩阵,数组)
with tf.Session() as sess:#相当于定义了一个会话,可以省略关闭会话步骤
2-2变量初始化和赋值
赋值tf.assign()
初始化tf.global_variables_initializer()
2-3取出与传入,占位符
2-4直线y=kx+b拟合参数k和b的实例
 
example用法
        1、图片name,shpe,data特征分别解码为string、元组、张量flot64
        2、把这些特征以字典形式传入tf.train.Features()函数中的feature属性得到返回值features
        3、把features当作参数传入example()得到example
        4、使用writer.write(example.SerializeToString())把example 序列化成 string 类型,然后写入.tfrecord文件(其中writer = tf.python_io.TFRecordWriter(output))
 
TFRecord文件读取
 
 
多线程管理队列输入
TensorFlow提供了两个类来帮助多线程的实现:tf.Coordinator和 tf.QueueRunner。从设计上这两个类必须被一起使用。Coordinator类可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常。QueueRunner类用来协调多个工作线程同时将多个张量推入同一个队列中
 
首先,我们先创建数据流图,这个数据流图由一些流水线的阶段组成,阶段间用队列连接在一起。第一阶段将生成文件名,我们读取这些文件名并且把他们排到文件名队列中。第二阶段从文件中读取数据(使用Reader),产生样本,而且把样本放在一个样本队列中。根据你的设置,实际上也可以拷贝第二阶段的样本,使得他们相互独立,这样就可以从多个文件中并行读取。在第二阶段的最后是一个排队操作,就是入队到队列中去,在下一阶段出队。因为我们是要开始运行这些入队操作的线程,所以我们的训练循环会使得样本队列中的样本不断地出队。如下图所示
 
 
tf.train.string_input_producer(
    string_tensor,
    num_epochs=None,
    shuffle=True,
    seed=None,
    capacity=32,
    shared_name=None,
    name=None,
    cancel_op=None
)
定义于:tensorflow/python/input.py。
输出字符串到一个输入管道队列。
注意:如果num_epochs不是None,则此函数创建本地计数器 epochs。使用local_variables_initializer()初始化局部变量。
参数:
string_tensor:1-D字符串Tensor。
num_epochs:一个整数(可选)。如果指定,string_input_producer在产生OutOfRange错误之前从string_tensor中产生num_epochs次字符串。如果未指定,则可以无限次循环遍历字符串。
shuffle:布尔值。如果为true,则在每个epoch内随机打乱顺序。
seed:一个整数(可选)。如果shuffle==True,则使用种子。
capacity:一个整数。设置队列容量。
shared_name:(可选的)。如果设置,则此队列将在多个会话的给定名称下共享。对具有此队列的设备打开的所有会话都可以通过shared_name访问它。在分布式设置中使用它意味着只有能够访问此操作的其中一个会话才能看到每个名称。
name:此操作的名称(可选)。
cancel_op:取消队列的操作(可选)。
返回:
一个带有输出字符串的队列。此队列的一个QueueRunner被添加到当前Graph的QUEUE_RUNNER集合中。
 
 
 
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值