TensorFlow中的函数(网上资料整理)

TensorFlow中的函数


1. tf.Variable( )

相关链接

tf.Variable(
                    initial_value=None, 
                    trainable=None, # Variable特有的属性,表征当前张量是否需要被优化,默认启用
                    validate_shape=True, 
                    caching_device=None,
                    name=None, # Variable特有的属性,用于命名图中的变量
                    variable_def=None, 
                    dtype=None, # 类型,如:int32
                    import_scope=None, 
                    constraint=None,
                    synchronization=tf.VariableSynchronization.AUTO,
                    aggregation=tf.compat.v1.VariableAggregation.NONE, 
                    shape=None
)

为了区分 需要计算梯度信息的张量不需要计算梯度信息的张量,这个函数用来支持记录梯度信息(name、trainable等属性)。

这个函数的设计原因:由于梯度运算会消耗大量的计算资源,而且会自动更新相关参数。

对于不需要的优化的张量,如神经网络的输入X,不需要通过 tf.Variable 封装;
相反,对于需要计算梯度并优化的张量,如神经网络层的W和b,需要通过 tf.Variable 包裹以便 TensorFlow 跟踪相关梯度信息。

2. tf.constant( )

相关链接

tf.constant(
    value, # 必须的,可以是一个数值,也可以是一个列表
    dtype=None,
    shape=None,
    name='Const',
    verify_shape=False
)

用于创建常量,示例:

tensor=tf.constant([1, 2], dtype=tf.float32)    #注意这里类型不是整型,所以最后输出[1.,2.]
sess=tf.Session() # 为查看结果必须创建一个会话
with sess.as_default():
    print('结果是:', tensor.eval()) #并用取值函数eval()来查看创建的tensor的值

3. tf.add( )

tf.add(state,one)

TensorFlow中,所有的操作op、变量都视为节点,
tf.add()的意思是:在tf的默认graph中,添加一个op,这个op是用来做加法操作的

4. tf.assign( )

tf.assign (
      ref  , #一个可变的张量,应该来自变量节点,节点可能未初始化.
      value ,  #张量,必须具有与 ref相同的类型,是要分配给变量的值.
      validate_shape = None , # 一个可选的 bool.默认为 True.如果为 true, 则操作将验证 "value" 的形状是否与分配给的张量的形状相匹配;如果为 false, "ref" 将对 "值" 的形状进行引用
      use_locking = None , #一个可选的 bool.默认为 True.如果为 True, 则分配将受锁保护;否则, 该行为是未定义的, 但可能会显示较少的争用.
      name = None #操作的名称(可选).
  )

通过将 "value" 赋给 "ref" 来更新 "ref".

此操作输出在赋值后保留新值 "ref"的张量.这使得更易于链接需要使用重置值的操作.

注意:只有当这个赋值被完成时,该旧值ref才会被修改成new_value(所谓的赋值被完成其实指得是需要对tf.assign()函数的返回值执行一下sess.run()操作后,才能保证正常更新。)

5. tf.initialize_all_variables( )

init = tf.initialize_all_variables( )

用于初始化变量。
但这句话不会立即执行,需通过sess将数据流动起来

切记:所有的运算都应在session中进行

6. 将上面的命令组合到一起

import tensorflow as tf

state = tf.Variable(0 , name = 'counter')
one = tf.constant(1)
new_value = tf.add(state, one)
up_date = tf.assign(state, new_value)
init = tf.initialize_all_variables( )

with tf.Session():  #此处自动开启一个session
    sess.run(init)  #对变量进行初始化,执行run(init)语句
    for _ in range(3):  #循环三次,并打印输出
        sess.run(update)
        print(sess.run(state))

7. tf.placeholder()

tf.placeholder(
    dtype,  #数据类型,常用的是tf.float32,tf.float64等数值类型
    shape=None, #数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)
    name=None   #名称
)

为什么要用placeholder
Tensorflow的设计理念称之为计算流图,在编写程序时,首先构筑整个系统的graph,代码并不会直接生效,这一点和python的其他数值计算库(如Numpy等)不同,graph为静态的,类似于docker中的镜像。

然后,在实际的运行时,启动一个session,程序才会真正的运行。这样做的好处就是:避免反复地切换底层程序实际运行的上下文,tensorflow帮你优化整个系统的代码。我们知道,很多python程序的底层为C语言或者其他语言,执行一行脚本,就要切换一次,是有成本的,tensorflow通过计算流图的方式,帮你优化整个session需要执行的代码,还是很有优势的。

所以placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。

8. tf.argmax()

tf.argmax(  input, #输入矩阵
            axis=None,  #0或1。0:按列比较,1:按行比较
            name=None, 
            dimension=None,
            output_type = tf.int64 #默认类型
        )

返回最大的数值所在的下标

9. tf.cast()

tf.cast(
    x,      #输入张量
    dtype,  #转换数据类型
    name=None   #名称
)

数据类型转换

10. tf.reduce_mean()

tf.reduce_mean(input_tensor,    #输入的待降维的tensor
                axis=None,      #指定的轴,如果不指定,则计算所有元素的均值;
                keep_dims=False,    #是否降维,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度(,默认False。)
                name=None,  #操作的名称
                reduction_indices=None #在以前版本中用来指定轴,已弃用;
                )

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

11. tf.split()

tf.split(
    value,  #需要切割的张量
    num_or_size_splits, #准备切成几份 
    axis=0, #准备在第几个维度上进行切割 
    num=None,
    name='split'
)

用途:把一个张量划分成几个子张量。
其中分割方式分为两种(以203040的my_tensor张量为例)

  1. 如果num_or_size_splits 传入的 是一个整数,那直接在axis=D这个维度上把张量平均切分成几个小张量
    如:tf.split(my_tensor, 2, 0)——>两个103040
  2. 如果num_or_size_splits 传入的是一个向量(这里向量各个元素的和要跟原本这个维度的数值相等)就根据这个向量有几个元素分为几项)
    如:tf.split(my_tensor, [10, 5, 25], 0)——>[203010],[20305],[203025]

12. tf.variable_scope()

tf.variable_scope(
                    name_or_scope,          #string或者VariableScope表示打开的范围。
                    default_name = None,    #如果name_or_scope参数为None,则使用默认的名称,该名称将是唯一的;如果提供了name_or_scope,它将不会被使用,因此它不是必需的,并且可以是None。
                    values = None,  #传递给操作函数的Tensor参数列表。
                    initializer =  None,    #此范围内变量的默认初始值设定项
                    regularizer,    #此范围内变量的默认正规化器。
                    caching_device, #此范围内变量的默认缓存设备。
                    partitioner,    #此范围内变量的默认分区程序。
                    custom_getter,  # 此范围内的变量的默认自定义吸气。
                    reuse,  #可以是True、None或tf.AUTO_REUSE;如果是True,则我们进入此范围的重用模式以及所有子范围;如果是tf.AUTO_REUSE,则我们创建变量(如果它们不存在),否则返回它们;如果是None,则我们继承父范围的重用标志。当启用紧急执行时,该参数总是被强制为tf.AUTO_REUSE。
                    dtype,  #在此范围中创建的变量类型(默认为传入范围中的类型,或从父范围继承)。
                    use_resource,   #如果为false,则所有变量都将是常规变量;如果为true,则将使用具有明确定义的语义的实验性
                    ResourceVariables,  #默认为false(稍后将更改为true)。当启用紧急执行时,该参数总是被强制为true。
                    constraint, #一个可选的投影函数,在被Optimizer(例如用于实现层权重的范数约束或值约束)更新之后应用于该变量。该函数必须将代表变量值的未投影张量作为输入,并返回投影值的张量(它必须具有相同的形状)。进行异步分布式培训时,约束条件的使用是不安全的。
                    auxiliary_name_scope    #如果为True,则我们用范围创建一个辅助名称范围;如果为False,则我们不接触名称范围。
                )

返回值:
返回可以捕获和重用的范围。
可能引发的异常:

ValueError:在创建范围内尝试重用时,或在重用范围内创建时。
TypeError:某些参数的类型不合适时。

可以让变量有相同的命名,包括tf.get_variable得到的变量,还有tf.Variable变量。绝大部分情况下,根tf.get_variable()配合使用,实现变量共享的功能
它返回的是一个用于定义创建variable(层)的op的上下文管理器。
此上下文管理器验证(可选)values是否来自同一图形,确保图形是默认的图形,并推送名称范围和变量范围。
如果name_or_scope不是None,则使用as is.如果scope是None,则使用default_name.在这种情况下,如果以前在同一范围内使用过相同的名称,则通过添加_N来使其具有唯一性.

变量范围允许您创建新变量并共享已创建的变量,同时提供检查以防止意外创建或共享

例子(整个代码是判断m的变量作用域的名称是"tjn/czj/v:0"还是"tjn/czj/v:1"?)

import tensorflow as tf
with tf.variable_scope("tjn"):
    with tf.variable_scope("czj"):
        m=tf.get_variable("v",[12])     #获取v的变量,如果变量名为v的变量没有就创建,有的话就引用
        assert m.name == "tjn/czj/v:0"  # assert的意思:是断言,判断真假,如果为真就不报错继续执行,如果为假就抛出异常;

(没解决的:与name_scope的区别)

13. tf.nn.embedding_lookup()

tf.nn.embedding_lookup(
     params,    #由一个tensor或者多个tensor组成的列表(多个tensor组成时,每个tensor除了第一个维度其他维度需相等);
     ids,   #一个类型为int32或int64的Tensor,包含要在params中查找的id;
     partition_strategy='mod',  #逻辑index是由partition_strategy指定,partition_strategy用来设定ids的切分方式,目前有两种切分方式’div’和’mod’.
     name=None, #操作名称(可选)
     validate_indices=True, #是否验证收集索引
     max_norm=None  #如果不是None,嵌入值将被l2归一化为max_norm的值
)
返回值是一个dense tensor。返回的shape为shape(ids)+shape(params)[1:],实际上tf.nn.embedding_lookup的作用就是找到要寻找的embedding data中的对应的行下的vector。
图像表示
相关链接

14. tf.reshape()

tf.reshape(tensor, shape, name = None)

改变tensor的形状

15. tf.nn.dynamic_rnn()

tf.nn.dynamic_rnn(
    cell,   #LSTM、GRU等的记忆单元。cell参数代表一个LSTM或GRU的记忆单元,也就是一个cell。例如,cell = tf.nn.rnn_cell.LSTMCell((num_units),其中,num_units表示rnn cell中神经元个数,也就是下文的cell.output_size。返回一个LSTM或GRU cell,作为参数传入。
    inputs, #输入的训练或测试数据,一般格式为[batch_size, max_time, embed_size],其中batch_size是输入的这批数据的数量,max_time就是这批数据中序列的最长长度,embed_size表示嵌入的词向量的维度。
    sequence_length=None,   是一个list,假设你输入了三句话,且三句话的长度分别是5,10,25,那么sequence_length=[5,10,25]。
    initial_state=None,
    dtype=None,
    parallel_iterations=None,
    swap_memory=False,
    time_major=False,   #决定了输出tensor的格式,如果为True, 张量的形状必须为 [max_time, batch_size,cell.output_size]。如果为False, tensor的形状必须为[batch_size, max_time, cell.output_size],cell.output_size表示rnn cell中神经元个数。
    scope=None
)

tf.nn.dynamic_rnn 函数是tensorflow封装的用来实现递归神经网络(RNN)的函数
返回值:元组(outputs, states)

outputs很容易理解,就是每个cell会有一个输出
states表示最终的状态,也就是序列中最后一个cell输出的状态。一般情况下states的形状为 [batch_size, cell.output_size ],但当输入的cell为BasicLSTMCell时,state的形状为[2,batch_size, cell.output_size ],其中2也对应着LSTM中的cell state和hidden state。
相关链接

16. tf.layers.dense()

tf.layers.dense(

    inputs, #输入该网络层的数据

    units,  #输出的维度大小,改变inputs的最后一维

    activation=None,    #激活函数,即神经网络的非线性变化

    use_bias=True,  #使用bias为True(默认使用),不用bias改成False即可,是否使用偏置项

trainable=True:表明该层的参数是否参与训练。如果为真则变量加入到图集合中

    kernel_initializer=None,  ##卷积核的初始化器

    bias_initializer=tf.zeros_initializer(),  ##偏置项的初始化器,默认初始化为0

    kernel_regularizer=None,    ##卷积核的正则化,可选

    bias_regularizer=None,    ##偏置项的正则化,可选

    activity_regularizer=None,   ##输出的正则化函数

    kernel_constraint=None,   

    bias_constraint=None,

    trainable=True,

    name=None,  ##层的名字

    reuse=None  ##是否重复使用参数

)

添加一个全连接层(通常在CNN的尾部进行重新拟合,减少特征信息的损失)

17. tf.expand_dims()

tf.expand_dims(
    input, axis=None, name=None, dim=None
)

给定的张量input,该操作插入尺寸索引处的1维axis的input的形状。维度索引axis从零开始;如果您为其指定负数,axis则从末开始算起。
如果要将批次尺寸添加到单个元素,此操作很有用。

18. tf.tile()

tf.tile(
    input,     #输入
    multiples,  #同一维度上复制的次数
    name=None
)

在同一维度上的复制,先对第一维扩展(tile),再对第二维举例

19. tf.squeeze( )

squeeze(
    input,
    axis=None,
    name=None,
    squeeze_dims=None
)

给定张量输入,此操作返回相同类型的张量,并删除所有维度为1的维度。
如果不想删除所有大小是1的维度,可以通过squeeze_dims指定。

20. enumerate( )

  for batch, (x, y) in enumerate(train_loader):     # batch表示索引,    (x, y)表示数据本身
    print("batch: {}, type(x): {}, type(y): {}".format(batch, type(x), type(y)))
    # batch: 0, type(x): <class 'torch.Tensor'>, type(y): <class 'torch.Tensor'>
    print("batch: {}, x.shape: {}, y.shape: {}".format(batch, x.shape, y.shape))
    # batch: 0, x.shape: torch.Size([10000, 1, 28, 28]), y.shape: torch.Size([10000])
    break

python的内置函数,将可迭代的对象同时返回它的下标索引和它的数据本身

21. tf.stack( )

tf.stack(
    values, # 具有相同形状和类型的 Tensor 对象列表.
    axis=0,(default)    # 一个 int,要一起堆叠的轴,默认为第一维,负值环绕,所以有效范围是[-(R+1), R+1).
    name='stack'    #此操作的名称(可选).
)

将 values 中的张量列表打包成一个张量,该张量比 values 中的每个张量都高一个秩,通过沿 axis 维度打包。给定一个形状为(A, B, C)的张量的长度 N 的列表;

如果 axis == 0,那么 output 张量将具有形状(N, A, B, C)。如果 axis == 1,那么 output 张量将具有形状(A, N, B, C)。

如果 axis == 2,那么 output 张量将具有形状( A, B, N, C)。如果 axis == 3,那么 output 张量将具有形状(A, B, C, N)。

函数返回值:

output:与 values 具有相同的类型的堆叠的 Tensor.

可能引发的异常:

ValueError:如果 axis 超出范围 [ - (R + 1),R + 1),则引发此异常

22. tf.name_scope( )

相关链接
(1)在某个tf.name_scope()指定的区域中定义的所有对象及各种操作,他们的“name”属性上会增加该命名区的区域名,用以区别对象属于哪个区域;
(2)将不同的对象及操作放在由tf.name_scope()指定的区域中,便于在tensorboard中展示清晰的逻辑关系图,这点在复杂关系图中特别重要。
举例:

import tensorflow as tf;  
tf.reset_default_graph()

# 无tf.name_scope()
a = tf.constant(1,name='my_a') #定义常量
b = tf.Variable(2,name='my_b') #定义变量
c = tf.add(a,b,name='my_add') #二者相加(操作)
print("a.name = "+a.name)
print("b.name = "+b.name)
print("c.name = "+c.name)

# 有tf.name_scope()
# with tf.name_scope('cgx_name_scope'): #定义一块名为cgx_name_scope的区域,并在其中工作
#     a = tf.constant(1,name='my_a')
#     b = tf.Variable(2,name='my_b')
#     c = tf.add(a,b,name='my_add')
# print("a.name = "+a.name)
# print("b.name = "+b.name)
# print("c.name = "+c.name)

# 保存graph用于tensorboard绘图
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    writer = tf.summary.FileWriter("./test",sess.graph)
    print(sess.run(c))
writer.close()

结果:

# 输出结果
# 无tf.name_scope()
a.name = my_a:0
b.name = my_b:0
c.name = my_add:0

# 有tf.name_scope()
a.name = cgx_name_scope/my_a:0
b.name = cgx_name_scope/my_b:0
c.name = cgx_name_scope/my_add:0

从输出结果可以看出,在tf.name_scope()下的所有对象和操作,其name属性前都加了cgx_name_scope,用以表示这些内容全在其范围下。
下图展示了两种情况的tensorboard差异,差别一目了然

两种情况的tensorboard差异

与tf.variable_scope()的区别

23. tf.train.exponential_decay()

tf.train.exponential_decay(
    learning_rate,
    global_step,
    decay_steps,
    decay_rate,
    staircase=False,
    name=None
)

一句话描述:对学习率learning_rate应用指数衰减。
多说点:固定的学习率总是显得笨拙:太小速度太慢,太大又担心得不到最优解。一个很直接的想法就是随着训练的进行,动态设置学习率——随着训练次数增加,学习率逐步减小。而tf.train.exponential_decay()就是tf内置的一个生成动态减小学习率的函数。
它的公式如下

decayed_learning_rate = learning_rate *
decay_rate ^ (global_step / decay_steps)

举个例子:

初始学习率LEARNING_RATE_BASE = 0.1
总训练步数GLOBAL_STEPS = 1000
衰减率DECAY_RATE = 0.9
每100步衰减一次(stair=True时)DECAY_STEPS = 100

24. tf_contrib.layers.optimize_loss()

tf.contrib.layers.optimize_loss(
    loss,   #  损失函数
    global_step,    #获取训练步数并在训练时更新
    learning_rate,  # 学习率
    optimizer,  # 定义优化器
    gradient_noise_scale=None,  # float或None,添加由此值缩放的0均值正常噪声。
    gradient_multipliers=None,  # 浮点数的变量或变量名称。 如果存在,指定变量的梯度将乘以给定常量。
    clip_gradients=None,
    learning_rate_decay_fn=None,
    update_ops=None,
    variables=None,
    name=None,
    summaries=None,
    colocate_gradients_with_ops=False,
    increment_global_step=True
)

optimize_loss用来优化网络参数。

这个相当于联系应用下面几个步骤:

compute_gradients: 根据对应的参数,计算每个参数的梯度。
do sth with gradients: 对每个参数采取一定的操作,例如clip这个梯度,防止梯度爆炸
apply_gradients: 对每个参数应用梯度更新。

相关链接

25. tf.get_variable( )

def get_variable(name,   # 新变量或现有变量的名称。
                  shape=None,   #新变量或现有变量的形状。
                  dtype=None,   #新变量或现有变量的类型(默认为DT_FLOAT)。
                  initializer=None,     #如果创建了则用它来初始化变量。
                  regularizer=None, A(Tensor - > Tensor或None)函数;将它应用于新创建的变量的结果将添加到集合tf.GraphKeys.REGULARIZATION_LOSSES中,并可用于正则化。
                  trainable=True,   #如果为True,还将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES(参见tf.Variable)。
                  collections=None, #要将变量添加到的图表集合列表。默认为[GraphKeys.GLOBAL_VARIABLES](参见tf.Variable)。
                  caching_device=None,  # 可选的设备字符串或函数,描述变量应被缓存以供读取的位置。默认为Variable的设备。如果不是None,则在另一台设备上缓存。典型用法是在使用变量驻留的Ops的设备上进行缓存,以通过Switch和其他条件语句进行重复数据删除。
                  partitioner=None, #可选callable,接受完全定义的TensorShape和要创建的Variable的dtype,并返回每个轴的分区列表(当前只能对一个轴进行分区)。
                  validate_shape=True,  #如果为False,则允许使用未知形状的值初始化变量。如果为True,则默认为initial_value的形状必须已知。
                  use_resource=None,    #如果为False,则创建常规变量。如果为true,则使用定义良好的语义创建实验性ResourceVariable。默认为False(稍后将更改为True)。在Eager模式下,此参数始终强制为True。
                  custom_getter=None    #Callable,它将第一个参数作为true getter,并允许覆盖内部get_variable方法。 custom_getter的签名应与此方法的签名相匹配,但最适合未来的版本将允许更改:def custom_getter(getter,* args,** kwargs)。也允许直接访问所有get_variable参数:def custom_getter(getter,name,* args,** kwargs)。一个简单的身份自定义getter只需创建具有修改名称的变量是:python def custom_getter(getter,name,* args,** kwargs):return getter(name +'_suffix',* args,** kwargs)
                  ):

该函数的作用是创建新的tensorflow变量,常见的initializer有:常量初始化器tf.constant_initializer、正太分布初始化器tf.random_normal_initializer、截断正态分布初始化器tf.truncated_normal_initializer、均匀分布初始化器tf.random_uniform_initializer。
注意:如果initializer初始化方法是None(默认值),则会使用variable_scope()中定义的initializer,如果也为None,则默认使用glorot_uniform_initializer,也可以使用其他的tensor来初始化,value,和shape与此tensor相同

正则化方法默认是None,如果不指定,只会使用variable_scope()中的正则化方式,如果也为None,则不使用正则化;

26. tf.truncated_narmal()和tf.truncated_naomal__initializer()的区别

tf.truncated_narmal(shape=[],mean=0,stddev=0.5)使用时必须制定shape,返回值是在截断的正态分布随机生成的指定shape的tensor
tf.truncated_normal_initializer(mean=0.stddev=0.5)调用返回一个initializer 类的一个实例(就是一个初始化器),不可指定shape

27. FLAGS=tf.app.flags.FLAGS

FLAGS=tf.app.flags.FLAGS
tf.app.flags.DEFINE_string("cache_file_h5py","","path of training/validation/test data.")

在执行main函数之前首先进行Flags的解析,也就是说TensorFlow通过设置Flags来传递tf.app.run()所需要的参数,我们可以直接在程序运行前初始化Flags,也可以在运行程序的时候设置命令行参数来达到传参的目的。
在类的初始化时,可以赋值给类中的成员,如:(直接用FLAGS.***既可)

word2index, label2index,trainX,trainXlen,trainY,validX,validXlen,validY,testX,testXlen,testY = 
load_data(FLAGS.cache_file_h5py,FLAGS.cache_file_pickle)

28. 保存graph用于tensorboard绘图

# 保存graph用于tensorboard绘图
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    writer = tf.summary.FileWriter("./test",sess.graph)
    print(sess.run(c))
posted @   kanae  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示