1.矩陣操作
1.1矩陣生成
這部分主要將如何生成矩陣,包括全0矩陣,全1矩陣,隨機數矩陣,常數矩陣等
sess=tf.InteractiveSession() #x=tf.ones([2,3],tf.int32) x=tf.zeros([2,3],tf.int32) print (sess.run(x))
新建一個與給定的tensor類型大小一致的tensor,使其所有元素為0和1
sess=tf.InteractiveSession() tensor=[[1,2,3],[4,5,6]] #x=tf.ones_like(tensor) x=tf.zeros_like(tensor) print (sess.run(x))
創建一個形狀大小為shape的tensor,初始值為value
sess=tf.InteractiveSession() x=tf.fill([2,3],2) print (sess.run(x))
創建一個常量tensor,按照給出value來賦值,可以用shape來指定其形狀。value可以是一個數,也可以是一個list。
如果是一個數,那么這個常量中所有值的按該數來賦值。
如果是list,那么len(value)一定要小於等於shape展開后的長度。賦值時,先將value中的值逐個存入。不夠的部分,則全部存入value的最后一個值。
sess=tf.InteractiveSession() #x=tf.constant(2,shape=[2,3]) x=tf.constant([2,3],shape=[2,3]) print (sess.run(x))
random_normal:正態分布隨機數,均值是mean,標准差是stddev
truncated_normal:截斷正態分布隨機數,均值是mean,標准差是stddev,只保留[mean-2*stddev,mean+2*stddev]范圍內的隨機數
random_uniform:均勻分布隨機數,范圍為[minval,maxval]
sess=tf.InteractiveSession() x=tf.random_normal(shape=[1,5],mean=0.0,stddev=1.0,dtype=tf.float32) print (sess.run(x))
tf.get_variable(name, shape=None, dtype=dtypes.float32, initializer=None, regularizer=None, trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, custom_getter=None):
如果在該命名域中之前已經有名字=name的變量,則調用那個變量;如果沒有,則根據輸入的參數重新創建一個名字為name的變量。
initializer為初始化工具,有tf.zero_initializer,tf.ones_initializer,tf.constant_initializer,tf.random_uniform_initializer,tf.random_normal_initializer,tf.truncated_normal_initializer
1.2 矩陣變換
tf.shape(Tensor)
返回張量的形狀。但是注意,tf.shape函數本身也是返回一個張量。而在tf中,張量是需要用sess.run(Tensor)
來得到具體的值的。
sess=tf.InteractiveSession() x=[[1,2,3],[4,5,6]] shape=tf.shape(x) print (shape) print (sess.run(shape)) Tensor("Shape:0", shape=(2,), dtype=int32) [2 3]
tf.expand_dims(Tensor,dim)
為張量增加一個維度
sess=tf.InteractiveSession() x=[1,2,3] y=tf.expand_dims(x,1) print (sess.run(y)) [[1] [2] [3]] #y=tf.expand_dims(x,0) [[1,2,3]]
tf.pack()
將一個R維張量列表沿着axis軸組合成一個R+1維的張量。
x=[1,4] y=[2,5] z=[3,6] t=tf.stack([x,y,z],1) print (sess.run(t)) [[1 2 3] [4 5 6]]
tf.concat(concat_dim,values)將張量沿着指定的維數拼接起來。
tf.sparse_to_dense()將稀疏矩陣轉化為密集矩陣
def sparse_to_dense(sparse_indices, output_shape, sparse_values, default_value=0, validate_indices=True, name=None):
sparse_indices: 元素的坐標[[0,0],[1,2]] 表示(0,0),和(1,2)處有值
output_shape: 得到的密集矩陣的shape
sparse_values: sparse_indices坐標表示的點的值,可以是0D或者1D張量。若0D,則所有稀疏值都一樣。若是1D,則len(sparse_values)應該等於len(sparse_indices)
default_values: 缺省點的默認值
tf.random_shuffle(value)
沿着value的第一維進行隨機重新排列。
tf.argmax|tf.argmin(input=tensor,dimension=axis)
找到給定的張量tensor在指定軸axis上的最大值/最小值的位置。
tf.equal(x,y)
判斷兩個tensor是否每個元素都相等。
tf.cast(x,dtype)
將x的數據格式轉化為dtype。
tf.matmul(a,b,transpose_a=False,transpose_b=False,a_is_parse=False,b_is_sparse=False)
如果對應的transpose項為True,例如transpose_a=True,那么a在參與運算之前就會先轉置一下。
而如果a_is_sparse=True,那么a會被當做稀疏矩陣來參與運算。
tf.reshape(tensor,shape)
如果shape=[-1],表示將tensor展開成一個list。
2. 神經網絡相關操作
tf.nn.embedding_lookup(params,ids)
簡單來說,就是講一個數字序列ids轉化成embedding序列表示。
tf.trainable_variables()
返回所有可以訓練的變量。
tf.gradients(ys,xs)
ys和xs都可以是一個tensor或者tensor列表。而計算完成以后,該函數會返回一個長為len(xs)的tensor列表,列表中的每個tensor是ys中每個值對xs[i]求導之和。
tf.clip_by_global_norm(t_list,clip_norm)
修正梯度值,用於控制梯度爆炸的問題。梯度爆炸和梯度彌散的原因一樣,都是因為鏈式法則求導的關系,導致梯度的指數級衰減。為了避免梯度爆炸,需要對梯度進行修剪。
t_list為待修剪的張量,clip_norm表示修剪比例,函數返回兩個參數:list_clipped,修剪后的張量,以及global_norm,一個中間計算量。
list_clipped[i]=t_list[i] * clip_norm / max(global_norm, clip_norm),其中
global_norm = sqrt(sum([l2norm(t)**2 for t in t_list]))
tf.nn.dropout(x,keep_prob)
按照概率將x中的一些元素置0,並將其他的值放大。x是一個張量,而keep_prob是一個(0,1]之間的值。x中的各個元素清零的概率互相獨立,為1-keep_prob,而沒有清零的元素,則會統一乘以1/keep_prob, 目的是為了保持x的整體期望值不變。
3.普通操作
tf.linspace|tf.range
tf.linspace(start,stop,num)
在[start,stop]的范圍內產生num個數的等差數列,start和stop要用浮點數進行表示。
tf.range(start,limit=None,delta=1) 在[start,limit)范圍內以步進值delta產生等差數列。
tf.assign(ref,value)
用來更新模型中變量的值,ref是待賦值的變量,value是更新的值。
4.規范化
tf.variable_scope
為變量添加命名域
with tf.variable_scope("foo"):
tf.get_variable_scope()返回當前變量的命名域。