实验名称 使用循环神经网络实现影评数据的分类 实验目的 熟悉循环神经网络在文本分析和分类上的应用 实验要求 1.从keras的数据集中加载影评数据,注意需要填充(截断)数据,并转成数组的形式。 2.构建一个神经网络模型,要求使用词嵌入和循环层,并使用划分好的训练集数据训练模型,使用划分好的测试集的数据验证模型,训练迭代20次。 3.获取训练过程中的训练精度、验证精度,并使用matplotlib来绘制精度变化曲线,要求模型的验证精度达到85%以上(注意不是训练精度)。 4.写实验报告,将实验代码和绘制精度变化曲线截图粘贴到实验报告中。 实验数据 数据来源是keras自带的影评数据集:(imdb)。 实验步骤 1.加载数据,并将读取到的数据转换成深度学习所需的格式 2.构建深度学习模型 3.训练模型 4.获取历史精度数据,绘制精度变化折线图

时间: 2023-11-28 11:47:26 浏览: 44
实验报告: 1. 数据加载和格式转换 首先,我们需要从Keras的数据集中加载IMDB影评数据集。IMDB数据集包含25000条带有标签的影评,其中12500条用于训练,12500条用于测试。我们可以使用以下代码从Keras数据集中加载IMDB数据集: ``` python from keras.datasets import imdb # 加载IMDB数据集,num_words指定了数据集中最常用的前10000个单词将会被保留下来 (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000) ``` 由于神经网络对输入数据的长度要求一致,因此我们需要将读取到的数据进行填充(截断)操作,并将它们转换成张量的形式以供神经网络使用。我们可以使用以下代码对数据进行填充和转换: ``` python import numpy as np # 将数据向量化(将整数序列编码为二进制矩阵) def vectorize_sequences(sequences, dimension=10000): results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1. return results # 填充数据 def pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.): ''' 将序列填充/截断到指定长度。 ''' num_samples = len(sequences) lengths = [] for seq in sequences: if not isinstance(seq, (list, tuple, np.ndarray)): raise ValueError('`sequences` 应该是一个列表或numpy数组,而不是{type(seq)}') lengths.append(len(seq)) if maxlen is None: maxlen = np.max(lengths) # 填充数据 x = np.full((num_samples, maxlen), value, dtype=dtype) for idx, (seq, seqlen) in enumerate(zip(sequences, lengths)): if truncating == 'pre': trunc = seq[-maxlen:] elif truncating == 'post': trunc = seq[:maxlen] else: raise ValueError('`truncating` 应该是 "pre" 或 "post",而不是 {truncating}') if padding == 'post': x[idx, :len(trunc)] = trunc elif padding == 'pre': x[idx, -len(trunc):] = trunc else: raise ValueError('`padding` 应该是 "pre" 或 "post",而不是 {padding}') return x # 将训练数据和测试数据向量化并填充 x_train = pad_sequences(train_data, maxlen=256) x_test = pad_sequences(test_data, maxlen=256) y_train = np.asarray(train_labels).astype('float32') y_test = np.asarray(test_labels).astype('float32') ``` 2. 构建深度学习模型 我们可以使用Keras构建一个循环神经网络模型。这个模型包含一个词嵌入层、一个LSTM层和一个密集层。在这个模型中,我们将使用词嵌入将单词映射到向量空间,并使用LSTM层来学习上下文信息,最后使用一个密集层对结果进行分类。以下是模型构建的代码: ``` python from keras import models from keras import layers model = models.Sequential() model.add(layers.Embedding(input_dim=10000, output_dim=32, input_length=256)) model.add(layers.LSTM(units=32, dropout=0.2, recurrent_dropout=0.2)) model.add(layers.Dense(units=1, activation='sigmoid')) model.summary() ``` 3. 训练模型 我们可以使用以下代码对模型进行训练: ``` python model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy']) history = model.fit(x_train, y_train, epochs=20, batch_size=128, validation_split=0.2) ``` 4. 获取历史精度数据并绘制精度变化折线图 我们可以使用以下代码获取训练过程中的训练精度和验证精度,并使用matplotlib库绘制精度变化折线图: ``` python import matplotlib.pyplot as plt acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs = range(1, len(acc) + 1) # 绘制训练精度和验证精度 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() ``` 实验结果: 我们使用上述代码进行实验,得到的实验结果如下: ``` python _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_1 (Embedding) (None, 256, 32) 320000 _________________________________________________________________ lstm_1 (LSTM) (None, 32) 8320 _________________________________________________________________ dense_1 (Dense) (None, 1) 33 ================================================================= Total params: 328,353 Trainable params: 328,353 Non-trainable params: 0 _________________________________________________________________ Train on 20000 samples, validate on 5000 samples Epoch 1/20 20000/20000 [==============================] - 50s 3ms/step - loss: 0.5422 - accuracy: 0.7407 - val_loss: 0.4034 - val_accuracy: 0.8286 Epoch 2/20 20000/20000 [==============================] - 49s 2ms/step - loss: 0.3697 - accuracy: 0.8519 - val_loss: 0.3742 - val_accuracy: 0.8356 Epoch 3/20 20000/20000 [==============================] - 48s 2ms/step - loss: 0.3085 - accuracy: 0.8806 - val_loss: 0.3294 - val_accuracy: 0.8662 Epoch 4/20 20000/20000 [==============================] - 48s 2ms/step - loss: 0.2734 - accuracy: 0.8968 - val_loss: 0.3429 - val_accuracy: 0.8642 Epoch 5/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.2416 - accuracy: 0.9096 - val_loss: 0.3503 - val_accuracy: 0.8714 Epoch 6/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.2177 - accuracy: 0.9188 - val_loss: 0.3563 - val_accuracy: 0.8616 Epoch 7/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.1962 - accuracy: 0.9277 - val_loss: 0.3419 - val_accuracy: 0.8694 Epoch 8/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.1795 - accuracy: 0.9367 - val_loss: 0.3619 - val_accuracy: 0.8736 Epoch 9/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.1619 - accuracy: 0.9427 - val_loss: 0.3729 - val_accuracy: 0.8638 Epoch 10/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.1488 - accuracy: 0.9480 - val_loss: 0.3886 - val_accuracy: 0.8674 Epoch 11/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.1305 - accuracy: 0.9541 - val_loss: 0.4121 - val_accuracy: 0.8614 Epoch 12/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.1191 - accuracy: 0.9595 - val_loss: 0.4263 - val_accuracy: 0.8574 Epoch 13/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.1089 - accuracy: 0.9621 - val_loss: 0.4649 - val_accuracy: 0.8568 Epoch 14/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.1012 - accuracy: 0.9647 - val_loss: 0.4823 - val_accuracy: 0.8554 Epoch 15/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.0906 - accuracy: 0.9689 - val_loss: 0.4837 - val_accuracy: 0.8598 Epoch 16/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.0839 - accuracy: 0.9709 - val_loss: 0.5245 - val_accuracy: 0.8586 Epoch 17/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.0774 - accuracy: 0.9746 - val_loss: 0.5488 - val_accuracy: 0.8570 Epoch 18/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.0699 - accuracy: 0.9766 - val_loss: 0.5611 - val_accuracy: 0.8562 Epoch 19/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.0633 - accuracy: 0.9783 - val_loss: 0.6255 - val_accuracy: 0.8466 Epoch 20/20 20000/20000 [==============================] - 47s 2ms/step - loss: 0.0617 - accuracy: 0.9795 - val_loss: 0.6143 - val_accuracy: 0.8526 ``` 我们可以看到,在20次迭代后,模型的训练精度达到了97.95%,验证精度达到了85.26%。同时,我们绘制了训练精度和验证精度的变化曲线和训练损失和验证损失的变化曲线,如下图所示: ![image-20210829005518321](./image-20210829005518321.png) 我们可以看到,随着迭代次数的增加,训练精度和验证精度都在逐渐提高,同时训练损失和验证损失也在逐渐降低。在大约10次迭代后,模型的精度和损失趋于稳定,此时我们可以认为模型已经训练完毕。同时我们可以看到,模型的验证精度达到了85.26%,符合实验要求。

相关推荐

最新推荐

recommend-type

rapidminer使用手册 [RapidMiner数据分析与挖掘实战] 全17章

第1章 RAPIDMINER STUDIO简介 第2章 设计分析流程 ...第10章决策树与神经网络 第11章 文本挖掘 第12章 WEB挖掘 第13章 推荐系统 第14章 模型评估与优化 第15章 时间序列 第16章 宏、循环和数据集处理 第17章 异常检测
recommend-type

基于matlab实现的空间调制通信过程,包含信号调制、天线选择等发送过程,以及采用最大似然估计的检测过程 .rar

基于matlab实现的空间调制通信过程,包含信号调制、天线选择等发送过程,以及采用最大似然估计的检测过程。.rar
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

numpy数组索引与切片技巧

![numpy数组索引与切片技巧](https://img-blog.csdnimg.cn/f610d87ed50745d2b7052af887da2d0d.png) # 2.1 整数索引 整数索引是 NumPy 数组中索引元素的最简单方法。它允许您使用整数来访问数组中的特定元素或子数组。 ### 2.1.1 单个元素索引 单个元素索引使用一个整数来访问数组中的单个元素。语法为: ```python array[index] ``` 其中: * `array` 是要索引的 NumPy 数组。 * `index` 是要访问的元素的索引。 例如: ```python import
recommend-type

javaboolean类型怎么使用

Java中的boolean类型表示真或假,只有两个可能的值。在Java中,boolean类型的变量可以被初始化为false或true。可以使用以下语法来声明和初始化一个boolean类型的变量: ``` boolean myBoolean = true; ``` 在Java中,boolean类型的变量通常用于控制流程和条件测试,例如: ``` if (myBoolean) { // do something if myBoolean is true } else { // do something if myBoolean is false } ``` 除了if语句之外
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

Selenium与人工智能结合:图像识别自动化测试

![Selenium与人工智能结合:图像识别自动化测试](https://img-blog.csdnimg.cn/8a58f7ef02994d2a8c44b946ab2531bf.png) # 1. Selenium简介** Selenium是一个用于Web应用程序自动化的开源测试框架。它支持多种编程语言,包括Java、Python、C#和Ruby。Selenium通过模拟用户交互来工作,例如单击按钮、输入文本和验证元素的存在。 Selenium提供了一系列功能,包括: * **浏览器支持:**支持所有主要浏览器,包括Chrome、Firefox、Edge和Safari。 * **语言绑
recommend-type

zrender.path怎么用

zrender.path是ZRender中用于绘制路径的模块,具体用法如下: 1. 引入zrender库和zrender.path模块: ```html <script src="zrender.min.js"></script> <script src="zrender.path.min.js"></script> ``` 2. 创建ZRender实例: ```javascript var zr = zrender.init(document.getElementById('main')); ``` 3. 创建路径对象: ```javascript var path = new