欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Keras loss调试记录

程序员文章站 2024-03-14 21:52:23
...

最近尝试使用序列模型LSTM进行文本分类,数据集为入侵检测用的ADWA-LD数据集。

0x01 初始loss

最开始试运行模型时loss一直稳定为0.46,无论训练多少个epoch都不改变。下图为一开始使用的模型

def get_lstm_model(max_features, embed_size):
    model = Sequential()
    model.add(Embedding(max_features, embed_size))
    model.add(Bidirectional(LSTM(32, recurrent_dropout=0.1)))
    model.add(Dense(64)
    model.add(Dense(7))
    model.add(Activation('sigmond'))
    model.summary()

    adam = Adam(0.01)
    model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])

    return model

1.检查网络后发现最后的**层存在问题,由于是多分类问题,因此需要采用softmax作为**层。

2.全连接层要指定**函数,确保梯度问题

0x02 第二次改进

改进后的模型如下, 改进后模型的loss开始产生变化,但准确度在0.6左右

def get_lstm_model(max_features, embed_size):
    model = Sequential()
    model.add(Embedding(max_features, embed_size))
    model.add(Bidirectional(LSTM(32, recurrent_dropout=0.1)))
    model.add(Dense(64, activation='relu'))
    model.add(Dense(7))
    model.add(Activation('softmax'))
    model.summary()

    adam = Adam(0.0001)
    model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])

    return model

1.通过观察生成的loss曲线,抖动问题严重,因此减小学习率到0.0001

0x03 第三次改进

通过查阅资料,发现对数据集的预处理存在问题,处理好的数据每个类别的样本都聚集在一起,会对模型的学习产生影响。因此在读取数据集时进行随机化处理,随机打乱样本,使用如下代码

df1 = pd.read_csv('./train.csv', error_bad_lines=False, encoding='utf-8').sample(frac=1)
df2 = pd.read_csv('./validation.csv', error_bad_lines=False, encoding='utf-8').sample(frac=1)

至此,loss终于开始稳步下降,准确度也随之慢慢增长 由于只设置epoch为20,最终准确度停留在了75左右

1.增加epoch到200

0x04 第四次改进

在经过200个epoch后,准确度达到了98%,效果图如下

Keras loss调试记录

从图中可以看出,虽然训练集的准确度很高,但是验证集的准确度很低,且验证集的loss先下降后增长,出现了过拟合的情况

继续改进如下

1.增加Dropout层,避免过拟合的情况发生

def get_lstm_model(max_features, embed_size):
    model = Sequential()
    model.add(Embedding(max_features, embed_size))
    model.add(Bidirectional(LSTM(32, recurrent_dropout=0.1)))
    model.add(Dropout(0.25))
    model.add(Dense(64, activation='relu'))
    # model.add(Dropout(0.25))
    model.add(Dense(7))
    model.add(Activation('softmax'))
    model.summary()

    adam = Adam(0.0001)
    model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])

    return model

 

相关标签: 深度学习 loss