深度学习工具与情感分析实战
1. ConvnetJS:基于浏览器的深度学习训练与可视化
1.1 简介
Andrej Karpathy开发的ConvnetJS是一款基于JavaScript的工具,可在网页浏览器中对卷积神经网络进行训练和可视化。其官网为:https://cs.stanford.edu/people/karpathy/convnetjs/ ,也能从GitHub(https://github.com/karpathy/convnetjs )进行下载。我们可以运行ConvnetJS提供的示例卷积神经网络,也能够创建自己的网络,该工具在多种桌面、平板和手机浏览器上均可使用。
1.2 MNIST演示
ConvnetJS的MNIST演示利用MNIST数据集对卷积神经网络进行训练,演示界面呈现出一个可滚动的仪表盘,在模型训练过程中会动态更新,它包含以下几个部分:
-
训练统计
:此部分有一个“暂停”按钮,点击后可停止学习并“冻结”当前仪表盘的可视化内容。暂停后,按钮文字变为“恢复”,再次点击就能继续训练。同时,该部分还会展示训练统计信息,如训练和验证准确率,以及训练损失的图表。
-
实例化网络和训练器
:这里能找到创建卷积神经网络的JavaScript代码,默认网络的层结构与常见的卷积网络类似。ConvnetJS文档(https://cs.stanford.edu/people/karpathy/convnetjs/docs.html )展示了支持的层类型及其配置方法。我们可以在提供的文本框中试验不同的层配置,点击“更改网络”按钮即可开始训练更新后的网络。
-
网络可视化
:该关键部分每次显示一张训练图像,并展示网络如何通过每一层处理该图像。点击“暂停”按钮,可检查给定数字在所有层的输出,从而了解网络在学习过程中“看到”的内容。网络的最后一层会生成概率分类结果,显示10个方块(9个黑色和1个白色),白色方块表示当前数字图像的预测类别。
-
测试集示例预测
:最后一部分随机选取测试集图像,并展示每个数字的前三个可能类别。概率最高的类别用绿色条表示,另外两个用红色条表示,条的长度直观地反映了该类别的概率。
1.3 操作步骤
以下是使用ConvnetJS进行基本操作的步骤:
1. 访问ConvnetJS官网或从GitHub下载工具。
2. 打开MNIST演示页面。
3. 若要暂停训练,点击“暂停”按钮;若要继续,点击“恢复”按钮。
4. 若想更改网络配置,在相应文本框中修改层配置,然后点击“更改网络”按钮开始新的训练。
5. 点击“网络可视化”部分的“暂停”按钮,查看特定数字在各层的输出。
1.4 流程图
graph LR
A[访问ConvnetJS] --> B[打开MNIST演示]
B --> C{是否暂停训练}
C -- 是 --> D[点击暂停按钮]
C -- 否 --> E{是否更改网络配置}
E -- 是 --> F[修改层配置并点击更改网络按钮]
E -- 否 --> G{是否查看网络可视化}
G -- 是 --> H[点击网络可视化暂停按钮]
G -- 否 --> I[结束操作]
D --> E
F --> G
2. 循环神经网络与IMDb数据集情感分析
2.1 循环神经网络概述
在MNIST CNN网络中,我们关注的是按顺序应用的堆叠层。而循环神经网络(RNN)属于非顺序模型,它能够处理数据序列,像时间序列或句子文本等。“循环”这一概念源于神经网络中存在循环结构,即某一层的输出会在下一个时间步成为该层的输入。在时间序列里,时间步指的是下一个时间点;在文本序列中,“时间步”则是序列中的下一个单词。
RNN的循环结构使其能够学习并记住序列中数据之间的关系。例如,“The food is not good.”这句话明显具有负面情感,尽管“good”本身具有积极情感,但在“not”之后,情感就变为负面了。RNN会考虑序列中前后部分的关系。为了更好地处理此类序列学习,我们会使用长短期记忆(LSTM)层,它能让神经网络具备循环特性,并且针对上述序列学习进行了优化。
RNN在多个任务中都有应用,包括:
- 预测文本输入:在用户输入时显示可能的下一个单词。
- 情感分析:判断文本的情感倾向。
- 问题回答:从语料库中找出预测的最佳答案来回应问题。
- 语言翻译:实现不同语言之间的翻译。
- 视频自动字幕:为视频自动添加字幕。
2.2 加载IMDb电影评论数据集
Keras自带的IMDb电影评论数据集包含25,000个训练样本和25,000个测试样本,每个样本都标记了正面(1)或负面(0)情感。我们可通过以下代码导入相关模块并加载数据集:
from tensorflow.keras.datasets import imdb
number_of_words = 10000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=number_of_words)
由于系统内存限制,并且考虑到大多数人没有配备GPU和TPU的系统,我们仅加载了出现频率最高的前10,000个单词。加载的数据越多,训练所需时间就越长,但更多的数据可能有助于生成更好的模型。
load_data
函数会返回一个包含训练集和测试集的二元组,每个元素又是一个包含样本和标签的二元组。对于超出前10,000个单词范围的词,
load_data
会用占位符值进行替换。
2.3 数据探索
我们来查看训练集样本(
X_train
)、训练集标签(
y_train
)、测试集样本(
X_test
)和测试集标签(
y_test
)的维度:
print(X_train.shape) # (25000,)
print(y_train.shape) # (25000,)
print(X_test.shape) # (25000,)
print(y_test.shape) # (25000,)
y_train
和
y_test
是一维数组,包含1和0,用以表示每个评论是正面还是负面。从输出结果看,
X_train
和
X_test
似乎也是一维的,但实际上它们的元素是整数列表,每个列表代表一条评论的内容,例如:
%pprint
print(X_train[123])
2.4 电影评论编码与解码
2.4.1 编码规则
电影评论是经过数字编码的,要查看原始文本,就需要知道每个数字对应的单词。Keras的IMDb数据集提供了一个将单词映射到索引的字典,每个单词对应的数值是其在所有评论中出现频率的排名。不过,在编码后的评论中,排名值会偏移3。Keras为每个编码评论保留了0、1和2这三个值,具体用途如下:
| 值 | 用途 |
| — | — |
| 0 | 表示填充。Keras深度学习算法要求所有训练样本具有相同的维度,因此部分评论可能需要扩展或缩短,需要扩展的评论会用0进行填充。 |
| 1 | 是Keras内部用于表示文本序列开始的标记,用于学习目的。 |
| 2 | 代表未知单词,通常是因为调用
load_data
函数时使用了
num_words
参数而未加载的单词。在这种情况下,频率排名大于
num_words
的单词会被替换为2。 |
2.4.2 解码步骤
下面是解码电影评论的步骤:
1. 获取单词到索引的字典:
word_to_index = imdb.get_word_index()
- 查看某个单词的频率排名,例如“great”:
print(word_to_index['great']) # 84
- 反转字典映射,以便通过频率排名查找单词:
index_to_word = {index: word for (word, index) in word_to_index.items()}
- 获取前50个单词:
print([index_to_word[i] for i in range(1, 51)])
- 解码一条评论:
decoded_review = ' '.join([index_to_word.get(i - 3, '?') for i in X_train[123]])
print(decoded_review)
- 查看评论的情感分类:
print(y_train[123])
2.5 数据准备
由于每条评论的单词数量不同,而Keras要求所有样本具有相同的维度,所以需要进行数据准备。具体做法是将每条评论限制为相同的单词数量,部分评论需要填充额外数据,部分则需要截断。我们使用
pad_sequences
函数(
tensorflow.keras.preprocessing.sequence
模块)对
X_train
进行处理:
words_per_review = 200
from tensorflow.keras.preprocessing.sequence import pad_sequences
X_train = pad_sequences(X_train, maxlen=words_per_review)
print(X_train.shape) # (25000, 200)
同样,我们也需要对
X_test
进行重塑,以便后续评估模型:
X_test = pad_sequences(X_test, maxlen=words_per_review)
print(X_test.shape) # (25000, 200)
此外,我们要手动将25,000个测试样本划分为20,000个测试样本和5,000个验证样本,使用Scikit - learn的
train_test_split
函数:
from sklearn.model_selection import train_test_split
X_test, X_val, y_test, y_val = train_test_split(X_test, y_test, random_state=11, test_size=0.20)
print(X_test.shape) # (20000, 200)
print(X_val.shape) # (5000, 200)
2.6 操作步骤
以下是使用IMDb数据集进行情感分析的数据处理步骤:
1. 加载数据集。
2. 探索数据的维度和内容。
3. 了解电影评论的编码规则。
4. 对评论进行解码。
5. 使用
pad_sequences
函数对训练集和测试集进行数据填充和截断。
6. 使用
train_test_split
函数将测试集划分为测试集和验证集。
2.7 流程图
graph LR
A[加载IMDb数据集] --> B[数据探索]
B --> C[了解编码规则]
C --> D[解码评论]
D --> E[数据准备]
E --> F[划分测试集和验证集]
3. 创建神经网络
3.1 初始化模型
我们使用
Sequential
模型来构建循环神经网络(RNN),并导入所需的层:
from tensorflow.keras.models import Sequential
rnn = Sequential()
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.layers.embeddings import Embedding
3.2 添加嵌入层
为了降低数据维度,处理文本序列的RNN通常会以嵌入层开始,该层能将每个单词编码为更紧凑的密集向量表示,同时捕捉单词的上下文信息。我们创建一个嵌入层:
number_of_words = 10000
words_per_review = 200
rnn.add(Embedding(input_dim=number_of_words, output_dim=128, input_length=words_per_review))
嵌入层的参数说明如下:
| 参数 | 说明 |
| — | — |
|
input_dim
| 唯一单词的数量。 |
|
output_dim
| 每个单词嵌入的大小。如果加载预训练的嵌入,此参数需与加载的单词嵌入大小匹配。 |
|
input_length
| 每个输入样本中的单词数量。 |
3.3 添加LSTM层
接下来,我们添加一个LSTM层:
rnn.add(LSTM(units=128, dropout=0.2, recurrent_dropout=0.2))
LSTM层的参数说明如下:
| 参数 | 说明 |
| — | — |
|
units
| 层中的神经元数量。神经元越多,网络能记住的信息就越多。一般可从处理序列的长度(此例中为200)和要预测的类别数量(此例中为2)之间选择一个值作为起始值。 |
|
dropout
| 处理层的输入和输出时随机禁用的神经元百分比。这是一种减少过拟合的有效技术。 |
|
recurrent_dropout
| 当层的输出反馈回该层时,随机禁用的神经元百分比,使网络能从之前看到的内容中学习。 |
3.4 操作步骤
以下是创建RNN模型的步骤:
1. 初始化
Sequential
模型。
2. 导入所需的层。
3. 添加嵌入层,设置
input_dim
、
output_dim
和
input_length
参数。
4. 添加LSTM层,设置
units
、
dropout
和
recurrent_dropout
参数。
3.5 流程图
graph LR
A[初始化Sequential模型] --> B[导入所需层]
B --> C[添加嵌入层]
C --> D[添加LSTM层]
4. 总结
本文介绍了基于浏览器的深度学习工具ConvnetJS和使用循环神经网络进行IMDb数据集情感分析的方法。具体内容如下:
-
ConvnetJS
:可在网页浏览器中对卷积神经网络进行训练和可视化,通过MNIST演示展示了训练统计、网络配置和可视化等功能,并给出了使用该工具的操作步骤和流程图。
-
IMDb数据集情感分析
:使用循环神经网络(RNN)结合长短期记忆(LSTM)层处理文本序列。从加载数据集开始,进行数据探索、评论编码与解码、数据准备,最后创建神经网络模型。详细说明了每个步骤的代码实现和参数设置,并给出了相应的操作步骤和流程图。
通过这些内容,我们可以看到深度学习在图像和文本处理方面的强大能力,以及如何利用现有的工具和技术进行实际应用。希望这些信息能帮助你更好地理解和应用深度学习。
超级会员免费看
2688

被折叠的 条评论
为什么被折叠?



