我正在研究一个用于复杂文本分类(主要是电子邮件和消息)的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的准确性,我尝试了不同的超参数,但就目前而言,我无法获得更高的值。因此,我试图弄清楚:
非常感谢任何愿意帮忙的人!:)
有很多库,但我觉得这一个非常灵活。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上 。 我最终写了一篇博客文章向初学者解释。 这是一个示例文件: 这是我希望解析后的结果看起来像什么: 这是我目前解析的方式: 问题答案