tensorflow训练神经网络,tensorflow.python

  tensorflow训练神经网络,tensorflow.python

  本文主要介绍python机器学习tensorflow构建长短期记忆网络LSTM。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  LSTM简介1。RNN 2的梯度消失。LSTM的结构张量流中LSTM的相关函数TF . contrib . rnn . basiclstmcelltf . nn . dynamic _ rnn所有码

  

目录

  

LSTM简介

  在过去的时间里,我们研究了RNN递归神经网络,其结构图如下:

  最大的问题是,当w1、w2、w3的值小于0时,如果一个句子足够长,神经网络前后传播时梯度会消失。

  0.925=0.07.如果一个句子有20到30个单词,那么第一个单词的隐层输出传到末尾时会是原来的0.07倍,大大降低了最后一个单词的影响。

  具体情况如下:

  长期和短期记忆网络的出现解决了梯度消失的问题。

  

1、RNN的梯度消失问题

  原始RNN的隐藏层只有一个状态H,它是从头到尾传递的。对短期输入非常敏感。

  如果再加一个状态C来保存长期状态,问题就可以解决了。

  对于RNN和LSTM,它们的两个分步单位的比较如下。

  我们按照时间维度展开LSTM的结构:

  我们可以看到,在时间n,LSTM有三个输入:

  1.当前时刻网络的输入值;

  2.LSTM在最后时刻的产值;

  3.前一时刻的单元格状态。

  LSTM有两个输出:

  1.当前时刻的LSTM输出值;

  2.当前时刻的单元格状态。

  3.LSTM独特的门结构

  LSTM使用两个门来控制小区状态cn的内容:

  1.忘记gate,它决定了前一时刻的单元状态cn-1有多少保留给当前时刻;

  2.输入门,它决定了当前时刻有多少网络的输入C’n被保存到单元状态。

  LSTM使用一个门来控制当前输出值hn的内容:

  输出门,决定当前时刻单元状态cn有多少个输出。

  

2、LSTM的结构

  

tensorflow中LSTM的相关函数

  tf.contrib.rnn.BasicLSTMCell(

  数量_单位,

  忘记_偏差=1.0,

  状态_是_元组=真,

  激活=无,

  重用=无,

  name=无,

  dtype=无

  )

  num _ units:RNN单位的神经元数量,即输出神经元的数量。Forget_bias: Bias增加了遗忘门。从CudnnLSTM训练的检查点恢复时,必须手动将其设置为0.0。State_is_tuple:如果为True,则接受并返回的状态是c_state和m_state的2元组;如果为False,它们将沿列轴连接。True即将被弃用。激活:激活该功能。重用:描述是否在现有范围内重用变量。如果不为真,并且现有范围已经有了给定的变量,将会抛出一个错误。名称:层的名称。Dtype:这一层的数据类型。使用时,它可以定义为:

  >lstm_cell = tf.contrib.rnn.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)

  

  在定义完成后,可以进行状态初始化:

  

self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)

  

  

  

tf.nn.dynamic_rnn

  

tf.nn.dynamic_rnn(

   cell,

   inputs,

   sequence_length=None,

   initial_state=None,

   dtype=None,

   parallel_iterations=None,

   swap_memory=False,

   time_major=False,

   scope=None

  )

  

  

  • cell:上文所定义的lstm_cell。
  • inputs:RNN输入。如果time_major==false(默认),则必须是如下shape的tensor:[batch_size,max_time,…]或此类元素的嵌套元组。如果time_major==true,则必须是如下形状的tensor:[max_time,batch_size,…]或此类元素的嵌套元组。
  • sequence_length:Int32/Int64矢量大小。用于在超过批处理元素的序列长度时复制通过状态和零输出。因此,它更多的是为了性能而不是正确性。
  • initial_state:上文所定义的_init_state。
  • dtype:数据类型。
  • parallel_iterations:并行运行的迭代次数。那些不具有任何时间依赖性并且可以并行运行的操作将是。这个参数用时间来交换空间。值>>1使用更多的内存,但花费的时间更少,而较小的值使用更少的内存,但计算需要更长的时间。
  • time_major:输入和输出tensor的形状格式。如果为真,这些张量的形状必须是[max_time,batch_size,depth]。如果为假,这些张量的形状必须是[batch_size,max_time,depth]。使用time_major=true会更有效率,因为它可以避免在RNN计算的开始和结束时进行换位。但是,大多数TensorFlow数据都是批处理主数据,因此默认情况下,此函数为False。
  • scope:创建的子图的可变作用域;默认为RNN。

  在LSTM的最后,需要用该函数得出结果。

  

self.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(

   lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)

  

  返回的是一个元组 (outputs, state):

  outputs:LSTM的最后一层的输出,是一个tensor。如果为time_major== False,则它的shape为[batch_size,max_time,cell.output_size]。如果为time_major== True,则它的shape为[max_time,batch_size,cell.output_size]。

  states:states是一个tensor。state是最终的状态,也就是序列中最后一个cell输出的状态。一般情况下states的形状为 [batch_size, cell.output_size],但当输入的cell为BasicLSTMCell时,states的形状为[2,batch_size, cell.output_size ],其中2也对应着LSTM中的cell state和hidden state。

  整个LSTM的定义过程为:

  

 def add_input_layer(self,):

   #X最开始的形状为(256 batch,28 steps,28 inputs)

   #转化为(256 batch*28 steps,128 hidden)

   l_in_x = tf.reshape(self.xs, [-1, self.input_size], name=to_2D)

   #获取Ws和Bs

   Ws_in = self._weight_variable([self.input_size, self.cell_size])

   bs_in = self._bias_variable([self.cell_size])

   #转化为(256 batch*28 steps,256 hidden)

   with tf.name_scope(Wx_plus_b):

   l_in_y = tf.matmul(l_in_x, Ws_in) + bs_in

   # (batch * n_steps, cell_size) ==> (batch, n_steps, cell_size)

   # (256*28,256)->(256,28,256)

   self.l_in_y = tf.reshape(l_in_y, [-1, self.n_steps, self.cell_size], name=to_3D)

   def add_cell(self):

   #神经元个数

   lstm_cell = tf.contrib.rnn.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)

   #每一次传入的batch的大小

   with tf.name_scope(initial_state):

   self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)

   #不是主列

   self.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(

   lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)

   def add_output_layer(self):

   #设置Ws,Bs

   Ws_out = self._weight_variable([self.cell_size, self.output_size])

   bs_out = self._bias_variable([self.output_size])

   # shape = (batch,output_size)

   # (256,10)

   with tf.name_scope(Wx_plus_b):

   self.pred = tf.matmul(self.cell_final_state[-1], Ws_out) + bs_out

  

  

  

全部代码

  该例子为手写体识别例子,将手写体的28行分别作为每一个step的输入,输入维度均为28列。

  

import tensorflow as tf 

  from tensorflow.examples.tutorials.mnist import input_data

  import numpy as np

  mnist = input_data.read_data_sets("MNIST_data",one_hot = "true")

  BATCH_SIZE = 256 # 每一个batch的数据数量

  TIME_STEPS = 28 # 图像共28行,分为28个step进行传输

  INPUT_SIZE = 28 # 图像共28列

  OUTPUT_SIZE = 10 # 共10个输出

  CELL_SIZE = 256 # RNN 的 hidden unit size,隐含层神经元的个数

  LR = 1e-3 # learning rate,学习率

  def get_batch(): #获取训练的batch

   batch_xs,batch_ys = mnist.train.next_batch(BATCH_SIZE)

   batch_xs = batch_xs.reshape([BATCH_SIZE,TIME_STEPS,INPUT_SIZE])

   return [batch_xs,batch_ys]

  class LSTMRNN(object): #构建LSTM的类

   def __init__(self, n_steps, input_size, output_size, cell_size, batch_size):

   self.n_steps = n_steps

   self.input_size = input_size

   self.output_size = output_size

   self.cell_size = cell_size

   self.batch_size = batch_size

   #输入输出

   with tf.name_scope(inputs):

   self.xs = tf.placeholder(tf.float32, [None, n_steps, input_size], name=xs)

   self.ys = tf.placeholder(tf.float32, [None, output_size], name=ys)

   #直接加层

   with tf.variable_scope(in_hidden):

   self.add_input_layer()

   #增加LSTM的cell

   with tf.variable_scope(LSTM_cell):

   self.add_cell()

   #直接加层

   with tf.variable_scope(out_hidden):

   self.add_output_layer()

   #计算损失值

   with tf.name_scope(cost):

   self.compute_cost()

   #训练

   with tf.name_scope(train):

   self.train_op = tf.train.AdamOptimizer(LR).minimize(self.cost)

   #正确率计算

   self.correct_pre = tf.equal(tf.argmax(self.ys,1),tf.argmax(self.pred,1))

   self.accuracy = tf.reduce_mean(tf.cast(self.correct_pre,tf.float32))

   def add_input_layer(self,):

   #X最开始的形状为(256 batch,28 steps,28 inputs)

   #转化为(256 batch*28 steps,128 hidden)

   l_in_x = tf.reshape(self.xs, [-1, self.input_size], name=to_2D)

   #获取Ws和Bs

   Ws_in = self._weight_variable([self.input_size, self.cell_size])

   bs_in = self._bias_variable([self.cell_size])

   #转化为(256 batch*28 steps,256 hidden)

   with tf.name_scope(Wx_plus_b):

   l_in_y = tf.matmul(l_in_x, Ws_in) + bs_in

   # (batch * n_steps, cell_size) ==> (batch, n_steps, cell_size)

   # (256*28,256)->(256,28,256)

   self.l_in_y = tf.reshape(l_in_y, [-1, self.n_steps, self.cell_size], name=to_3D)

   def add_cell(self):

   #神经元个数

   lstm_cell = tf.contrib.rnn.BasicLSTMCell(self.cell_size, forget_bias=1.0, state_is_tuple=True)

   #每一次传入的batch的大小

   with tf.name_scope(initial_state):

   self.cell_init_state = lstm_cell.zero_state(self.batch_size, dtype=tf.float32)

   #不是主列

   self.cell_outputs, self.cell_final_state = tf.nn.dynamic_rnn(

   lstm_cell, self.l_in_y, initial_state=self.cell_init_state, time_major=False)

   def add_output_layer(self):

   #设置Ws,Bs

   Ws_out = self._weight_variable([self.cell_size, self.output_size])

   bs_out = self._bias_variable([self.output_size])

   # shape = (batch,output_size)

   # (256,10)

   with tf.name_scope(Wx_plus_b):

   self.pred = tf.matmul(self.cell_final_state[-1], Ws_out) + bs_out

   def compute_cost(self):

   self.cost = tf.reduce_mean(

   tf.nn.softmax_cross_entropy_with_logits(logits = self.pred,labels = self.ys)

   )

   def _weight_variable(self, shape, name=weights):

   initializer = np.random.normal(0.0,1.0 ,size=shape)

   return tf.Variable(initializer, name=name,dtype = tf.float32)

   def _bias_variable(self, shape, name=biases):

   initializer = np.ones(shape=shape)*0.1

   return tf.Variable(initializer, name=name,dtype = tf.float32)

  if __name__ == __main__:

   #搭建 LSTMRNN 模型

   model = LSTMRNN(TIME_STEPS, INPUT_SIZE, OUTPUT_SIZE, CELL_SIZE, BATCH_SIZE)

   sess = tf.Session()

   sess.run(tf.global_variables_initializer())

   #训练10000次

   for i in range(10000):

   xs, ys = get_batch() #提取 batch data

   if i == 0:

   #初始化data

   feed_dict = {

   model.xs: xs,

   model.ys: ys,

   }

   else:

   feed_dict = {

   model.xs: xs,

   model.ys: ys,

   model.cell_init_state: state #保持 state 的连续性

   }

   #训练

   _, cost, state, pred = sess.run(

   [model.train_op, model.cost, model.cell_final_state, model.pred],

   feed_dict=feed_dict)

   #打印精确度结果

   if i % 20 == 0:

   print(sess.run(model.accuracy,feed_dict = {

   model.xs: xs,

   model.ys: ys,

   model.cell_init_state: state #保持 state 的连续性

   }))

  

  以上就是python神经网络使用tensorflow构建长短时记忆LSTM的详细内容,更多关于tensorflow长短时记忆网络LSTM的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: