当前位置: 首页 > 知识库问答 >
问题:

用于复杂文本分类的CNN超参数微调

方寒
2023-03-14

我正在研究一个用于复杂文本分类(主要是电子邮件和消息)的CNN模型。数据集包含大约100k分布在10个不同类上的条目。我的实际Keras顺序模型有以下结构:

model = Sequential(
        [
            Embedding(
                input_dim=10000,
                output_dim=150,
                input_length=400),
            Convolution1D(
                filters=128,
                kernel_size=4,
                padding='same',
                activation='relu'),
                BatchNormalization(),
            MaxPooling1D(),
            Flatten(),
            Dropout(0.4),
            Dense(
                100,
                activation='relu'),
            Dropout(0.4),
            Dense(
                len(y_train[0]),
                activation='softmax')])

编译模型时,我使用Nadam优化器,将LabelSmoothing设置为0.2的分类交叉熵损失。

在模型拟合中,我使用了30个时代,批量大小设置为512。我还使用EarlyStoping来监控val_损失和耐心设置为8个时期。测试大小设置为数据集的25%。

实际上,训练在16/18纪元后停止,值在6/7纪元后开始波动,然后继续,直到被早期停止停止。这些值平均如下:

损失: 1.1673-精度: 0.9674-val_loss: 1.2464-val_accuracy: 0.8964

测试精度达到:

损失: 1.2461-精度: 0.8951

现在我想提高我的CNN的准确性,我尝试了不同的超参数,但就目前而言,我无法获得更高的值。因此,我试图弄清楚:

  1. 如果还有改进的余地(我打赌是这样)
  2. 如果解决方案是在微调我的超参数,如果是,我应该改变哪些?
  3. 如果通过向模型中添加层来更深入地研究是否有任何用处,如果有的话,如何改进我的模型
  4. 有没有其他深度学习/神经网络方法,而不是CNN,可以导致更好的结果?

非常感谢任何愿意帮忙的人!:)

共有1个答案

经福
2023-03-14

有很多库,但我觉得这一个非常灵活。https://github.com/keras-team/keras-tuner

只需用pip安装。

您的更新模型,请随意选择搜索范围。

from tensorflow import keras
from tensorflow.keras import layers
from kerastuner.tuners import RandomSearch


def build_model(hp):
    model = keras.Sequential()
    model.add(layers.Embedding(input_dim=hp.Int('input_dim',
                                        min_value=5000,
                                        max_value=10000,
                                        step = 1000),
                              output_dim=hp.Int('output_dim',
                                        min_value=200,
                                        max_value=800,
                                        step = 100),
                              input_length = 400))
    model.add(layers.Convolution1D(
                filters=hp.Int('filters',
                                        min_value=32,
                                        max_value=512,
                                        step = 32),
                kernel_size=hp.Int('kernel_size',
                                        min_value=3,
                                        max_value=11,
                                        step = 2),
                padding='same',
                activation='relu')),
    model.add(layers.BatchNormalization())
    model.add(layers.MaxPooling1D())
    model.add(layers.Flatten())
    model.add(layers.Dropout(0.4))
    model.add(layers.Dense(units=hp.Int('units',
                                        min_value=64,
                                        max_value=256,
                                        step=32),
                           activation='relu'))
    model.add(layers.Dropout(0.4))
    model.add(layers.Dense(y_train[0], activation='softmax'))
    model.compile(
    optimizer=keras.optimizers.Adam(
        hp.Choice('learning_rate',
                  values=[1e-2, 1e-3, 1e-4])),
    loss='categorical_crossentropy',
    metrics=['accuracy'])
    return model


tuner = RandomSearch(
    build_model,
    objective='val_accuracy',
    max_trials=5,
    executions_per_trial=3,
    directory='my_dir',
    project_name='helloworld')
tuner.search_space_summary()

## The following lines are based on your model


tuner.search(x, y,
             epochs=5,
             validation_data=(val_x, val_y))

models = tuner.get_best_models(num_models=2)

您可以尝试用LSTM层替换Conv1D层,并观察是否获得更好的性能

LSTM(单位=512)https://keras.io/layers/recurrent/

如果你想提取更多有意义的特征,我发现有希望的一种方法是提取预先训练的BERT特征,然后使用CNN/LSTM进行训练。

这是一个很好的入门知识库-https://github.com/UKPLab/sentence-transformers

一旦你从BERT/XLNet获得了句子嵌入,你就可以使用这些功能来训练另一个类似于你正在使用的CNN,除了可能摆脱嵌入层,因为它很昂贵。

 类似资料:
  • 2个轮次后达到 0.89 的测试精度。 </br> 在 Intel i5 2.4Ghz CPU 上每轮次 90秒。 </br> 在 Tesla K40 GPU 上每轮次 10秒。 from __future__ import print_function from keras.preprocessing import sequence from keras.models import Seque

  • 如何计算多类文本分类的FPR、TPR、AUC、roc_曲线-我使用了以下代码- 到这里为止,每件事都运行良好-但是一旦我使用以下代码,就会出错- 错误是- Traceback(最近的调用最后): 文件"C:/用户/saurabh/PycharmProjects/getting_started/own_code.py",第32行,打印(metrics.roc_auc_score(y_test,y_p

  • 问题内容: 虽然圈复杂度是一个值得衡量的指标,但我倾向于发现它并不是识别难以维护的代码的有效工具。特别是,我倾向于发现它只是突出显示了某些类型的代码(例如解析器),并且错过了困难的递归,线程和耦合问题以及许多已定义的反模式。 还有哪些其他工具可用来识别有问题的Java代码? 注意,我们已经使用了PMD和FindBugs,我认为它们对于方法级问题的识别非常有用。 问题答案: 我的经验是,查看代码可维

  • 我在Excel文件中有数据,我需要使用它来使用SVM执行多标签分类。它有两列,如下所示。“推文”-A、B、C、D、E、F、G和“类别”=X、Y、Z 推文类别 一个X B Y C Z D X,Y E Y,Z F X,Y,Z G X,Z 给出一条推特,我想训练我的模型预测它所属的类别。推文和类别都是文本。我正在尝试使用Weka的LibSVM分类器进行分类,因为我读到它可以进行多标签分类。我将csv文件

  • 在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。

  • 问题内容: 我正在寻找一种将复杂文本文件解析为pandas DataFrame的简单方法。下面是一个示例文件,我希望解析后的结果是什么样,以及我当前的方法。 有什么方法可以使其更简洁/更快/更pythonic /更易读? 我也把这个问题放在了Code Review上 。 我最终写了一篇博客文章向初学者解释。 这是一个示例文件: 这是我希望解析后的结果看起来像什么: 这是我目前解析的方式: 问题答案