gpt4 book ai didi

python - LSTM for 30 classes,严重过拟合,无法超过 76% 的测试准确率

转载 作者:行者123 更新时间:2023-12-04 15:12:17 27 4
gpt4 key购买 nike

职位描述如何归类到各自的行业?

我正在尝试使用 LSTM 对文本进行分类,特别是转换职位描述进入行业类别,不幸的是我到目前为止尝试过的东西只有 76% 的准确率。

使用 LSTM 对超过 30 类的文本进行分类的有效方法是什么?

我已经尝试了三种选择

Model_1

Model_1 达到 65% 的测试准确率

  • 嵌入维度 = 80

  • 最大序列长度 = 3000

  • 时代 = 50

  • 批量大小 = 100

    model = Sequential()
model.add(Embedding(max_words, embedding_dimension, input_length=x_shape))

model.add(SpatialDropout1D(0.2))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))

model.add(Dense(output_dim, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

LSTM architecture for multi class classification

image represents the test-train loss graph of model_1


Model_2

Model_2 达到 64% 的测试准确率

    model = Sequential()
model.add(Embedding(max_words, embedding_dimension, input_length=x_shape))

model.add(LSTM(100))

model.add(Dropout(rate=0.5))
model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))

model.add(Dropout(rate=0.5))
model.add(Dense(64, activation='relu', kernel_initializer='he_uniform'))

model.add(Dropout(rate=0.5))
model.add(Dense(output_dim, activation='softmax'))


model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])

Image represents the LSTM architecture of Model_2

Test-Train loss graph of model_2


Model_3

Model_3 达到 76% 的测试准确率

    model.add(Embedding(max_words, embedding_dimension, input_length= x_shape, trainable=False))

model.add(SpatialDropout1D(0.4))
model.add(LSTM(100, dropout=0.4, recurrent_dropout=0.4))

model.add(Dense(128, activation='sigmoid', kernel_initializer=RandomNormal(mean=0.0, stddev=0.039, seed=None)))
model.add(BatchNormalization())

model.add(Dense(64, activation='sigmoid', kernel_initializer=RandomNormal(mean=0.0, stddev=0.55, seed=None)) )
model.add(BatchNormalization())

model.add(Dense(32, activation='sigmoid', kernel_initializer=RandomNormal(mean=0.0, stddev=0.55, seed=None)) )
model.add(BatchNormalization())

model.add(Dense(output_dim, activation='softmax'))

model.compile(optimizer= "adam" , loss='categorical_crossentropy', metrics=['acc'])

Image represents the LSTM architecture of model_3

我想知道如何提高网络的准确性。

最佳答案

从最小基线开始

您的代码顶部有一个简单的网络,但请尝试将此网络作为您的基线

model = Sequential()
model.add(Embedding(max_words, embedding_dimension, input_length=x_shape))
model.add(LSTM(output_dim//4)),
model.add(Dense(output_dim, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

这里的直觉是看 LSTM 能做多少工作。我们不需要它来输出完整的 30 个 output_dims(类的数量),而是一个较小的特征集来决定类。

您的大型网络具有像 Dense(128) 这样具有 100 个输入的层。这是 100x128 = 12,800 个连接要学习。

立即改善失衡

您的数据可能存在很大的不平衡,因此在下一步中,让我们使用名为 top_k_loss 的损失函数来解决这个问题。此损失函数将使您的网络仅在其遇到最大问题的训练示例上进行训练。这在没有任何其他管道的情况下很好地处理了类不平衡

def top_k_loss(k=16):
@tf.function
def loss(y_true, y_pred):
y_error_of_true = tf.keras.losses.categorical_crossentropy(y_true=y_true,y_pred=y_pred)
topk, indexs = tf.math.top_k( y_error_of_true, k=tf.minimum(k, y_true.shape[0]) )
return topk
return loss

以 128 到 512 的批量大小使用它。您可以像这样将它添加到您的模型编译中

model.compile(loss=top_k_loss(16), optimizer='adam', metrics=['accuracy']

现在,您会看到在其上使用 model.fit 会返回一些令人失望的数字。那是因为它只报告每个训练批处理中最差的 16 个。重新编译您的常规损失并运行 model.evaluate 以了解它在训练和测试中的表现如何。

训练 100 个 epoch,此时您应该已经看到了一些不错的结果。

后续步骤

像这样把整个模型生成和测试成一个函数

def run_experiment(lstm_layers=1, lstm_size=output_dim//4, dense_layers=0, dense_size=output_dim//4):
model = Sequential()
model.add(Embedding(max_words, embedding_dimension, input_length=x_shape))
for i in range(lstm_layers-1):
model.add(LSTM(lstm_size, return_sequences=True)),
model.add(LSTM(lstm_size)),
for i in range(dense_layers):
model.add(Dense(dense_size, activation='tanh'))
model.add(Dense(output_dim, activation='softmax'))
model.compile(loss=top_k_loss(16), optimizer='adam', metrics=['accuracy'])
model.fit(x=x,y=y,epochs=100)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
loss, accuracy = model.evaluate(x=x_test, y=y_test)
return loss

可以为您运行整个实验。现在是通过搜索找到更好的架构的问题。一种搜索方式是随机的。随机其实真的很好。如果你想花哨,我推荐 hyperopt。不要为网格搜索而烦恼,对于较大的搜索空间,随机通常胜过它。

best_loss = 10**10
best_config = []

for trial in range(100):
config = [
randint(1,4), # lstm layers
randint(8,64), # lstm_size
randint(0,8), # dense_layers
randint(8,64) # dense_size
]
result = run_experiment(*config)
if result < best_loss:
best_config = config
print('Found a better loss ',result,' from config ',config)

关于python - LSTM for 30 classes,严重过拟合,无法超过 76% 的测试准确率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64988828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com