一维卷积完成文本情感分类任务

前文介绍

本文主要搭建经典的一维卷积神经网路模型,用于完成 IMDB 电影评论的情感分类预测任务,并在最后对模型进行了改造升级。

数据处理

IMDB 数据中每个样本都有一个电影评论文本和情感标签,如下所示展示了两个样本,0 和 1 分别表示的是负面情感和正面情感:

css 复制代码
b"I gave this a four purely out of its historical context. ... If you are a Stooge fan, then stick with the shorts."
0
b'First than anything, I\'m not going to praise I\xc3\xb1arritu\'s short film, ... that is not equal to American People.'
1

首先我们要将样本中的一些无用字符进行剔除,将样本数据清洗干净,然后使用 TextVectorization 来对样本中的评论数据进行向量化,也就是先进行分词,然后将分词映射成对应的整数,最后得到就是将评论转变后的整数数组。关键代码如下:

scss 复制代码
vectorize_layer = TextVectorization(standardize=custom_standardization, max_tokens=max_features, output_mode="int", output_sequence_length=sequence_length)
text_ds = raw_train_ds.map(lambda x, y: x)
vectorize_layer.adapt(text_ds)
def vectorize_text(text, label):
    text = tf.expand_dims(text, -1)
    return vectorize_layer(text), label
train_ds = raw_train_ds.map(vectorize_text).cache().prefetch(buffer_size = 10)
val_ds = raw_val_ds.map(vectorize_text).cache().prefetch(buffer_size = 10)
test_ds = raw_test_ds.map(vectorize_text).cache().prefetch(buffer_size = 10)

模型搭建

我们搭建的是一个简单但是经典的文本分类模型,由以下部分构成:

  1. inputs = tf.keras.Input(shape=(None,), dtype="int64"):创建一个可变长度的整数序列输入张量,用于接收上面经过向量化的文本数据。
  2. x = layers.Embedding(max_features, embedding_dim)(inputs):对输入的整数序列进行嵌入操作,将每个整数转换为对应的向量表示。
  3. x = layers.Dropout(0.5)(x):在嵌入层后添加了一个丢弃 50% 的Dropout层,用于在训练过程中随机丢弃一定比例的神经元,以防止过拟合。
  4. x = layers.Conv1D(128, 7, padding="valid", activation="relu", strides=3)(x):添加了一个一维卷积层,用于提取文本特征。
  5. x = layers.GlobalMaxPool1D()(x):应用一维全局最大池化操作,用于提取每个卷积核的最大特征值,以捕获最重要的特征。
  6. x = layers.Dense(128, activation="relu")(x):添加一个包含128个神经元的全连接层,并使用ReLU激活函数。
  7. x = layers.Dropout(0.5)(x):再次添加Dropout层,以进一步减少过拟合的风险。
  8. predictions = layers.Dense(1, activation="sigmoid", name="predictions")(x):最后添加一个输出层,用于二元分类任务的预测,使用 Sigmoid 激活函数输出 0 或者 1 。
  9. model = tf.keras.Model(inputs, predictions):创建一个Keras模型,将输入和输出连接起来。

编译训练

  1. model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]):编译模型,指定损失函数、优化器以及评估指标。
  2. model.fit(train_ds, validation_data=val_ds, epochs=3):使用训练数据集进行模型训练,同时使用验证数据集进行验证,训练 3 个 epochs 。

训练日志打印:

arduino 复制代码
Epoch 1/3
157/157 [==============================] - 9s 26ms/step - loss: 0.6597 - accuracy: 0.5632 - val_loss: 0.4223 - val_accuracy: 0.8080
Epoch 2/3
157/157 [==============================] - 1s 9ms/step - loss: 0.3168 - accuracy: 0.8676 - val_loss: 0.3400 - val_accuracy: 0.8596
Epoch 3/3
157/157 [==============================] - 1s 9ms/step - loss: 0.1406 - accuracy: 0.9501 - val_loss: 0.3697 - val_accuracy: 0.8750

使用测试数据进行模型效果测试,日志打印:

arduino 复制代码
196/196 [==============================] - 4s 18ms/step - loss: 0.3887 - accuracy: 0.8665

模型升级

由于上面的模型的输入只能接收经过向量化处理的整数,而我们平时遇到的都是直接输入字符串,所以需要将上面的模型进行改造,我们在上面已经训练好的模型的前面再添加一个输入层专门用于接受字符串,然后再跟一个 vectorize_layer 层用来将字符串进行向量化,接着传入到我们之前已经训练好的模型中即可。最后使用 Model 模型将输入和输出固定就可以造出一个新的用于接收字符串的模型,我们可以直接输入电影文本评论用于预测情感倾向。

关键代码:

ini 复制代码
inputs = tf.keras.Input(shape=(1,), dtype="string")
indices = vectorize_layer(inputs)
outputs = model(indices)
end_to_end_model = tf.keras.Model(inputs, outputs)
end_to_end_model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
end_to_end_model.evaluate(raw_test_ds)

使用测试数据进行测试,将日志打印出来,可以看出和上面的测试结果是一样的:

arduino 复制代码
196/196 [==============================] - 4s 18ms/step - loss: 0.3887 - accuracy: 0.8665

参考

github.com/wangdayaya/...

相关推荐
智购科技自动售货机厂家4 小时前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习
用户080775907855 小时前
第三方并行库"静默算错":一次 ring attention 的排查记录
深度学习
陈嘿萌6 小时前
ACM MM 2026|告别密集交互!ProtoHGF-Net:基于原型超图的RGBT目标检测新范式
图像处理·人工智能·深度学习·目标检测·计算机视觉·学术研究与理论基础
FanfanZainuli6 小时前
减肥APP智能化技术演进:从“内容推荐“到“AI驱动的个性化闭环“
人工智能·深度学习·机器学习
试剂界的爱马仕7 小时前
α-Cyano-4-hydroxycinnamic acid(CHCA)用作 MALDI-TOF 基质的配制与使用
大数据·人工智能·深度学习·学习
大熊背7 小时前
人工智能中的数学之美---从向量角度理解深度学习中的感知机
人工智能·深度学习
小蒋观天下8 小时前
网络抖动、乱序、丢包:UDP/RTSP/TCP对AI抓拍、轨迹跟踪的不同影响
大数据·人工智能·深度学习
高洁018 小时前
大模型检索增强生成(RAG)的技术原理与架构设计
人工智能·深度学习·机器学习·django·迁移学习
数聚天成DeepSData8 小时前
两份名录里的同名机构,主键该怎么合并
人工智能·深度学习·机器学习·数据集·deepsdata
陕西亿鑫鸿物联技术有限公司9 小时前
传统安防利旧升级实战:如何基于边缘计算接入海康大华IPC构建AI分析系统?
深度学习·计算机视觉·边缘计算·物联网架构·流媒体技术