深度学习 实验七 循环神经网络
深度学习 实验七 循环神经网络
一、问题描述
之前见过的所以神经网络(比如全连接网络和卷积神经网络)都有一个主要特点,那就是它们都没有记忆。它们单独处理每个输入,在输入和输入之间没有保存任何状态。对于这样的网络,要想处理数据点的序列或者时间序列,你需要向网络同时展示整个序列,即将序列转换成单个数据点。例如,在实验九词嵌入中就是这么做的:将全部电影评论转换为一个大向量,然后一次性处理。
与此相反,当人在阅读这个句子时,是一个词一个词地阅读(或者说,眼睛一次扫视一次扫视地阅读),同时会记住之前的内容,这让你能够动态理解这个句子所传达的含义,以渐进的方式处理信息,同时保存一个关于所处理的内部模型,这就是循环神经网络,它广泛应用于自然语言处理中,本实验会介绍简单的循环神经网络(SimpleRNN)来处理文本数据,然后改进网络使用LSTM神经网络对比效果。
二、设计简要描述
1. 简单循环神经网络
1.1 循环网络简介
了解循环网络的应用基础知识。
1.2 Keras中的循环层
实现一个简单的RNN层
1.3 数据处理
使用IMDB电影评论的数据,引入一个sequence模块把我们的数据格式化输入到神经网络中。
1.4 搭建自己RNN神经网络
按照如下步骤搭建自己的神经网络并应用上面数据拟合模型
1)从kaeras导入全连接层模块
2)定义一个序列模型
3) 添加一个Embedding层,参数是(max_features,32)
4)添加一个SimpleRNN层,输出维度32
5)添加一个全连接层,输出维度1,激活函数‘sigmoid’
6)编译模型,参数分别是‘rmsprop’,’binary_crossentropy’,[‘acc’]
7)拟合模型,epochs=10.batch_size=128,validation_split=0.2,结果返回给history
1.5 绘制结果
绘制训练损失和准确率率结果。
1.6 模型评估
利用测试数据对模型进行评估。
2. LSTM循环神经网络
2.1 SimpleRNN的缺陷
了解SimpleRNN存在梯度消失的情况,可能导致后续模型无法继续训练。
2.2 LSTM分析
2.3 搭建自己的LSTM神经网络
类似1.4节按照以下步骤搭建自己的LSTM神经网络。
1)从kaeras导入LSTM模块
2)定义一个序列模型
3)添加一个Embedding层,参数是(max_features,32)
4)添加一个LSTM层,输出维度32
5)添加一个全连接层,输出维度1,激活函数‘sigmoid’
6) 编译模型,参数分别是‘rmsprop’,’binary_crossentropy’,[‘acc’]
7)拟合模型,epochs=10.batch_size=128,validation_split=0.2,结果返回给history
2.4 绘制结果
参考1.5节绘制损失值和准确率的结果图。
2.5 模型评估
利用测试数据对模型进行评估。
三、程序清单
# test7_循环神经网络
# 1. 简单循环神经网络
# 1.1 循环网络简介
# 1.2 Keras中的循环层
# 实现一个简单的RNN层
from keras.models import Sequential
from keras.layers import Embedding, SimpleRNN
model = Sequential()
model.add(Embedding(10000, 32))
model.add(SimpleRNN(32))
model.summary()
# 1.3 数据处理
from keras.datasets import imdb
from keras.preprocessing import sequence
max_features = 10000 # 作为特征的单词个数
maxlen = 500
batch_size = 32
# 加载数据
print('Loading data...')
(input_train, y_train), (input_test, y_test) = imdb.load_data(path='F:\Desktop\data\imdb.npz', num_words=max_features)
print(len(input_train), 'train sequences')
print(len(input_test), 'test sequences')
print('Pad sequences (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)
# 1.4 搭建自己RNN神经网络
# 按照如下步骤搭建自己的神经网络并应用上面数据拟合模型
# 1)从kaeras导入全连接层模块
# 2)定义一个序列模型
# 3) 添加一个Embedding层,参数是(max_features,32)
# 4)添加一个SimpleRNN层,输出维度32
# 5)添加一个全连接层,输出维度1,激活函数‘sigmoid’
# 6)编译模型,参数分别是‘rmsprop’,’binary_crossentropy’,[‘acc’]
# 7)拟合模型,epochs=10.batch_size=128,validation_split=0.2,结果返回给history
from keras.layers import Dense, Activation
model = Sequential()
model.add(Embedding(max_features, 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)
# 1.5 绘制结果
# 能够通过以下代码绘制训练损失和准确率率结果
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
# 1.6 RNN 模型评估
result = model.evaluate(input_test, y_test, verbose = 1)
print('Test loss:', result[0])
print('Test accuracy:', result[1])
# 2 LSTM循环神经网络
# 2.1 SimpleRNN的缺陷
# 2.2 LSTM分析
# 2.3 搭建自己的LSTM神经网络
# 类似1.4节完成以下步骤
# 1)从kaeras导入LSTM模块
# 2)定义一个序列模型
# 3)添加一个Embedding层,参数是(max_features,32)
# 4)添加一个LSTM层,输出维度32
# 5)添加一个全连接层,输出维度1,激活函数‘sigmoid’
# 6) 编译模型,参数分别是‘rmsprop’,’binary_crossentropy’,[‘acc’]
# 7)拟合模型,epochs=10.batch_size=128,validation_split=0.2,结果返回给history
from keras.layers import LSTM
model2 = Sequential()
model2.add(Embedding(max_features, 32))
model2.add(LSTM(32))
model2.add(Dense(1, activation='sigmoid'))
model2.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
history2 = model2.fit(input_train, y_train, epochs=10, batch_size=128, validation_split=0.2)
# 2.4 绘制结果
# 参考1.5节绘制损失值和准确率的结果图
import matplotlib.pyplot as plt
acc2 = history2.history['acc']
val_acc2 = history2.history['val_acc']
loss2 = history2.history['loss']
val_loss2 = history2.history['val_loss']
epochs2 = range(len(acc2))
plt.plot(epochs2, acc2, 'bo', label='Training acc')
plt.plot(epochs2, val_acc2, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs2, loss2, 'bo', label='Training loss')
plt.plot(epochs2, val_loss2, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
# 2.5 LSTM 模型评估
result2 = model2.evaluate(input_test, y_test, verbose = 1)
print('Test loss:', result2[0])
print('Test accuracy:', result2[1])
)
plt.title('Training and validation loss')
plt.legend()
plt.show()
# 2.5 LSTM 模型评估
result2 = model2.evaluate(input_test, y_test, verbose = 1)
print('Test loss:', result2[0])
print('Test accuracy:', result2[1])
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)