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张量为例)
- 如果num_or_size_splits 传入的 是一个整数,那直接在axis=D这个维度上把张量平均切分成几个小张量
如:tf.split(my_tensor, 2, 0)——>两个103040 - 如果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差异,差别一目了然

与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))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)