tensorflow 学习(1)

参考链接:https://blog.csdn.net/junjun150013652/article/details/81331448

  1. tf.layers.conv1d函数:tf.nn.conv1d(inputs,kernel,stride=1 ,padding='VALID'),其中inputs表示输入,例如[2,5,3]即表示batch_size为2(一个batch的大小为2,即一个batch有2个句子),每个句子中有5个单词,每个单词的维度是3维;kernel表示核函数,例如kernel=tf.constant(1,tf.float32,(2,3,4)),即表示slidding window大小是2(滑过2个单词,又可以称为kernel_size),3跟inputs的单词维度相同,4表示4个核(又可以称为filters);stride即步长;padding为填充方式。该函数具体计算如下:对于输入中的每个句子(输入一共有2个句子)有5个单词,每个单词有3维,在应用核函数时,窗口大小为2,即每次滑过2个单词,且窗口的宽度和单词的维度一样,这样每次计算会得到1个值,等所有窗口滑动完毕,会得到5-2+1=4个这样的值,如果padding=”SAME”就会得到5个这样的值,因为有4个核,所以最终输出的就为[5,4],所以可以理解为,1个句子(5个单词,3dim/单词)在经过conv1之后,变为新的句子,这个句子仍然有5个单词,但每个单词的维度变为了4(filters)维。最终,因为1个batch有2个句子,所以最终的输出为[2,5,4]。
  2. tf.nn.dynamic_rnn函数:tf.nn.dynamic_rnn(basic_cell,inputs,dtype=tf.float32),其中basic_cell为1个rnn层(cell),例如basic_cell=tf.contrib.rnn.BasicRNNCell(num_units=6),num_units即表示隐藏层有6个单元;inputs表示输入,例如[3,5,3]表示这个batch里有3个句子,每个句子有5个单词,每个单词有3维,在应用rnn时,对于每个句子用rnn,每个单词看成1个time_step,例如word0([dim0,dim1,dim2])先进行计算,由于隐藏层有6个单元(维度应为[3,6],3对应输入的维度,6是隐藏层单元个数),所以state计算出的结果维度应该是[1,6],即从原来的3维变为了6维,同理output计算出也是有6维;接着计算word1,此时把word0的state合并到word1,输入变为了9维(原来的3维+隐藏层的6维),隐藏层应为[9,6],计算出的state和output是6维,如此一直计算到最后一个单词。最后该函数的输出有两个,第一个是outputs,outputs输出的是最后一层网络(该例子中只有1层网络basic_cell)的每一time_step的output,所以维度应该是[5,6],因为有5个time_step,每个time_step输出6个数,加上batch_size即有3个句子,所以最终输出维度为[3,5,6];另一个输出states,states输出的是每一层网络( 该例子中只有1层网络basic_cell )的最后一个time_step的state,所以维度应该是[1,6],1表示只有最后一个time_step,6表示这个time_step输出的state有6个数,加上batch_size,最终维度[3,6]。另外,对于每个句子而言,states的那一条数据(6个数),与outputs的最后那一条数据(6个数)相同。
  3. tf.nn.dynamic_rnn函数:tf.nn.dynamic_rnn(multi_layer_cell,inputs,dtype=tf.float32),其中multi_layer申明多个rnn层,例如tf.contrib.rnn.MultiRNNCell([tf.contrib.rnn.BasicRNNCell(num_units=6) for layer in range(4)]),循环4次,表示有4个rnn网络层,每个层的隐藏单元为6个;该函数输入有两个,第一个是outputs,outputs输出的是最后一层网络的每一time_step的output,只有最后一层的输出才被保留下来,且保留的每一步的输出,所以对于每个句子来说维度是[5,6],5表示有5个step(5个单词),6表示隐藏层单元数,由于有3个句子,所以最终维度是[3,5,6];第二个输出是states,states输出的是每一层网络的最后一个time_step的state,所以对于每一层网络的每个句子来说维度是[1,6], 1表示只有最后一个time_step , 6表示隐藏层单元数 ,由于每一层网络有3个句子,所以维度是[3,6],最后输出4个这样的[3,6],因为总共有4层这样的网络。同样,对于输出的最后1层的states,对于每个句子的state,和outputs的每个句子的最后一条数据相同。
  4. 如果把上述的 BasicRNNCell 换成 BasicLSTMCell ,输出的outputs还是一样[3,5,6];输出的states,仍然也会输出4层网络的每个states,但每个states(每层网络)又输出了两个结果,1个是h,1个是c,这两个组成了1个tuple,其中h和c也都是最后一个step的state(h和上述state类似),维度依然是[3,6],3表示3个句子,6表示最后1个step输出的6个数。

发表评论

电子邮件地址不会被公开。 必填项已用*标注