Tensorflow
与图相关的API位于tf.Graph类中:
tf.Operation类代表图中的一个节点,用于计算张量数据:
tf.Tensor类是操作输出的符号句柄,它不包含操作输出的值,提供一种在tf.session中的计算方法:
可视化:tf.summary,FileWriter类用于在目录中创建事件文件,并且向文件中添加摘要和事件,用来在Tensorboard中展示:
常见API:
1. tf.global_variables_initializer()
初始化计算图中所有全局变量(op)
2. tf.local_variables_initializer()
用来初始化计算图中所有局部变量(op)
3. tf.summary.scalar(tags, values, collections=None, name=None)
用来显示标量信息,一般在画loss,accuary时会用到这个函数
如:tf.summary.scalar(‘mean‘, mean)
4. tf.summary.histogram(tags, values, collections=None, name=None)
用来显示直方图信息,一般用来显示训练过程中变量的分布情况
如:tf.summary.histogram(‘histogram‘, var)
5. tf.summary.distribution
分布图,一般用于显示weights分布
6. tf.summary.merge_all()
将所有summary全部保存到磁盘,以便tensorboard显示
如:tf.summaries.merge_all(key=‘summaries‘)
7. tf.summary.merge(inputs, collections=None, name=None)
一般选择要保存的信息还需要用到tf.get_collection()函数
tf.summary.merge(inputs, collections=None, name=None)
8. tf.summary.text
可以将文本类型的数据转换为tensor写入summary中
9. tf.summary.image(tag, tensor,max_images,collections=None,name=None)
输出带图像的probuf,汇总数据的图像的的形式如下: ‘ tag /image/0‘, ‘ tag /image/1‘...,如:input/image/0等
tf.summary.image(tag, tensor, max_images=3, collections=None, name=None)
10. tf.summary.audio
展示训练过程中记录的音频
11. tf.summary.FileWriter
指定一个文件用来保存图
tf.summary.FileWritter(path,sess.graph)
12. tf.gfile.Copy(oldpath, newpath, overwrite=False)
拷贝源文件并创建目标文件,无返回
13. tf.gfile.MkDir(dirname)
创建一个目录,dirname为目录名字,无返回
14. tf.gfile.Remove(filename)
删除文件,filename即文件名,无返回
15. tf.gfile.DeleteRecursively(dirname)
递归删除所有目录及其文件,dirname即目录名,无返回
16. tf.gfile.Exists(filename)
判断目录或文件是否存在,filename可为目录路径或带文件名的路径,有该目录则返回True,否则False
17. tf.gfile.Glob(filename)
查找匹配pattern的文件并以列表的形式返回,filename可以是一个具体的文件名,也可以是包含通配符的正则表达式
18. tf.gfile.IsDirectory(dirname)
判断所给目录是否存在,如果存在则返回True,否则返回False,dirname是目录名
19. tf.gfile.ListDirectory(dirname)
罗列dirname目录下的所有文件并以列表形式返回,dirname必须是目录名
20. tf.gfile.MakeDirs(dirname)
以递归方式建立父目录及其子目录,如果目录已存在且是可覆盖则会创建成功,否则报错,无返回
21. tf.gfile.Rename(oldname, newname, overwrite=False)
重命名或移动一个文件或目录,无返回
22. tf.gfile.Stat(filename)
返回目录的统计数据,该函数会返回FileStatistics数据结构
23. tf.gfile.Walk(top, in_order=True)
递归获取目录信息生成器,top是目录名,in_order默认为True指示顺序遍历目录,否则将无序遍历,每次生成返回如下格式信息(dirname, [subdirname, subdirname, ...], [filename, filename, ...])
24. tf.gfile.GFile(filename, mode)
获取文本操作句柄,类似于python提供的文本操作open()函数,filename是要打开的文件名,mode是以何种方式去读写,将会返回一个文本操作句柄,tf.gfile.Open()是该接口的同名,可任意使用其中一个
25. tf.gfile.FastGFile(filename, mode)
该函数与tf.gfile.GFile的差别仅仅在于“无阻塞”,即该函数会无阻赛以较快的方式获取文本操作句柄
26. tf.train.Saver()
保存和恢复都需要实例化一个tf.train.Saver
27. tf.saved_model.utils.build_tensor_info(tensor)
使用SignatureDef方法,构建tensor info,将输入输出tensor的信息都进行了封装,并且给他们一个自定义的别名
{‘input_x‘: tf.saved_model.utils.build_tensor_info(x), ‘keep_prob‘: tf.saved_model.utils.build_tensor_info(keep_prob)}
28.tf.saved_model.signature_def_utils.build_signature_def(inputs, outputs, method_name )
使用SignatureDef方法,构建signature
tf.saved_model.signature_def_utils.build_signature_def(inputs, outputs, ‘test_sig_name‘)
29. tf.placeholder(dtype,shape=None,name=None)
用于构建graph的时候在模型中的占位,在执行session的时候再赋具体的值
30. tf.get_variable(name,shape,dtype,initializer,trainable)
此函数用于定义图变量。获取已经存在的变量,如果不存在,就新建一个
tf.get_variable(name=‘var1‘,shape=[1],initializer=None,dtype=tf.float32)
31. tf.Variable(initial_value,optional_name)
此函数用于定义图变量,生成一个初始值为initial_value的变量。
tf.Variable(tf.random_normal(shape[4,3],mean=0,stddev=1),name=‘v1‘)
32.tf.contrib.layers.xavier_initialize(uniform=True,seed=None,dtype=tf.float32 )
该函数返回一个用于初始化权重的初始化程序 Xavier,这个初始化器是用来保持每一层的梯度大小都差不多相同。
uniform: 使用uniform或者normal分布来随机初始化;
seed: 可以认为是用来生成随机数的seed;
dtype: 只支持浮点数;
tf.contrib.layers.xavier_initializer(uniform=False,dtype=tf.float32)
33. tf.constant_initializer()
初始化为常数,这个非常有用,通常偏置项就是用它初始化的
tf.constant_initializer(0.0)
34. tf.concat(values,axis,name=‘concat‘)
连接两个矩阵的操作,axis必须是数,表明在哪一维上连接
t1 = [[1, 2, 3], [4, 5, 6]] #这是一个2*3的矩阵t2 = [[7, 8, 9], [10, 11, 12]] #2*3tf.concat([t1, t2], 0) ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]tf.concat([t1, t2], 1) ==> [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]
35. tf.nn.embedding_lookup
选取一个张量里面索引对应的元素,即按照ids顺序返回params中的第ids行。换而言之,从id(索引)找到对应的One-hot encoding,然后非零节点的weight就直接对应了输出节点的值(注意这里没有activation function),也就是对应的embedding向量
tf.nn.embedding_lookup(embedding, input_ids)
36.tf.gather(params, indices, validate_indices=None, name=None, axis=0)
按照指定的索引集合从axis中抽取子集,适合抽取不连续区域的子集
input = [[[1, 1, 1], [2, 2, 2]],[[3, 3, 3], [4, 4, 4]],[[5, 5, 5], [6, 6, 6]]]tf.gather(input, [0, 1], axis=0) = [[[1, 1, 1], [2, 2, 2]],[[3, 3, 3], [4, 4, 4]]]tf.gather(input, [0, 1], axis=1) = [[[1, 1, 1], [2, 2, 2]],[[3, 3, 3], [4, 4, 4]],[[5, 5, 5], [6, 6, 6]]]tf.gather(input, [0, 1], axis=2) = [[[1, 1], [2, 2]],[[3, 3], [4, 4]],[[5, 5], [6, 6]]]
37. tf.slice(input_, begin, size, name=None)
按照指定的下标范围抽取连续区域的子集
同tf.gather
38. tf.reshape(tensor,shape,name=None)
将tensor变换为参数shape形式,shape若有-1标识缺省值
tf.reshape(t, [2,2,3]),tfreshape(t,[-1,4,3])
39. tf.tile( input, multiples, name=None )
用于在同一维度上的复制
tf.tile(input, [2,2])
40. tf.layers.dense(
inputs,
units,
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=tf.zeros_initializer(),
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
reuse=None
)
添加全连接层
inputs:输入该网络层的数据
units:输出的维度大小,改变inputs的最后一维
activation:激活函数,即神经网络的非线性变化
use_bias:使用bias为True(默认使用),不用bias改成False即可,是否使用偏置项
kernel_initializer: 卷积核的初始化器
bias_initializer : 偏置项的初始化器,默认初始化为0
kernel_regularizer: 卷积核的正则化,可选
bias_regularizer: 偏置项的正则化,可选
activity_regularizer: 输出的正则化函数
trainable: 表明该层的参数是否参与训练。如果为真则变量加入到图集合中
tf.layers.dense(inputs=pool3, units=1024, activation=tf.nn.relu)
41. tf.sequence_mask(lengths, maxlen=None, dtype=tf.bool, name=None)
返回一个表示每个单元的前N个位置的mask张量
lengths:整数张量,其所有值小于等于maxlen;
maxlen:标量整数张量,返回张量的最后维度的大小;默认值是lengths中的最大值;
dtype:结果张量的输出类型;
name:操作的名字;
tf.sequence_mask([1, 3, 2], 5) => # [[True, False, False, False, False], # [True, True, True, False, False], # [True, True, False, False, False]]
42. tf.expand_dims(input, axis=None, name=None, dim=None)
在第axis位置增加一个维度
43. tf.ones_like( tensor, dtype=None, name=None, optimize=True )
给定一个张量(tensor),此操作返回与所有元素设置为1的张量相同的类型和形状的张量
44. tf.where(condition, x=None, y=None, name=None)
返回值是对应元素,condition中元素为True的元素替换为x中的元素,为False的元素替换为y中对应元素
x=[[1,2,3],[4,5,6]]y=[[7,8,9],[10,11,12]]condition=[[True,False,False, [False,True,True]]tf.where(condition,x,y)=[[ 1,8,9],[10,5,6]]
45. tf.nn.softmax(logits, axis=None, name=None, dim=None)
通过Softmax回归,将logistic的预测二分类的概率的问题推广到了n分类的概率的问题
tf.nn.softmax(x)
46.tf.matmul(a,b,transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
将矩阵a乘以矩阵b,生成a * b
a: 一个类型为 float16, float32, float64, int32, complex64, complex128 且张量秩 > 1 的张量。
b: 一个类型跟张量a相同的张量。
transpose_a: 如果为真, a则在进行乘法计算前进行转置。
transpose_b: 如果为真, b则在进行乘法计算前进行转置。
adjoint_a: 如果为真, a则在进行乘法计算前进行共轭和转置。
adjoint_b: 如果为真, b则在进行乘法计算前进行共轭和转置。
a_is_sparse: 如果为真, a会被处理为稀疏矩阵。
b_is_sparse: 如果为真, b会被处理为稀疏矩阵。
47. tf.multiply(x, y, name=None)
两个矩阵中对应元素各自相乘,注意:两个相乘的数必须有相同的数据类型,不然就会报错
48. tf.reduce_mean(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
input_tensor: 输入的待降维的tensor;
axis: 指定的轴,如果不指定,则计算所有元素的均值;
keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
name: 操作的名称;
reduction_indices:在以前版本中用来指定轴,已弃用;
49. tf.reduce_sum(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
input_tensor: 输入的待降维的tensor;
axis: 指定的轴,如果不指定,则计算所有元素的和;
keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
name: 操作的名称;
reduction_indices:在以前版本中用来指定轴,已弃用;
50. tf.reduce_max(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
input_tensor: 输入的待降维的tensor;
axis: 指定的轴,如果不指定,则计算所有元素的最大值;
keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
name: 操作的名称;
reduction_indices:在以前版本中用来指定轴,已弃用;
51. tf.reduce_min(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
input_tensor: 输入的待降维的tensor;
axis: 指定的轴,如果不指定,则计算所有元素的最小值;
keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
name: 操作的名称;
reduction_indices:在以前版本中用来指定轴,已弃用;
52. tf.reduce_all(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
input_tensor: 输入的待降维的tensor;
axis: 指定的轴,如果不指定,则计算所有元素的逻辑和(and运算);
keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
name: 操作的名称;
reduction_indices:在以前版本中用来指定轴,已弃用;
53. tf.reduce_any(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
input_tensor: 输入的待降维的tensor;
axis: 指定的轴,如果不指定,则计算所有元素的逻辑或(or运算);
keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
name: 操作的名称;
reduction_indices:在以前版本中用来指定轴,已弃用;
54. tf.argmax(input, axis=None, name=None, dimension=None)
返回的是vector中的最大值的索引号
input: 为一个张量
axis: 表示选取的坐标轴,0是纵列 1是横列
name: 该操作取名
x = tf.constant([[0, 2, 1], [2, 1, 3]])sess.run(tf.argmax(x, 0))=[1 0 1]sess.run(tf.argmax(x, 1))=[1 2]
55. tf.argmin(input, axis=None, name=None, dimension=None)
返回的是vector中的最小值的索引号
input: 为一个张量
axis: 表示选取的坐标轴,0是纵列 1是横列
name: 该操作取名
x = tf.constant([[0, 2, 1], [2, 1, 3]])sess.run(tf.argmax(x, 0))=[0 1 0]sess.run(tf.argmax(x, 1))=[0 1]
56. tf.run(fetches, feed_dict=None, options=None, run_metadata=None)
不是计算了整个图,只是计算了与想要fetch 的值相关的部分, feed_dict参数的作用是替换图中的某个tensor的值
57. tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
已弃用,使用tf.nn.softmax_cross_entropy_with_logits_v2(logits, labels, name=None)替代
58.tf.nn.softmax_cross_entropy_with_logits_v2(logits,labels,name=None)
logits: 神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes;
labels: 实际的标签,大小同上
59. tf.cast( x, dtype, name=None)
将x的数据格式转化成dtype
60.tf.estimator.inputs.numpy_input_fn(x,y=None,batch_size=128,num_epochs=1, shuffle=None, queue_capacity=1000, num_threads=1)
返回将numpy数组的dict输入到模型中的输入函数,输出基于dict的“features”和“targets”
numpy数组
61. tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
第一个参数input:指需要做卷积的输入图像(Tensor),具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一
第二个参数filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维
第三个参数strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4
第四个参数padding:string类型的量,只能是"SAME","VALID"其中之一,SAME表示卷积核可以停留在图像边缘,VALID不可以
第五个参数:use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true
结果返回一个Tensor,这个输出,就是我们常说的feature map,shape仍然是[batch, height, width, channels]这种形式
62. tf.nn.bias_add(value,bias,name=None)
将偏差项bias加入value中,bias必须是一维向量,values可以是多维向量
63. tf.nn.relu(features, name = None)
计算激活函数 relu,即 max(features, 0)。即将矩阵中每行的非最大值置0
64. tf.nn.max_pool(value, size, strides, padding, name=None)
value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape
size:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1
strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]
padding:和卷积类似,可以取‘VALID‘ 或者‘SAME‘
返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式
65. tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None,name=None)
x:指输入
keep_prob: 设置神经元被选中的概率,在初始化时keep_prob是一个占位符, keep_prob = tf.placeholder(tf.float32) 。tensorflow在run时设置keep_prob具体的值,例如keep_prob: 0.5
name:指定该操作的名字
66. tf.train.GradientDescentOptimizer(learning_rate)
使用梯度下降算法的Optimizer
67. tf.train.AdadeltaOptimizer(learning_rate)
使用Adadelta算法的Optimizer
68. tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
shape: 输出张量的形状,必选
mean: 正态分布的均值,默认为0
stddev: 正态分布的标准差,默认为1.0
dtype: 输出的类型,默认为tf.float32
seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样
name: 操作的名称
69. tf.unstack(value, num=None, axis=0, name=‘unstack‘)
以指定的轴axis,将一个维度为R的张量数组转变成一个维度为R-1的张量。
value: 一个将要被降维的维度大于0的张量。
num: 整数。指定的维度axis的长度。如果设置为None(默认值),将自动求值。
axis: 整数.以轴axis指定的维度来转变 默认是第一个维度即axis=0。支持负数。取值范围为[-R, R)
name: 这个操作的名字(可选)
70.tf.nn.rnn_cell.BasicLSTMCell(n_hidden,forget_bias=1.0,state_is_tuple=True)
n_hidden表示神经元的个数;
forget_bias就是LSTM们的忘记系数,如果等于1,就是不会忘记任何信息。如果等于0,就都忘记;
state_is_tuple默认就是True,官方建议用True,就是表示返回的状态用一个元祖表示;
71. tf.contrib.rnn.static_rnn(step,batch,input,dtype)
使用链式cells实现一个按时间轴展开的RNN
输入:[步长,batch,input]
输出:[n_steps,batch,n_hidden]
72. tf.nn.dynamic_rnn(step,batch,input,dtype)
与static_rnn不同的是,可以让不同迭代传入的batch可以是长度不同数据,但同一次迭代一个batch内部所有数据长度仍然是固定的
输入:[batch,步长,input]
输出:[batch,n_steps,n_hidden]