手把手教你用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 )

 

其他不变即可运行。

 

 

 

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