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

这篇文章详细介绍了流程:
https://zhuanlan.zhihu.com/p/32755043
这篇文章详细介绍了RNN,通俗易懂:
https://zybuluo.com/hanbingtao/note/541458
api:参考:https://blog.youkuaiyun.com/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)