大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文实例讲述了Python使用循环神经网络解决文本分类问题的方法。分享给大家供大家参考,具体如下:
丰润ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!循环神经网络(Recurrent Neural Network, RNN)是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神经网络。
卷积网络的输入只有输入数据X,而循环神经网络除了输入数据X之外,每一步的输出会作为下一步的输入,如此循环,并且每一次采用相同的激活函数和参数。在每次循环中,x0乘以系数U得到s0,再经过系数W输入到下一次,以此循环构成循环神经网络的正向传播。
在反向传播中要求损失函数E对参数W的导数,通过链式求导法则可以得到右下的公式
循环神经网络与卷积神经网络作比较,卷积神经网络是一个输出经过网络产生一个输出。而循环神经网络可以实现一个输入多个输出(生成图片描述)、多个输入一个输出(文本分类)、多输入多输出(机器翻译、视频解说)。
RNN使用的是tan激活函数,输出在-1到1之间,容易梯度消失。距离输出较远的步骤对于梯度贡献很小。
将底层的输出作为高层的输入就构成了多层的RNN网络,而且高层之间也可以进行传递,并且可以采用残差连接防止过拟合。
RNN的每次传播之间只有一个参数W,用这一个参数很难描述大量的、复杂的信息需求,为了解决这个问题引入了长短期记忆网络(Long Short Term Memory,LSTM)。这个网络可以进行选择性机制,选择性的输入、输出需要使用的信息以及选择性地遗忘不需要的信息。选择性机制的实现是通过Sigmoid门实现的,sigmoid函数的输出介于0到1之间,0代表遗忘,1代表记忆,0.5代表记忆50%
LSTM网络结构如下图所示,
如上右图所示为本轮运算的隐含状态state,当前状态由上一状态和遗忘门结果作点积,再加上传入们结果得到
如下左图所示为遗忘门结构,上一轮的输出ht-1和数据xt在经过遗忘门选择是否遗忘之后,产生遗忘结果ft
如下中图所示为传入门结构,ht-1和xt在经过遗忘门的结果it和tanh的结果Ct作点积运算得到本次运算的输入
如下右图所示为输出门结构,ht-1和xt经过遗忘门的结果ot与当状态作点积产生本次的输出
如下实现LSTM网络,首先定义_generate_params函数用于生成每个门所需的参数,调用该函数定义输入门、输出门、遗忘门、和中间状态tanh的参数。每个门的参数都是三个,输入x、h的权重和偏置值。
接着开始进行LSTM的每轮循环计算,输入门计算就是将输入embedded_input矩阵乘以输入门参数x_in,再加上h和对应参数相乘的结果,最后再加上偏置值b_in经过sigmoid便得到输入门结果。
同理进行矩阵相乘加偏置操作得到遗忘门、输出门的结果。中间态tanh与三个门的操作类似,只不过最后经过tanh函数。
将上一个隐含态state乘以遗忘门加上输入门乘以中间态的结果就得到当前的隐含态state
将当前的state经过tanh函数再加上输出门就得到本轮的输出h
经过多轮输入循环得到的就是LSTM网络的最后输出。
# 实现LSTM网络 # 生成Cell网格所需参数 def _generate_paramas(x_size, h_size, b_size): x_w = tf.get_variable('x_weight', x_size) h_w = tf.get_variable('h_weight', h_size) bias = tf.get_variable('bias', b_size, initializer=tf.constant_initializer(0.0)) return x_w, h_w, bias scale = 1.0 / math.sqrt(embedding_size + lstm_nodes[-1]) / 3.0 lstm_init = tf.random_uniform_initializer(-scale, scale) with tf.variable_scope('lstm_nn', initializer=lstm_init): # 输入门参数 with tf.variable_scope('input'): x_in, h_in, b_in = _generate_paramas( x_size=[embedding_size, lstm_nodes[0]], h_size=[lstm_nodes[0], lstm_nodes[0]], b_size=[1, lstm_nodes[0]] ) # 输出门参数 with tf.variable_scope('output'): x_out, h_out, b_out = _generate_paramas( x_size=[embedding_size, lstm_nodes[0]], h_size=[lstm_nodes[0], lstm_nodes[0]], b_size=[1, lstm_nodes[0]] ) # 遗忘门参数 with tf.variable_scope('forget'): x_f, h_f, b_f = _generate_paramas( x_size=[embedding_size, lstm_nodes[0]], h_size=[lstm_nodes[0], lstm_nodes[0]], b_size=[1, lstm_nodes[0]] ) # 中间状态参数 with tf.variable_scope('mid_state'): x_m, h_m, b_m = _generate_paramas( x_size=[embedding_size, lstm_nodes[0]], h_size=[lstm_nodes[0], lstm_nodes[0]], b_size=[1, lstm_nodes[0]] ) # 两个初始化状态,隐含状态state和初始输入h state = tf.Variable(tf.zeros([batch_size, lstm_nodes[0]]), trainable=False) h = tf.Variable(tf.zeros([batch_size, lstm_nodes[0]]), trainable=False) # 遍历LSTM每轮循环,即每个词的输入过程 for i in range(max_words): # 取出每轮输入,三维数组embedd_inputs的第二维代表训练的轮数 embedded_input = embedded_inputs[:, i, :] # 将取出的结果reshape为二维 embedded_input = tf.reshape(embedded_input, [batch_size, embedding_size]) # 遗忘门计算 forget_gate = tf.sigmoid(tf.matmul(embedded_input, x_f) + tf.matmul(h, h_f) + b_f) # 输入门计算 input_gate = tf.sigmoid(tf.matmul(embedded_input, x_in) + tf.matmul(h, h_in) + b_in) # 输出门 output_gate = tf.sigmoid(tf.matmul(embedded_input, x_out) + tf.matmul(h, h_out) + b_out) # 中间状态 mid_state = tf.tanh(tf.matmul(embedded_input, x_m) + tf.matmul(h, h_m) + b_m) # 计算隐含状态state和输入h state = state * forget_gate + input_gate * mid_state h = output_gate + tf.tanh(state) # 最后遍历的结果就是LSTM的输出 last_output = h
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。