Tensorflow中常用函数以及常见名词定义讲解

本文详细介绍了Tensorflow中的几个重要函数,包括tf.nn.softmax_cross_entropy_with_logits()的交叉熵计算,tf.arg_max()获取最大值索引,tf.equal()判断相等,tf.cast()类型转换,以及tf.reduce_*系列的降维函数。此外,还解释了Tensorflow中的变量管理,如tf.Variable()、tf.get_variable()、tf.name_scope()和tf.variable_scope()。文章最后讨论了Tensorflow中batch的概念。

Tensorflow详解

Tensorflow官方文档:https://www.w3cschool.cn/tensorflow_python/

目录

Tensorflow详解

一.Tensorflow中常用函数讲解

1. tf.nn.softmax_cross_entropy_with_logits() 交叉熵

2. tf.arg_max()函数

3. tf.equal()函数

4. tf.cast()函数

5. tf.reduce_*类降维函数讲解

(1)tf.reduce_mean()函数

(2)tf.reduce_sum()函数

(3)tf.reduce_min()函数

(4)tf.reduce_max()函数

(5)tf.reduce_all()函数

(6)tf.reduce_any()函数

(7)tf.reduce_logsumexp()函数

(8)tf.reduce_prod()函数

二.Tensorflow中常见名词定义

1. tensorflow中batch的含义


一.Tensorflow中常用函数讲解

1. tf.nn.softmax_cross_entropy_with_logits() 交叉熵

在计算loss的时候,最常见的一句话就是tf.nn.softmax_cross_entropy_with_logits,

首先明确一点,loss是代价值,也就是我们要最小化的值

定义:tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

参数:
除去name参数用以指定该操作的name,与方法有关的一共两个参数:

  • logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batch_size,num_classes],单样本的话,大小就是num_classes
  • labels:实际的标签,大小同上
  • name: 用以指定该操作的name;

具体的执行流程大概分为两步:

第一步是先对网络最后一层的输出做一个softmax,这一步通常是求取输出属于某一类的概率,对于单样本而言,输出就是一个num_classes大小的向量([Y1,Y2,Y3...]其中Y1,Y2,Y3...分别代表了是属于该类的概率)

softmax的公式是:

至于为什么是用的这个公式?这里不介绍了,涉及到比较多的理论证明

第二步是softmax的输出向量[Y1,Y2,Y3...]和样本的实际标签做一个交叉熵,公式如下:

其中指代实际的标签中第i个的值(用mnist数据举例,如果是3,那么标签是[0,0,0,1,0,0,0,0,0,0],除了第4个值为1,其他全为0)

就是softmax的输出向量[Y1,Y2,Y3...]中,第i个元素的值

显而易见,预测越准确,结果的值越小(别忘了前面还有负号),最后求一个平均,得到我们想要的loss

注意!!!这个函数的返回值并不是一个数,而是一个向量,如果要求交叉熵,我们要再做一步tf.reduce_sum操作,就是对向量里面所有元素求和,最后才得到,如果求loss,则要做一步tf.reduce_mean操作,对向量求均值!
--------------------- 
原文:https://blog.csdn.net/mao_xiao_feng/article/details/53382790 

2. tf.arg_max()函数

定义为: def arg_max(input, dimension, name=None)       

作用是取行或者列的最大值的位置(即返回最大的那个数值所在的下标)。

  • input:类型为 float32, float64, int64, int32, uint8, uint16, int16, int8, complex64, complex128, qint8, quint8, qint32, half的tensor
  • dimension:必须为int32, int64. int32,取值为0或1, 当dimension=1时返回每列最大值的下标,当dimension=0时返回每行最大值的下标。
  • name:名字
  • returns:返回一个tensor

3. tf.equal()函数

tf.equal(A,B)是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,

return: 返回的值的矩阵维度和A是一样的。

例:

A = [[1,3,4,5,6]]  
B = [[1,3,4,3,2]]
with tf.Session() as sess:  
    print(sess.run(tf.equal(A, B)))
    
结果:[[ True  True  True False False]]

4. tf.cast()函数

tf.cast(x, dtype)将x的数据格式转化成dtype

例: 

a = tf.Variable([1,0,0,1,1])
b = tf.cast(a,dtype=tf.bool)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(b))
 
[ True False False  True  True]

5. tf.reduce_*类降维函数讲解

(1)tf.reduce_mean()函数

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。

定义:reduce_mean(input_tensor, axis=None, keep_dims=False, name=None)

参数:

  • input_tensor: 输入的待降维的tensor;
  • axis: 指定的轴,如果不指定,则计算所有元素的均值;
  • keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
  • name: 操作的名称;
import tensorflow as tf
 
x = [[1,2,3],
      [1,2,3]]
 
xx = tf.cast(x,tf.float32)
 
mean_all = tf.reduce_mean(xx, keep_dims=False)
mean_0 = tf.reduce_mean(xx, axis=0, keep_dims=False)
mean_1 = tf.reduce_mean(xx, axis=1, keep_dims=False)
 
 
with tf.Session() as sess:
    m_a,m_0,m_1 = sess.run([mean_all, mean_0, mean_1])
 
print m_a    # output: 2.0
print m_0    # output: [ 1.  2.  3.]
print m_1    #output:  [ 2.  2.]


#若设置keep_dims为True,则与xx的shape相同
print m_a    # output: [[ 2.]]
print m_0    # output: [[ 1.  2.  3.]]
print m_1    #output:  [[ 2.], [ 2.]]

--------------------- 
原文:https://blog.csdn.net/dcrmg/article/details/79797826 

(2)tf.reduce_sum()函数

定义:tf.reduce_sum(input_tensor,axis = None,keep_dims = False,name = None ,reduction_indices = None)

参数:

  • input_tensor:要减少的张量。应该有数字类型。
  • axis:要减小的尺寸。如果为None(默认),则缩小所有尺寸。必须在范围[-rank(input_tensor), rank(input_tensor))内。
  • keep_dims:如果为true,则保留长度为1的缩小尺寸。
  • name:操作的名称(可选)。
  • reduction_indices:axis的废弃的名称。

返回:该函数返回减少的张量,相当于np.sum

功能:此函数计算一个张量的各个维度上元素的总和。

说明:函数中的input_tensor是按照axis中已经给定的维度来减少的;除非 keep_dims 是true,否则张量的秩将在axis的每个条目中减少1;如果keep_dims为true,则减小的维度将保留为长度1。 如果axis没有条目,则缩小所有维度,并返回具有单个元素的张量。
例:

x = tf.constant([[1, 1, 1], [1, 1, 1]])
tf.reduce_sum(x)  # 6
tf.reduce_sum(x, 0)  # [2, 2, 2]
tf.reduce_sum(x, 1)  # [3, 3]
tf.reduce_sum(x, 1, keep_dims=True)  # [[3], [3]]
tf.reduce_sum(x, [0, 1])  # 6

(3)tf.reduce_min()函数

定义:reduce_min(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)

参数:

  • input_tensor:减少的张量。应该有数字类型。
  • axis:要减小的尺寸。如果为None(默认),则缩小所有维度。必须在[-rank(input_tensor), rank(input_tensor))范围内。
  • keep_dims:如果为true,则保留长度为1的缩小维度。
  • name:操作的名称(可选)。
  • reduction_indices:axis的废弃的名称。

返回:该函数返回减少的张量,相当于np.min

功能:tf.reduce_min函数用来计算一个张量的各个维度上元素的最小值。 

说明:同样按照axis给定的维度减少input_tensor。除非 keep_dims 是true,否则张量的秩将在axis的每个条目中减少1。如果keep_dims为true,则减小的维度将保留为长度1。 如果axis没有条目,则缩小所有维度,并返回具有单个元素的张量。

(4)tf.reduce_max()函数

定义:reduce_max(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)

参数:

  • input_tensor:要减少的张量。应该有数字类型。
  • axis:要减小的尺寸。如果为 None(默认),则减少所有维度。必须在[-rank(input_tensor), rank(input_tensor))范围内。
  • keep_dims:如果为true,则保留长度为1的减少维度。
  • name:操作的名称(可选)。
  • reduction_indices:axis的废弃的名称。
     

返回:该函数返回减少的张量,相当于np.max。

功能:计算一个张量的各个维度上元素的最大值。 

说明:按照axis给定的维度减少input_tensor。除非 keep_dims 是true,否则张量的秩将在axis的每个条目中减少1。如果keep_dims为true,则减小的维度将保留为长度1。如果axis没有条目,则减少所有维度,并返回具有单个元素的张量。

(5)tf.reduce_all()函数

定义:reduce_all(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)

参数:

  • input_tensor:要减少的张量。应该有数字类型。
  • axis:要减小的尺寸。如果为None(默认),则减少所有维度。必须在[-rank(input_tensor), rank(input_tensor))范围内。
  • keep_dims:如果为true,则保留长度为1的缩小尺寸。
  • name:操作的名称(可选)。
  • reduction_indices:axis的不支持使用的名称。
     

返回:该函数返回减少的张量。相当于np.all

功能:计算一个张量在维度上元素的“逻辑和”。

说明:给按照轴线给定的维度减少input_tensor 。除非keep_dims为 true,否则张量的秩将在轴的每个条目中减少1。如果keep_dims为 true,则减小的维度将保留为长度1。如果轴没有条目,则会减少所有维度,并返回具有单个元素的张量。

例:

x = tf.constant([[True,  True], [False, False]])
tf.reduce_all(x)  # False
tf.reduce_all(x, 0)  # [False, False]
tf.reduce_all(x, 1)  # [True, False]

(6)tf.reduce_any()函数

定义:reduce_any(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)

参数:

  • input_tensor:要减少的布尔张量。
  • axis:要减小的尺寸。如果为None(默认),则减少所有维度。必须在范围[-rank(input_tensor), rank(input_tensor))内。
  • keep_dims:如果为true,则保留长度为1的缩小维度。
  • name:操作的名称(可选)。
  • reduction_indices:axis的已经弃用的名称。

返回:减少张量,相当于np.any

功能:在张量的维度上计算元素的 "逻辑或"。 

说明:按照axis给定的维度减少input_tensor。除非 keep_dims 是 true,否则张量的秩将在axis的每个条目中减少1。如果keep_dims为true,则缩小的维度将保留为1。如果axis没有条目,则会减少所有维度,并返回具有单个元素的张量。
例:

x = tf.constant([[True,  True], [False, False]])
tf.reduce_any(x)  # True
tf.reduce_any(x, 0)  # [True, True]
tf.reduce_any(x, 1)  # [True, False]

(7)tf.reduce_logsumexp()函数

定义:reduce_logsumexp(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)

参数:

  • input_tensor:张量减少。应该有数字类型。
  • axis:要减小的维度。如果为None(默认),则减少所有维度。必须在[-rank(input_tensor), rank(input_tensor))范围内。
  • keep_dims:如果为true,则保留长度为1的减少尺寸。
  • name:操作的名称(可选)。
  • reduction_indices:axis的弃用名称。

返回:减少的张量。

功能:计算log(sum(exp(张量的各维数的元素)))。 

说明:按照给定的axis上的维度减少input_tensor。除非keep_dims是true,否则张量的秩在axis上的每一项都减少1。如果keep_dims为 true,则减少的尺寸将保留为1。如果axis没有条目,则缩小所有维度,并返回具有单个元素的张量。这个函数在数值上比 log(sum(exp(input)))更稳定。它避免了大量输入的 exp 引起的溢出和小输入日志带来的下溢。
例:

x = tf.constant([[0., 0., 0.], [0., 0., 0.]])
tf.reduce_logsumexp(x)  # log(6)
tf.reduce_logsumexp(x, 0)  # [log(2), log(2), log(2)]
tf.reduce_logsumexp(x, 1)  # [log(3), log(3)]
tf.reduce_logsumexp(x, 1, keep_dims=True)  # [[log(3)], [log(3)]]
tf.reduce_logsumexp(x, [0, 1])  # log(6)

(8)tf.reduce_prod()函数

定义:reduce_prod(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)

参数:

  • input_tensor:要减少的张量。应该有数字类型。
  • axis:要减小的尺寸。如果为None(默认),则将缩小所有尺寸。必须在[-rank(input_tensor), rank(input_tensor))范围内。
  • keep_dims:如果为true,则保留长度为1的缩小维度。
  • name:操作的名称(可选)。
  • reduction_indices:axis的废弃的名称。

返回:结果返回减少的张量,相当于np.prod

功能:此函数计算一个张量的各个维度上元素的乘积。 

说明:函数中的input_tensor是按照axis中已经给定的维度来减少的;除非 keep_dims 是true,否则张量的秩将在axis的每个条目中减少1;如果keep_dims为true,则减小的维度将保留为长度1。 如果axis没有条目,则缩小所有维度,并返回具有单个元素的张量。

--------------------- 

原文:https://blog.csdn.net/u013093426/article/details/81430374 

6. enumerate() 函数

定义: enumerate(sequence, [start=0])

参数:

  • sequence -- 一个序列、迭代器或其他支持迭代对象。
  • start -- 下标起始位置。

返回:返回 enumerate(枚举) 对象。

功能:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。Python 2.3. 以上版本可用,2.6 添加 start 参数。

示例1:

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

示例2:普通的 for 循环

>>>i = 0
>>> seq = ['one', 'two', 'three']
>>> for element in seq:
...     print i, seq[i]
...     i +=1
... 
0 one
1 two
2 three

示例3:for 循环使用 enumerate

>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
...     print i, element
... 
0 one
1 two
2 three

7.tf.name_scope()、tf.variable_scope()、tf.Variable()、tf.get_variable()的介绍

7.1 tf.Variable()、tf.get_variable()--创建变量

  • tf.Variable():只要使用该函数,一律创建新的variable,如果出现重名,变量名后面会自动加上后缀1,2….
  • tf.get_variable():如果变量存在,则使用以前创建的变量,如果不存在,则新创建一个变量。

示例:

import tensorflow as tf

with tf.name_scope('cltdevelop'):
    var_1 = tf.Variable(initial_value=[0], name='var_1')
    var_2 = tf.Variable(initial_value=[0], name='var_1')
    var_3 = tf.Variable(initial_value=[0], name='var_1')
print(var_1.name)
print(var_2.name)
print(var_3.name)

结果:

cltdevelop/var_1:0
cltdevelop/var_1_1:0
cltdevelop/var_1_2:0

7.2 tf.name_scope()、tf.variable_scope()--变量的分组管理

tf.name_scope()、tf.variable_scope()为tensorflow中的两种作用域(名字域),即通过不同的域来区别变量名。

  • tf.name_scope() :主要是方便参数变量的“ 分组 ”和 “ 管理 ”,用于管理一个图里面的各种op;
  • tf.variable_scope():一方面也是可以实现变量的“ 分组 ”和“ 管理 ”,可以通过设置reuse 标志以及初始化方式来影响域下的变量,可用在共享变量的设置中;

tensorflow中的变量共享机制:即为了使得在代码的任何部分可以使用某一个已经创建的变量,TF引入了变量共享机制,使得可以轻松的共享变量,而不用传一个变量的引用。

 示例:

import tensorflow as tf

with tf.name_scope('cltdevelop'):
    var_1 = tf.Variable(initial_value=[0], name='var_1')
    var_2 = tf.get_variable(name='var_2', shape=[1, ])
with tf.variable_scope('aaa'):
    var_3 = tf.Variable(initial_value=[0], name='var_3')
    var_4 = tf.get_variable(name='var_4', shape=[1, ])

print(var_1.name)
print(var_2.name)
print(var_3.name)
print(var_4.name)

结果:

cltdevelop/var_1:0
var_2:0
aaa/var_3:0
aaa/var_4:0

 7.3 tensorflow中变量共享机制的实现

在tensorflow中变量共享机制是通过tf.get_variable()和tf.variable_scope()两者搭配使用来实现的。

示例:

import tensorflow as tf

with tf.variable_scope('cltdevelop'):
    var_1 = tf.get_variable('var_1', shape=[1, ])
with tf.variable_scope('cltdevelop', reuse=True):
    var_2 = tf.get_variable('var_1', shape=[1,])

print(var_1.name)
print(var_2.name)

#结果
cltdevelop/var_1:0
cltdevelop/var_1:0

【注:】reuse 设置为 True 或者 tf.AUTO_REUSE 时,表示这个scope下的变量是重用的或者共享的,也说明这个变量以前就已经创建好了。但如果这个变量以前没有被创建过,则在tf.variable_scope下调用tf.get_variable创建这个变量会报错。

总结:

  • tf.Variable()在tf.name_scope()和tf.variable_scope()中无差别;
  • tf.variable_scope() 一般与tf.get_variable()配合使用,实现变量共享;

二.Tensorflow中常见名词定义

1. tensorflow中batch的含义

batch: batch是批。深度学习每一次参数的更新所需要损失函数并不是由一个{data:label}获得的,而是由一组数据加权得到的,这一组数据的数量就是[batch size]。

batch分析详见:https://www.zhihu.com/question/32673260

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值