NLP实践八-----RNN

RNN的结构

RNN的出现主要是为了解决序列信息的,比如nlp句子单词的顺序对句子的影响很大,普通的神经网络无法处理类似的问题。
下图表示循环神经网络的基本结构:
在这里插入图片描述
描述当前状态的循环递归公式如下:
h_t = f(h_{t-1},x_t)
这里h_t是t时刻的状态, h_{t-1}是前一时刻的状态,x_t是当前的输入。我们有的是前一时刻的状态而不是前一时刻的输入, 因为输入神经元将前一时刻的输入转换为前一时刻的状态。所以每一个连续的输入被称为时间步。
考虑循环神经网络的最简单形式,激活函数是tanh,权重是W_{hh},输入神经元的权重是W_{xh},我们可以写出t时刻的状态公式如下
h_t = tanh(W_{hh}h_{t-1}+W_{xh}x_{t})
一旦得到了当前状态,我们可以计算输出了。

在这里插入图片描述
这篇文章详细介绍了流程:
https://zhuanlan.zhihu.com/p/32755043
这篇文章详细介绍了RNN,通俗易懂:
https://zybuluo.com/hanbingtao/note/541458

api:参考:https://blog.csdn.net/fendouaini/article/details/80096717
recurrent模块中的RNN模型包括RNN、LSTM、GRU等模型(后两个模型将在后面Keras系列文章讲解):

1.RNN:全连接RNN模型

SimpleRNN(units,activation=’tanh’,dropout=0.0,recurrent_dropout=0.0, return_sequences=False)

2.LSTM:长短记忆模型

LSTM(units,activation=’tanh’,dropout=0.0,recurrent_dropout=0.0,return_sequences=False)

3.GRU:门限循环单元

GRU(units,activation=’tanh’,dropout=0.0,recurrent_dropout=0.0,return_sequences=False)

4.参数说明:

units: RNN输出的维度

activation: 激活函数,默认为tanh

dropout: 0~1之间的浮点数,控制输入线性变换的神经元失活的比例

recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元失活比例

return_sequences: True返回整个序列,用于stack两个层,False返回输出序列的最后一个输出,若模型为深层模型时设为True

input_dim: 当使用该层为模型首层时,应指定该值

input_length: 当输入序列的长度固定时,该参数为输入序列的长度。当需要在该层后连接Flatten层,然后又要连接Dense层时,需要指定该参数

keras py:

def create_model():
    model=Sequential()

    model.add(Embedding(len(embedding_matrix),  # 表示文本数据中词汇的取值可能数,从语料库之中保留多少个单词。 因为Keras需要预留一个全零层, 所以+1
                        vector_size,  # 嵌入单词的向量空间的大小。它为每个单词定义了这个层的输出向量的大小
                        weights=[embedding_matrix],
                        # 构建一个[num_words, EMBEDDING_DIM]的矩阵,然后遍历word_index,将word在W2V模型之中对应vector复制过来。换个方式说:embedding_matrix 是原始W2V的子集,排列顺序按照Tokenizer在fit之后的词顺序。作为权重喂给Embedding Layer
                        input_length=maxlen,  # 输入序列的长度,也就是一次输入带有的词汇个数
                        trainable=True  # 我们设置 trainable = False,代表词向量不作为参数进行更新
                        ))
    # model.add(Bidirectional(LSTM(50), merge_mode='concat'))
    model.add(layers.SimpleRNN(units=100, #表示输出的维度,比如只输出最后一个结果他是多少维的,也是权重矩阵的大小
                               return_sequences=False,    #表示是不是需要全部输出,比如有128个输入序列,true那么就输出128个向量,每个向量的unit是100个
                               ))
    model.add(Dropout(0.5))
    model.add(layers.Dense(3,activation='softmax'))
    model.summary()
    model.compile(loss='categorical_crossentropy',optimizer='adam')

    model.summary()

    return  model
model=create_model()

lstm

这篇文章很舒服:https://zybuluo.com/hanbingtao/note/541458

text-Rnn,参考杰哥

# coding=utf-8

from keras import Input, Model
from keras import backend as K
from keras.layers import Embedding, Dense, SimpleRNN, Lambda, Concatenate, Conv1D, GlobalMaxPooling1D
from keras.utils import plot_model
import matplotlib.pyplot as plt

class RCNN(object):
    def __init__(self, maxlen, max_features, embedding_dims,
                 class_num=1,
                 last_activation='sigmoid'):
        self.maxlen = maxlen
        self.max_features = max_features
        self.embedding_dims = embedding_dims
        self.class_num = class_num
        self.last_activation = last_activation
        self.mdoel=self.get_model()
    def get_model(self):
        input_current = Input((self.maxlen,))
        input_left = Input((self.maxlen,))
        input_right = Input((self.maxlen,))

        embedder = Embedding(self.max_features, self.embedding_dims, input_length=self.maxlen)
        embedding_current = embedder(input_current)
        embedding_left = embedder(input_left)
        embedding_right = embedder(input_right)

        x_left = SimpleRNN(128, return_sequences=True)(embedding_left)
        x_right = SimpleRNN(128, return_sequences=True, go_backwards=True)(embedding_right)
        x_right = Lambda(lambda x: K.reverse(x, axes=1))(x_right)
        x = Concatenate(axis=2)([x_left, embedding_current, x_right])

        x = Conv1D(64, kernel_size=1, activation='tanh')(x)
        x = GlobalMaxPooling1D()(x)

        output = Dense(self.class_num, activation=self.last_activation)(x)
        model = Model(inputs=[input_current, input_left, input_right], outputs=output)
        model.summary()

        # plot_model(model, to_file='lambda.png', show_shapes=True)
        # plt.figure(figsize=(21, 12))
        # im = plt.imread('lambda.png')
        # plt.imshow(im)
        return model

my_rcnn=RCNN(maxlen=100,max_features=5000,embedding_dims=200)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值