1.tf. accumulate_n( inputs, shape=None, tensor_dtype=None, name=None)
a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[5, 0], [0, 6]])
tf.accumulate_n([a, b, a]) # [[7, 4], [6, 14]]
Explicitly pass shape and type
tf.accumulate_n([a, b, a], shape=[2, 2], tensor_dtype=tf.int32) # [[7, 4],
# [6, 14]]
2.tf.add( x,y, name=None)
这个情况比较多,最常见的是,一个叫x的矩阵和一个叫y的数相加,就是y分别与x的每个数相加,得到的结果和x大小相同。
x=tf.constant([[1,2],[1,2]]) y=tf.constant([[1,1],[1,2]]) z=tf.add(x,y)
x1=tf.constant(1) y1=tf.constant(2) z1=tf.add(x1,y1)
x2=tf.constant(2) y2=tf.constant([1,2]) z2=tf.add(x2,y2)
x3=tf.constant([[1,2],[3,4]]) y3=tf.constant([[1,1]]) z3=tf.add(x3,y3)
with tf.Session() as sess:
z_result,z1_result,z2_result,z3_result=sess.run([z,z1,z2,z3])
print(‘z =\n%s’%(z_result))
print(‘z1 =%s’%(z1_result))
print(‘z2 =%s’%(z2_result))
print(‘z3 =%s’%(z3_result))
结果:
z =[[2 3]
[2 4]]
z1 =3
z2 =[3 4]
z3 =[[2 3]
[4 5]]
3.tf.add_n(inputs,name=None)
函数是实现一个列表的元素的相加。就是输入的对象是一个列表,列表里的元素可以是向量,矩阵等但没有广播功能。
import tensorflow as tf;
import numpy as np;
input1 = tf.constant([1.0, 2.0, 3.0])
input2 = tf.Variable(tf.random_uniform([3]))
output = tf.add_n([input1, input2]) #注意输入是一个列表
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print (sess.run(input1 + input2))
print (sess.run(output))
输出:
[1.4135424 2.694611 3.2243743]
[1.4135424 2.694611 3.2243743]
4.tf.nn.bias_add(value,bias,name=None):
一个叫bias的向量加到一个叫value的矩阵上,是向量与矩阵的每一行进行相加,得到的结果和value矩阵大小相同。
a=tf.constant([[1,1],[2,2],[3,3]],dtype=tf.float32)
b=tf.constant([1,-1],dtype=tf.float32)
c=tf.constant([1],dtype=tf.float32)
with tf.Session() as sess:
print(‘bias_add:’)
print(sess.run(tf.nn.bias_add(a, b)))
#执行下面语句错误
#print(sess.run(tf.nn.bias_add(a, c)))
输出结果:
bias_add:
[[ 2. 0.]
[ 3. 1.]
[ 4. 2.]]
5.tf.add_to_collection(‘list_name’, element):将元素element添加到列表list_name中
tf.get_collection(‘list_name’):返回名称为list_name的列表
tf.add_n(list):将列表元素相加并返回
import tensorflow as tf
tf.add_to_collection(‘losses’, tf.constant(2.2))
tf.add_to_collection(‘losses’, tf.constant(3.))
with tf.Session() as sess:
print(sess.run(tf.get_collection(‘losses’)))
print(sess.run(tf.add_n(tf.get_collection(‘losses’))
结果:
[2.2,3.0]
5.2
6.tf.argmax( input,axis=None, name=None,dimension=None, output_type=tf.int64)
tf.argmax就是返回最大的那个数值所在的下标。dimension:按某维度查找。
dimension=0:按列查找;dimension=1:按行查找
test=np.array([[2,1,3],[2,3,4],[5,4,3],[8,7,2]])
with tf.Session() as sess:
# 0为按列查找、1为按行查找
print(sess.run(tf.argmax(test,0)))
print(sess.run(tf.argmax(test,1)))
输出:
一 矩阵操作
1 tf.zeros(shape, dtype=tf.float32, name=None)
创建一个所有的参数为0的tensor对象
shape: 用于表示维度
name: 一个该操作的别名(可选的).
f1=tf.zeros([2,2,3])
f2=tf.zeros([8])
with tf.Session() as sess:
print(sess.run(f1))
print(sess.run(f2))
输出:
[[[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]]]
[0. 0. 0. 0. 0. 0. 0. 0.]
2 tf.fill(shape,value,name=None)
创建一个形状大小为shape的tensor,其初始值为value
print(sess.run(tf.fill([1,2],8)))
输出:[[8,8]]
3 tf.constant(value,dtype=None,shape=None,name=’Const’)
创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list。
如果是一个数,那么这个常亮中所有值的按该数来赋值。
如果是list,那么len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分,则全部存入value的最后一个值。
a=tf.constant(2,shape=[1,2])
b=tf.constant([1,2,3],shape=[7])
c=tf.constant([1,2,3],shape=[3,2])
输出:
[[2 2]]
[1 2 3 3 3 3 3]
[[1 2]
[3 3]
[3 3]]
二 张量变换
1.tf.shape(Tensor)
Returns the shape of a tensor.返回张量的形状。
2.tf.expand_dims(Tensor, dim)
实现使input在第axis位置增加一个维度。
‘t’ is a tensor of shape [2]
shape(expand_dims(t, 0)) ==> [1, 2]
shape(expand_dims(t, 1)) ==> [2, 1]
shape(expand_dims(t, -1)) ==> [2, 1]
‘t2’ is a tensor of shape [2, 3, 5]
shape(expand_dims(t2, 0)) ==> [1, 2, 3, 5]
shape(expand_dims(t2, 2)) ==> [2, 3, 1, 5]
shape(expand_dims(t2, 3)) ==> [2, 3, 5, 1]
a=[[1,2],[3,4]]
with tf.Session() as sess:
print(sess.run(tf.expand_dims(a,0)))
print(sess.run(tf.expand_dims(a,1)))
print(sess.run(tf.expand_dims(a,2)))
输出:
[[[1 2]
[3 4]]]
[[[1 2]]
[[3 4]]]
[[[1]
[2]]
[[3]
[4]]]
3 tf.concat(concat_dim, values, name=”concat”)
将张量沿着指定维数拼接起来。
t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat(0, [t1, t2]) == > [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
如果concat_dim是1,那么在某一个shape的第二个维度上连
t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat(1, [t1, t2]) ==> [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]
4 tf.random_shuffle( value,seed=None,name=None)
随机地将张量沿第一维随机排。
print(sess.run(tf.random_shuffle([[1,2,3],[1,3,4],[3,5,6]])))
输出:
[[3 5 6]
[1 2 3]
[1 3 4]]
5 cast(x, dtype, name=None)
将x的数据格式转化成dtype.例如,原来x的数据格式是bool, 那么将其转化成float以后,就能够将其转化成0和1的序列。反之也可以
a = tf.Variable([1,0,0,1,1])
b = tf.cast(a,dtype=tf.bool)
sess = tf.Session()
sess.run(tf.initialize_all_variables())
print(sess.run(b))
#[ True False False True True]
6 tf.reshape(tensor, shape, name=None)
如果 shape=[-1], 表示要将tensor展开成一个list
如果 shape=[a,b,c,…] 其中每个a,b,c,…均>0,那么就是常规用法
如果 shape=[a,-1,c,…] 此时b=-1,a,c,…依然>0。这表示tf会根据tensor的原尺寸,自动计算b的值。
7 tf.transpose(a, perm = None, name = ‘transpose’)
a是一个张量(Tensor),实际上就是一个数组。perm是a置换的维度,name是操作的名称,最后返回一个转置的张量。
x = [[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[21,22,23,24],[25,26,27,28],[29,30,31,32]]]
print(sess.run(tf.shape(x)))#2,3,4
print(sess.run(tf.transpose(x,[0,1,2])))
print(sess.run(tf.transpose(x,[0,2,1])))
print(sess.run(tf.transpose(x,[1,0,2])))
print(sess.run(tf.transpose(x,[2,1,0])))
8 tf.shape(input,name=None)
返回数据的元素数量
Tensor变量的保存读取
tensorflow使用Saver类进行变量的保存和读取,系统的变量将被保存到checkpoints中,point其本质是tensorflow使用二进制保存的变量名到变量值的map映射文件。新建Saver类
首先,保存和恢复都需要实例化一个 tf.train.Saver。
saver = tf.train.Saver()
然后,在训练循环中,定期调用 saver.save() 方法,向文件夹中写入包含了当前模型中所有可训练变量的 checkpoint 文件。
saver.save(sess, FLAGS.train_dir, global_step=step)
之后,就可以使用 saver.restore() 方法,重载模型的参数,继续训练或用于测试数据。
saver.restore(sess, FLAGS.train_dir)
示例
下面代码是简单的保存和读取模型:(不包括加载图数据)
import os
#用numpy产生数据
x_data = np.linspace(-1,1,300)[:, np.newaxis] #转置
noise = np.random.normal(0,0.05, x_data.shape)
y_data = np.square(x_data)-0.5+noise
#输入层
x_ph = tf.placeholder(tf.float32, [None, 1])
y_ph = tf.placeholder(tf.float32, [None, 1])
#隐藏层
w1 = tf.Variable(tf.random_normal([1,10]))
b1 = tf.Variable(tf.zeros([1,10])+0.1)
wx_plus_b1 = tf.matmul(x_ph, w1) + b1
hidden = tf.nn.relu(wx_plus_b1)
#输出层
w2 = tf.Variable(tf.random_normal([10,1]))
b2 = tf.Variable(tf.zeros([1,1])+0.1)
wx_plus_b2 = tf.matmul(hidden, w2) + b2
y = wx_plus_b2
#损失
loss = tf.reduce_mean(tf.reduce_sum(tf.square(y_ph-y),reduction_indices=[1]))
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#保存模型对象saver
saver = tf.train.Saver()
#判断模型保存路径是否存在,不存在就创建
if not os.path.exists(‘tmp/’):
os.mkdir(‘tmp/’)
#初始化
with tf.Session() as sess:
if os.path.exists(‘tmp/checkpoint’): #判断模型是否存在
saver.restore(sess, ‘tmp/model.ckpt’) #存在就从模型中恢复变量
else:
init = tf.global_variables_initializer() #不存在就初始化变量
sess.run(init)
for i in range(1000):
_,loss_value = sess.run([train_op,loss], feed_dict={x_ph:x_data, y_ph:y_data})
if(i%50==0):
save_path = saver.save(sess, ‘tmp/model.ckpt’)
print(“迭代次数:%d , 训练损失:%s”%(i, loss_value))
注:
saver 的操作必须在 sess 建立后进行。
model.ckpt 必须存在给定文件夹中,‘tmp/model.ckpt’ 这里至少要有一层文件夹,否则无法保存。
恢复模型时同保存时一样,是 ‘tmp/model.ckpt’,和那3个文件名都不一样。
三 神经网络的相关操作
1 tf. embedding_lookup(params, ids, partition_strategy=”mod”, name=None,
validate_indices=True)
根据input_ids中的id,寻找embedding中的对应元素。比如,input_ids=[1,3,5],则找出embedding中下标为1,3,5的向量组成一个矩阵返回。
2 tf.trainable_variables()
返回所有可训练的变量。
在创造变量(tf.Variable, tf.get_variable 等操作)时,都会有一个trainable的选项,表示该变量是否可训练。这个函数会返回图中所有trainable=True的变量。
tf.get_variable(…), tf.Variable(…)的默认选项是True, 而 tf.constant(…)只能是False
3 tf.gradients(ys,xs,grad_ys=None,name=“gradients”,colocate_gradients_with_ops=False,
gate_gradients=False,
tf.gradients()实现ys对xs求导
求导返回值是一个list,list的长度等于len(xs)
假设返回值是[grad1, grad2, grad3],ys=[y1, y2],xs=[x1, x2, x3]。则,真实的计算过程为:
4 tf.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
keep_prob是一个(0,1]之间的值.
import tensorflow as tf
sess = tf.InteractiveSession()
a = tf.get_variable(‘a’,shape=[2,5])
b = a
a_drop = tf.nn.dropout(a,0.8)
sess.run(tf.initialize_all_variables())
print(sess.run(b))
print(sess.run(a_drop))
输出:
[[-0.7702647 -0.25544274 -0.2750864 -0.784728 0.00266004]
[ 0.01889515 0.6698439 -0.45455995 -0.9099788 0.60836756]]
[[-0.96283084 -0.31930342 -0.343858 -0.98091 0. ]
[ 0.02361894 0.8373049 -0.56819993 -1.1374735 0.7604594 ]]
四 普通操作
1 tf.linspace(start,stop,num,name=None) tf.range(start,limit=None,delta=1,name=’range’)
这两个放到一起说,是因为他们都用于产生等差数列,不过具体用法不太一样。
tf.linspace在[start,stop]范围内产生num个数的等差数列。不过注意,start和stop要用浮点数表示,不然会报错
tf.range在[start,limit)范围内以步进值delta产生等差数列。注意是不包括limit在内的。
import tensorflow as tf
sess=tf.InteractiveSession()
a=tf.linspace(start=1.0,stop=5.0,num=5)
b=tf.range(start=1,limit=5,delta=1)
print(sess.run(a))
print(sess.run(b))
结果:
[1. 2. 3. 4. 5.]
[1 2 3 4]
2.assign(ref, value, validate_shape=None, use_locking=None, name=None)
a=tf.Variable(0.0)
b=tf.placeholder(dtype=tf.float32,shape=[])
op=tf.assign(a,b)
sess.run(tf.initialize_all_variables())
print(sess.run(a))
sess.run(op,feed_dict={b:5.})
print(sess.run(a))
输出:
0.0
5.0
- tf.app.flags:命令行解析
支持接受命令行传递参数,相当于接受argv。
#第一个是参数名称,第二个参数是默认值,第三个是参数描述
tf.app.flags.DEFINE_string(‘str_name’, ‘def_v_1’,“descrip1”)
tf.app.flags.DEFINE_integer(‘int_name’, 10,“descript2”)
tf.app.flags.DEFINE_boolean(‘bool_name’, False, “descript3”)
FLAGS = tf.app.flags.FLAGS
#必须带参数,否则:‘TypeError: main() takes no arguments (1 given)’; main的参数名随意定义,无要求
def main(_):
print(FLAGS.str_name)
print(FLAGS.int_name)
print(FLAGS.bool_name)
if name == ‘main’:
tf.app.run() #执行main函数
4.reduce_mean(input_tensor,axis=None,keepdims=None,name=None,reduction_indices=None,keep_dims=None)
参数名 必选 类型 说明
input_tensor 是 张量 输入待求平均值的张量
axis 否 None、0、1 None:全局求平均值;0:求每一列平均值;1:求每一行平均值
keep_dims 否 Boolean 保留原来的维度(例如不会从二维矩阵降为一维向量)
name 否 string 运算名称
reduction_indices 否 None 和 axis 等价,被弃用
initial = [[[1.,1.],[2.,2.]],[[3.,4.],[4.,4.]]]
x = tf.Variable(initial,dtype=tf.float32)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(x))
print(sess.run(tf.reduce_mean(x,axis=0))) //0表示第一维度
print(sess.run(tf.reduce_mean(x,axis=1)))//1表示第二维度
print(sess.run(tf.reduce_mean(x,axis=2)//2表示第三维度
输出:
[[[1. 1.]
[2. 2.]]
[[3. 4.]
[4. 4.]]]
[[2. 2.5]
[3. 3. ]]
[[1.5 1.5]
[3.5 4. ]]
[[1. 2. ]
[3.5 4. ]]
5 tf.convert_to_tensor(value, dtype=None, name=None, preferred_dtype=None)
将python的数据类型转换成TensorFlow可用的tensor数据类型
6