手把手教你用tensorflow做無人駕駛(一)

這個是產生大小爲28*50的-1到1的隨機數矩陣,這個embedding_mat是變量使用tf.Variable定義的,在TensorFlow的世界裏,變量的定義和初始化是分開,想要將所有圖變量進行集體初始化時應該使用tf.global_variables_initializer()來初始化,所有關於圖變量的賦值和計算都要通過tf.Session的run來進行。例子如下:

import tensorflow as tf

embedding_mat = tf.Variable(tf.random_uniform([28, 50], -1.0, 1.0))

init = tf.global_variables_initializer() 
sess = tf.Session()
sess.run(init)
print(sess.run(embedding_mat))
結果如下:

[[-0.28999138 -0.89063025 -0.53005743 ... -0.21293116  0.17569208
  -0.49357986]
 [-0.13630486 -0.06847024 -0.1787672  ... -0.02485919  0.9444761
  -0.21548676]
 [-0.7792654  -0.29399395  0.56092715 ... -0.570184    0.92120004
  -0.01252437]
 ...
 [ 0.505883   -0.7356241   0.3370185  ... -0.44900942  0.97224617
   0.9670849 ]
 [-0.4778483  -0.83293223  0.16388988 ...  0.71593    -0.6501541
  -0.41705775]
 [-0.43561053 -0.72736335 -0.8437331  ... -0.63710856 -0.5947027
  -0.9728706 ]]

tf.nn.embedding_lookup()就是根據input_ids中的id,尋找embeddings中的第id行。比如input_ids=[[1,]](這裏input_ids要形成tensor輸入),則找出embeddings中第1行,組成一個tensor返回(注意這裏id是從0開始的)

這裏給出實現代碼:

import tensorflow as tf

embedding_mat = tf.Variable(tf.random_uniform([28, 50], -1.0, 1.0))

init = tf.global_variables_initializer() 
sess = tf.Session()
sess.run(init)
print(sess.run(embedding_mat))

embedding_output = tf.nn.embedding_lookup(embedding_mat, [[1],])

print(sess.run(embedding_output))

結果如下(下面打印的紅色分別爲產生的矩陣和取出的值):

runfile('C:/Users/Administrator/.spyder-py3/test1.py', wdir='C:/Users/Administrator/.spyder-py3')
[[ 0.09468484  0.21017933 -0.5078914  ... -0.99645734  0.4235959
   0.3151269 ]
 [-0.05570436  0.0933578   0.58186054 ...  0.38702822 -0.66522455
  -0.21032286]

 [-0.29665446  0.07252526 -0.53744316 ... -0.49391198 -0.32773995
  -0.32102275]
 ...
 [-0.5773246   0.50100374  0.798954   ...  0.8509965  -0.17081666
   0.89630723]
 [-0.64160204 -0.3395064  -0.6311643  ...  0.7009659  -0.05782723
  -0.11574173]
 [ 0.9919708  -0.5621853  -0.5501683  ... -0.65263677 -0.9236493
   0.18898034]]
[[[-0.05570436  0.0933578   0.58186054 -0.02265882  0.25062823
   -0.55472803 -0.3525803  -0.05058599  0.37107253  0.10033774
   -0.57551885 -0.3781984   0.03305674  0.36790657 -0.1221261
    0.4061048   0.3712871   0.94106627  0.17322421  0.30369544
    0.5829427   0.88231325 -0.19283533  0.2840705   0.18300271
    0.08452225  0.6294427  -0.06361699 -0.62062454  0.9073806
   -0.75310254  0.13877153 -0.72597384 -0.49205494  0.31700873
   -0.97345734 -0.44780898  0.42801166 -0.7046077  -0.38708687
   -0.4781475   0.09007287 -0.9314563  -0.22054768  0.35259342
    0.29922676 -0.6265378   0.38702822 -0.66522455 -0.21032286]]]

這裏由於版本不同,BasicRNNCell的調用方式不同,cell=tf.contrib.rnn.BasicRNNCell(num_units = rnn_size)中rnn_size爲隱藏層的個數。

if tf.__version__[0]>='1':
    cell=tf.contrib.rnn.BasicRNNCell(num_units = rnn_size)
else:
    cell = tf.nn.rnn_cell.BasicRNNCell(num_units = rnn_size)

output, state = tf.nn.dynamic_rnn(cell, embedding_output, dtype=tf.float32)
output = tf.nn.dropout(output, dropout_keep_prob)

embedding_output可以看作爲這個向量裏面有多少個句子*句子長度*每個句子中單詞的詞向量維度

其中,vocabulary_size是輸入文本中的詞彙個數,embedding_size是詞向量嵌入矩陣的維度,是超參數之一,一般取128,也是詞向量的大小,其具體數值可以由我們自己定奪,當然他的值也會影響整個實驗的效果。

如果運行程序一次,然後又要運行一次,清理變量可以在程序中用以下語句:

tf.reset_default_graph()

(2)tensorflow 中構建LSTM網絡可以通過tf.nn.rnn_cell.LSTMCell(num_units=128,state_is_tuple=True)

import tensorflow as tf

batch_size=40

embedding_dim=300

sequence_length=[40]

X=np.random.randn(1,25,640)

inputs=tf.Variable(tf.random_normal([batch_size,embedding_dim]))

previous_state=(tf.Variable(tf.random_normal([batch_size,128])),tf.Variable(tf.random_normal([batch_size,128])))

cell=tf.nn.rnn_cell.LSTMCell(num_units=128,state_is_tuple=True)  

outputs,state=cell(inputs,previous_state)

sess=tf.Session()

sess.run(tf.global_variables_initializer())

print("state_c",sess.run(state.c))

這裏通過tf.nn.rnn_cell.LSTMCell構建一個SLTM的基本單元,構建完單個LSTM基本單元后,可以給單元賦值outputs,state=cell(inputs,previous_state),由於outputs與state的值爲張量,所以需要調用sess來運行顯示outputs的值。

這裏也可以通過tf.nn.dynamic_rnn()來輸入值:

把上面程序這句話outputs,state=cell(inputs,previous_state)換成

outputs,state=tf.nn.dynamix_rnn(cell=cell,

                                                   dtype=tf.float64,

                                                      sequence_length=  sequence_length,

                                                       input= X )

 

其他不變即可運行。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章