循环神经网络RNN:遍历所有序列元素,并保存一个状态,其中包含已查看和内容相关的信息。实际上是一类具有内部环的神经网络。重复使用前一次迭代的计算结果。
前馈网络:将所有待处理数据转换为一个大向量,然后一次性处理。
SimpleRNN能够像其他Keras层一样处理序列批量。可以在两种模式下运行:1.返回每个时间步连续输出的完整序列(batch_size,timesteps,output_features)的三维张量;2.只返回每个输入序列的最终输出(batch_size,output_features)的二维张量, 模式由return_sequences控制(True:1;False:2)
由于存在梯度消失问题,SimpleRNN无法学到长期依赖。SimpleRNN过于简化,没有实用价值。
#RNN循环神经网络处理IMDB评论分类
from keras.datasets import imdb
from keras.preprocessing import sequence
#作为特征的单词个数
max_feature=10000
#500个单词后截断文本
maxlen=500
batch_size=32
(input_train,y_train),(input_test,y_test)=imdb.load_data(num_words=max_feature)
print(len(input_train),'train sequences')
print(len(input_test),'test sequence')
print('Pad sequence(samples x time)')
input_train=sequence.pad_sequences(input_train,maxlen=maxlen)
input_test=sequence.pad_sequences(input_test,maxlen=maxlen)
print('input_train shape:',input_train.shape)
print('input_test shape',input_test.shape)
#使用Embedding层和SimpleRNN训练模型
from keras.layers import Dense
from keras.models import Sequential
from keras.layers import Embedding,SimpleRNN
model=Sequential()
model.add(Embedding(max_feature,32))
model.add(SimpleRNN(32))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
history=model.fit(input_train,y_train,epochs=10,batch_size=128,validation_split=0.2)
#keras中LSTM实例
#可以直接调用,无需调参,使用keras默认值
#LSTM优势:自然语言处理,问答及机器翻译
from keras.layers import LSTM
model=Sequential()
model.add(Embedding(max_feature,32))
model.add(LSTM(32))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
history=model.fit(input_train,y_train,epochs=10,batch_size=128,validation_split=0.2)
双向RNN:结合时间正序和时间逆序,沿两个方向处理序列,可以捕捉被单向RNN忽略的模式。
机器学习中,如果一种数据表示不同但有用,那么总是值得加以利用,提供了查看数据的全新角度,抓住了忽略的内容,提高模型在任务上的性能
#使用逆序序列训练并评估一个LSTM
from keras.datasets import imdb
from keras.preprocessing import sequence
from keras import layers
from keras.models import Sequential
max_features=10000
maxlen=500
(x_train,y_train),(x_test,y_test)=imdb.load_data(num_words=max_features)
#序列反转
x_train=[x[::-1]for x in x_train]
x_test=[x[::-1]for x in x_train]
#填充序列
x_train=sequence.pad_sequences(x_train,maxlen=maxlen)
x_test=sequence.pad_sequences(x_test,maxlen=maxlen)
model=Sequential()
model.add(layers.Embedding(max_features,128))
model.add(layers.LSTM(32))
model.add(layers.Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
history=model.fit(x_train,y_train,epochs=3,batch_size=128,validation_split=0.2)
#----------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------
#训练并评估一个双向LSTM
model=Sequential()
model.add(layers.Embedding(max_features,32))
model.add(layers.Bidirectional(layers.LSTM(32)))
model.add(layers.Dense(1,activation='sigmoid'))
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
history=model.fit(x_train,y_train,epochs=3,batch_size=128,validation_split=0.2)
#----------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------
#训练一个双向GRU
from keras.models import Sequential
from keras import layers
from keras.optimizers import RMSprop
model=Sequential()
model.add(layers.Bidirectional(layers.GRU(32),input_shape=(None,float_data.shape[-1])))
model.add(layers.Dense(1))
model.compile(optimizers=RMSprop(),loss='mae')
history=model.fit_generator(train_gen,steps_per_epochs=500,epochs=40,validation_data=val_gen,validation_steps=val_steps)