久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

? tensorflow筆記 :常用函數(shù)說明 墨跡js

 雪柳花明 2017-04-11

tensorflow筆記系列:
(一) tensorflow筆記:流程,,概念和簡(jiǎn)單代碼注釋
(二) tensorflow筆記:多層CNN代碼分析
(三) tensorflow筆記:多層LSTM代碼分析
(四) tensorflow筆記:常用函數(shù)說明

本文章內(nèi)容比較繁雜,,主要是一些比較常用的函數(shù)的用法,,結(jié)合了網(wǎng)上的資料和源碼,還有我自己寫的示例代碼,。建議照著目錄來看,。

1.矩陣操作

1.1矩陣生成

這部分主要將如何生成矩陣,包括全0矩陣,,全1矩陣,,隨機(jī)數(shù)矩陣,常數(shù)矩陣等

tf.ones | tf.zeros

tf.ones(shape,type=tf.float32,name=None)
tf.zeros([2, 3], int32)
用法類似,,都是產(chǎn)生尺寸為shape的張量(tensor)

sess = tf.InteractiveSession()
x = tf.ones([2, 3], int32)
print(sess.run(x))
#[[1 1 1],
# [1 1 1]]

tf.ones_like | tf.zeros_like

tf.ones_like(tensor,dype=None,name=None)
tf.zeros_like(tensor,dype=None,name=None)
新建一個(gè)與給定的tensor類型大小一致的tensor,,其所有元素為1和0

tensor=[[1, 2, 3], [4, 5, 6]] 
x = tf.ones_like(tensor) 
print(sess.run(x))
#[[1 1 1],
# [1 1 1]]

tf.fill

tf.fill(shape,value,name=None)
創(chuàng)建一個(gè)形狀大小為shape的tensor,其初始值為value

print(sess.run(tf.fill([2,3],2)))
#[[2 2 2],
# [2 2 2]]

tf.constant

tf.constant(value,dtype=None,shape=None,name=’Const’)
創(chuàng)建一個(gè)常量tensor,,按照給出value來賦值,,可以用shape來指定其形狀。value可以是一個(gè)數(shù),,也可以是一個(gè)list,。
如果是一個(gè)數(shù),,那么這個(gè)常亮中所有值的按該數(shù)來賦值。
如果是list,那么len(value)一定要小于等于shape展開后的長(zhǎng)度,。賦值時(shí),,先將value中的值逐個(gè)存入。不夠的部分,,則全部存入value的最后一個(gè)值,。

a = tf.constant(2,shape=[2])
b = tf.constant(2,shape=[2,2])
c = tf.constant([1,2,3],shape=[6])
d = tf.constant([1,2,3],shape=[3,2])

sess = tf.InteractiveSession()
print(sess.run(a))
#[2 2]
print(sess.run(b))
#[[2 2]
# [2 2]]
print(sess.run(c))
#[1 2 3 3 3 3]
print(sess.run(d))
#[[1 2]
# [3 3]
# [3 3]]

tf.random_normal | tf.truncated_normal | tf.random_uniform

tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.random_uniform(shape,minval=0,maxval=None,dtype=tf.float32,seed=None,name=None)
這幾個(gè)都是用于生成隨機(jī)數(shù)tensor的。尺寸是shape
random_normal: 正太分布隨機(jī)數(shù),,均值mean,標(biāo)準(zhǔn)差stddev
truncated_normal:截?cái)嗾龖B(tài)分布隨機(jī)數(shù),,均值mean,標(biāo)準(zhǔn)差stddev,不過只保留[mean-2*stddev,mean+2*stddev]范圍內(nèi)的隨機(jī)數(shù)
random_uniform:均勻分布隨機(jī)數(shù),范圍為[minval,maxval]

sess = tf.InteractiveSession()
x = tf.random_normal(shape=[1,5],mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)
print(sess.run(x))
#===>[[-0.36128798  0.58550537 -0.88363433 -0.2677258   1.05080092]]

tf.get_variable

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):

如果在該命名域中之前已經(jīng)有名字=name的變量,,則調(diào)用那個(gè)變量,;如果沒有,則根據(jù)輸入的參數(shù)重新創(chuàng)建一個(gè)名字為name的變量,。在眾多的輸入?yún)?shù)中,,有幾個(gè)是我已經(jīng)比較了解的,下面來一一講一下

name: 這個(gè)不用說了,,變量的名字
shape: 變量的形狀,,[]表示一個(gè)數(shù),[3]表示長(zhǎng)為3的向量,,[2,3]表示矩陣或者張量(tensor)
dtype: 變量的數(shù)據(jù)格式,,主要有tf.int32, tf.float32, tf.float64等等
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

tf.shape(Tensor)
Returns the shape of a tensor.返回張量的形狀,。但是注意,,tf.shape函數(shù)本身也是返回一個(gè)張量。而在tf中,,張量是需要用sess.run(Tensor)來得到具體的值的,。

labels = [1,2,3]
shape = tf.shape(labels)
print(shape)
sess = tf.InteractiveSession()
print(sess.run(shape))
# >>>Tensor("Shape:0", shape=(1,), dtype=int32)
# >>>[3]

tf.expand_dims

tf.expand_dims(Tensor, dim)
為張量+1維。官網(wǎng)的例子:’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]

sess = tf.InteractiveSession()
labels = [1,2,3]
x = tf.expand_dims(labels, 0)
print(sess.run(x))
x = tf.expand_dims(labels, 1)
print(sess.run(x))
#>>>[[1 2 3]]
#>>>[[1]
#    [2]
#    [3]]

tf.pack

tf.pack(values, axis=0, name=”pack”)
Packs a list of rank-R tensors into one rank-(R+1) tensor
將一個(gè)R維張量列表沿著axis軸組合成一個(gè)R+1維的張量,。

  # 'x' is [1, 4]
  # 'y' is [2, 5]
  # 'z' is [3, 6]
  pack([x, y, z]) => [[1, 4], [2, 5], [3, 6]]  # Pack along first dim.
  pack([x, y, z], axis=1) => [[1, 2, 3], [4, 5, 6]]

tf.concat

tf.concat(concat_dim, values, name=”concat”)
Concatenates tensors along one dimension.
將張量沿著指定維數(shù)拼接起來,。個(gè)人感覺跟前面的pack用法類似

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]]
tf.concat(1, [t1, t2]) 
#==> [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]

tf.sparse_to_dense

稀疏矩陣轉(zhuǎn)密集矩陣
定義為:

def sparse_to_dense(sparse_indices,
                    output_shape,
                    sparse_values,
                    default_value=0,
                    validate_indices=True,
                    name=None):

幾個(gè)參數(shù)的含義:
sparse_indices: 元素的坐標(biāo)[[0,0],[1,2]] 表示(0,0),和(1,2)處有值
output_shape: 得到的密集矩陣的shape
sparse_values: sparse_indices坐標(biāo)表示的點(diǎn)的值,,可以是0D或者1D張量,。若0D,則所有稀疏值都一樣,。若是1D,,則len(sparse_values)應(yīng)該等于len(sparse_indices)
default_values: 缺省點(diǎn)的默認(rèn)值

tf.random_shuffle

tf.random_shuffle(value,seed=None,name=None)
沿著value的第一維進(jìn)行隨機(jī)重新排列

sess = tf.InteractiveSession()
a=[[1,2],[3,4],[5,6]]
x = tf.random_shuffle(a)
print(sess.run(x))
#===>[[3 4],[5 6],[1 2]]

tf.argmax | tf.argmin

tf.argmax(input=tensor,dimention=axis)
找到給定的張量tensor中在指定軸axis上的最大值/最小值的位置。

a=tf.get_variable(name='a',
                  shape=[3,4],
                  dtype=tf.float32,
                  initializer=tf.random_uniform_initializer(minval=-1,maxval=1))
b=tf.argmax(input=a,dimension=0)
c=tf.argmax(input=a,dimension=1)
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
print(sess.run(a))
#[[ 0.04261756 -0.34297419 -0.87816691 -0.15430689]
# [ 0.18663144  0.86972666 -0.06103253  0.38307118]
# [ 0.84588599 -0.45432305 -0.39736366  0.38526249]]
print(sess.run(b))
#[2 1 1 2]
print(sess.run(c))
#[0 1 0]

tf.equal

tf.equal(x, y, name=None):
判斷兩個(gè)tensor是否每個(gè)元素都相等。返回一個(gè)格式為bool的tensor

tf.cast

cast(x, dtype, name=None)
將x的數(shù)據(jù)格式轉(zhuǎn)化成dtype.例如,,原來x的數(shù)據(jù)格式是bool,,那么將其轉(zhuǎn)化成float以后,就能夠?qū)⑵滢D(zhuǎn)化成0和1的序列,。反之也可以

a = tf.Variable([1,0,0,1,1])
b = tf.cast(a,dtype=tf.bool)
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
print(sess.run(b))
#[ True False False  True  True]

tf.matmul

用來做矩陣乘法,。若a為l*m的矩陣,b為m*n的矩陣,,那么通過tf.matmul(a,b) 結(jié)果就會(huì)得到一個(gè)l*n的矩陣
不過這個(gè)函數(shù)還提供了很多額外的功能,。我們來看下函數(shù)的定義:

matmul(a, b,
           transpose_a=False, transpose_b=False,
           a_is_sparse=False, b_is_sparse=False,
           name=None):

可以看到還提供了transpose和is_sparse的選項(xiàng)。
如果對(duì)應(yīng)的transpose項(xiàng)為True,,例如transpose_a=True,那么a在參與運(yùn)算之前就會(huì)先轉(zhuǎn)置一下,。
而如果a_is_sparse=True,那么a會(huì)被當(dāng)做稀疏矩陣來參與運(yùn)算。

tf.reshape

reshape(tensor, shape, name=None)
顧名思義,,就是將tensor按照新的shape重新排列,。一般來說,shape有三種用法:
如果 shape=[-1], 表示要將tensor展開成一個(gè)list
如果 shape=[a,b,c,…] 其中每個(gè)a,b,c,..均>0,,那么就是常規(guī)用法
如果 shape=[a,-1,c,…] 此時(shí)b=-1,,a,c,..依然>0。這表示tf會(huì)根據(jù)tensor的原尺寸,,自動(dòng)計(jì)算b的值,。
官方給的例子已經(jīng)很詳細(xì)了,我就不寫示例代碼了

# tensor 't' is [1, 2, 3, 4, 5, 6, 7, 8, 9]
# tensor 't' has shape [9]
reshape(t, [3, 3]) ==> [[1, 2, 3],
                        [4, 5, 6],
                        [7, 8, 9]]

# tensor 't' is [[[1, 1], [2, 2]],
#                [[3, 3], [4, 4]]]
# tensor 't' has shape [2, 2, 2]
reshape(t, [2, 4]) ==> [[1, 1, 2, 2],
                        [3, 3, 4, 4]]

# tensor 't' is [[[1, 1, 1],
#                 [2, 2, 2]],
#                [[3, 3, 3],
#                 [4, 4, 4]],
#                [[5, 5, 5],
#                 [6, 6, 6]]]
# tensor 't' has shape [3, 2, 3]
# pass '[-1]' to flatten 't'
reshape(t, [-1]) ==> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]

# -1 can also be used to infer the shape
# -1 is inferred to be 9:
reshape(t, [2, -1]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],
                         [4, 4, 4, 5, 5, 5, 6, 6, 6]]

# -1 is inferred to be 2:
reshape(t, [-1, 9]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],
                         [4, 4, 4, 5, 5, 5, 6, 6, 6]]

# -1 is inferred to be 3:
reshape(t, [ 2, -1, 3]) ==> [[[1, 1, 1],
                              [2, 2, 2],
                              [3, 3, 3]],
                             [[4, 4, 4],
                              [5, 5, 5],
                              [6, 6, 6]]]

2. 神經(jīng)網(wǎng)絡(luò)相關(guān)操作

tf.nn.embedding_lookup

embedding_lookup(params, ids, partition_strategy=”mod”, name=None,
validate_indices=True):

簡(jiǎn)單的來講,,就是將一個(gè)數(shù)字序列ids轉(zhuǎn)化成embedding序列表示,。
假設(shè)params.shape=[v,h], ids.shape=[m], 那么該函數(shù)會(huì)返回一個(gè)shape=[m,h]的張量。用數(shù)學(xué)來表示,,就是

ids=[i1,i2,…,im]params=???????w11,w21,?,wh1w12,w22,?,wh2?w1v,w2v,?,whv???????res=???????w1i1,w2i1,…,whi1w1i2,w2i2,…,whi2?w1im,w2im,…,whim???????

那么這個(gè)有什么用呢,?如果你了解word2vec的話,就知道我們可以根據(jù)文檔來對(duì)每個(gè)單詞生成向量,。單詞向量可以進(jìn)一步用來測(cè)量單詞的相似度等等,。那么假設(shè)我們現(xiàn)在已經(jīng)獲得了每個(gè)單詞的向量,都存在param中,。那么根據(jù)單詞id序列ids,就可以通過embedding_lookup來獲得embedding表示的序列。

tf.trainable_variables

返回所有可訓(xùn)練的變量,。
在創(chuàng)造變量(tf.Variable, tf.get_variable 等操作)時(shí),,都會(huì)有一個(gè)trainable的選項(xiàng),表示該變量是否可訓(xùn)練,。這個(gè)函數(shù)會(huì)返回圖中所有trainable=True的變量,。
tf.get_variable(…), tf.Variable(…)的默認(rèn)選項(xiàng)是True, 而 tf.constant(…)只能是False

import tensorflow as tf
from pprint import pprint

a = tf.get_variable('a',shape=[5,2])    # 默認(rèn) trainable=True
b = tf.get_variable('b',shape=[2,5],trainable=False)
c = tf.constant([1,2,3],dtype=tf.int32,shape=[8],name='c') # 因?yàn)槭浅A浚詔rainable=False
d = tf.Variable(tf.random_uniform(shape=[3,3]),name='d')
tvar = tf.trainable_variables()
tvar_name = [x.name for x in tvar]
print(tvar)
# [<tensorflow.python.ops.variables.Variable object at 0x7f9c8db8ca20>, <tensorflow.python.ops.variables.Variable object at 0x7f9c8db8c9b0>]
print(tvar_name)
# ['a:0', 'd:0']

sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
pprint(sess.run(tvar))
#[array([[ 0.27307487, -0.66074866],
#       [ 0.56380701,  0.62759042],
#       [ 0.50012994,  0.42331111],
#       [ 0.29258847, -0.09185416],
#       [-0.35913971,  0.3228929 ]], dtype=float32),
# array([[ 0.85308731,  0.73948073,  0.63190091],
#       [ 0.5821209 ,  0.74533939,  0.69830012],
#       [ 0.61058474,  0.76497936,  0.10329771]], dtype=float32)]

tf.gradients

用來計(jì)算導(dǎo)數(shù)。該函數(shù)的定義如下所示

def gradients(ys,
              xs,
              grad_ys=None,
              name="gradients",
              colocate_gradients_with_ops=False,
              gate_gradients=False,
              aggregation_method=None):

雖然可選參數(shù)很多,,但是最常使用的還是ys和xs,。根據(jù)說明得知,ys和xs都可以是一個(gè)tensor或者tensor列表,。而計(jì)算完成以后,,該函數(shù)會(huì)返回一個(gè)長(zhǎng)為len(xs)的tensor列表,列表中的每個(gè)tensor是ys中每個(gè)值對(duì)xs[i]求導(dǎo)之和,。如果用數(shù)學(xué)公式表示的話,,那么 g = tf.gradients(y,x)可以表示成

gi=∑j=0len(y)?yj?xig=[g0,g1,...,glen(x)]

tf.clip_by_global_norm

修正梯度值,用于控制梯度爆炸的問題,。梯度爆炸和梯度彌散的原因一樣,,都是因?yàn)殒準(zhǔn)椒▌t求導(dǎo)的關(guān)系,導(dǎo)致梯度的指數(shù)級(jí)衰減,。為了避免梯度爆炸,,需要對(duì)梯度進(jìn)行修剪。
先來看這個(gè)函數(shù)的定義:

def clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None):

輸入?yún)?shù)中:t_list為待修剪的張量, clip_norm 表示修剪比例(clipping ratio).

函數(shù)返回2個(gè)參數(shù): list_clipped,,修剪后的張量,,以及global_norm,一個(gè)中間計(jì)算量,。當(dāng)然如果你之前已經(jīng)計(jì)算出了global_norm值,,你可以在use_norm選項(xiàng)直接指定global_norm的值。

那么具體如何計(jì)算呢,?根據(jù)源碼中的說明,,可以得到
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]))

如果你更熟悉數(shù)學(xué)公式,則可以寫作

Lic=Lit?Ncmax(Nc,Ng)Ng=∑i(Lit)2 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄√

其中,,
LicLig代表t_list[i]和list_clipped[i],,
NcNg代表clip_norm 和 global_norm的值。
其實(shí)也可以看到其實(shí)Ng就是t_list的L2模,。上式也可以進(jìn)一步寫作

Lic={Lit,(Ng<=Nc)Lit?NcNg,(Ng>Nc)Ng=∑i(Lit)2 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄√

也就是說,,當(dāng)t_list的L2模大于指定的Nc時(shí),就會(huì)對(duì)t_list做等比例縮放

tf.nn.dropout

dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
按概率來將x中的一些元素值置零,,并將其他的值放大,。用于進(jìn)行dropout操作,一定程度上可以防止過擬合
x是一個(gè)張量,,而keep_prob是一個(gè)(0,1]之間的值,。x中的各個(gè)元素清零的概率互相獨(dú)立,為1-keep_prob,而沒有清零的元素,,則會(huì)統(tǒng)一乘以1/keep_prob, 目的是為了保持x的整體期望值不變,。

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))
#[[ 0.28667903 -0.66874665 -1.14635754  0.88610041 -0.55590457]
# [-0.29704338 -0.01958954  0.80359757  0.75945008  0.74934876]]
print(sess.run(a_drop))
#[[ 0.35834879 -0.83593333 -1.43294692  1.10762548 -0.        ]
# [-0.37130421 -0.          0.          0.94931257  0.93668592]]

3.普通操作

tf.linspace | tf.range

tf.linspace(start,stop,num,name=None)
tf.range(start,limit=None,delta=1,name=’range’)
這兩個(gè)放到一起說,,是因?yàn)樗麄兌加糜诋a(chǎn)生等差數(shù)列,不過具體用法不太一樣,。
tf.linspace在[start,stop]范圍內(nèi)產(chǎn)生num個(gè)數(shù)的等差數(shù)列,。不過注意,start和stop要用浮點(diǎn)數(shù)表示,,不然會(huì)報(bào)錯(cuò)
tf.range在[start,limit)范圍內(nèi)以步進(jìn)值delta產(chǎn)生等差數(shù)列,。注意是不包括limit在內(nèi)的。

sess = tf.InteractiveSession()
x = tf.linspace(start=1.0,stop=5.0,num=5,name=None)  # 注意1.0和5.0
y = tf.range(start=1,limit=5,delta=1)
print(sess.run(x))
print(sess.run(y))
#===>[ 1.  2.  3.  4.  5.]
#===>[1 2 3 4]

tf.assign

assign(ref, value, validate_shape=None, use_locking=None, name=None)
tf.assign是用來更新模型中變量的值的,。ref是待賦值的變量,,value是要更新的值。即效果等同于 ref = value
簡(jiǎn)單的實(shí)例代碼見下

sess = tf.InteractiveSession()

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))
# 0.0
sess.run(op,feed_dict={b:5.})
print(sess.run(a))
# 5.0

4.規(guī)范化

tf.variable_scope

簡(jiǎn)單的來講,,就是為變量添加命名域

  with tf.variable_scope("foo"):
      with tf.variable_scope("bar"):
          v = tf.get_variable("v", [1])
          assert v.name == "foo/bar/v:0"

函數(shù)的定義為

def variable_scope(name_or_scope, reuse=None, initializer=None,
                   regularizer=None, caching_device=None, partitioner=None,
                   custom_getter=None):

各變量的含義如下:
name_or_scope: string or VariableScope: the scope to open.
reuse: True or None; if True, we go into reuse mode for this scope as well as all sub-scopes; if None, we just inherit the parent scope reuse. 如果reuse=True, 那么就是使用之前定義過的name_scope和其中的變量,,
initializer: default initializer for variables within this scope.
regularizer: default regularizer for variables within this scope.
caching_device: default caching device for variables within this scope.
partitioner: default partitioner for variables within this scope.
custom_getter: default custom getter for variables within this scope.

tf.get_variable_scope

返回當(dāng)前變量的命名域,返回一個(gè)tensorflow.python.ops.variable_scope.VariableScope變量,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多