这个是产生大小为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 )
其他不变即可运行。