這個是產生大小爲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 )
其他不變即可運行。