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%,效果图如下
从图中可以看出,虽然训练集的准确度很高,但是验证集的准确度很低,且验证集的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
推荐阅读