Python深度学习读书笔记(八)(RNN&LSTM和双向LSTM优化IMDB)

循环神经网络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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值