val_accuracy不增加

val_accuracy does not increase

目前我正在尝试使用 BERT 的合并输出来训练 Keras 顺序网络。微调的 BertForSequence 分类产生了良好的结果,但在神经网络中使用 pooled_output 并没有按预期工作。作为输入数据,我得到了 10.000 个值,每个值由我的 BERT 模型提供的 768 个浮点数组成。我正在尝试做一个简单的二进制分类,所以我也得到了带有 1 和 0 的标签。

正如您所看到的,我的数据中有大量关于这两个 类 的示例。洗牌后,我做了一个正常的火车测试拆分和 create/fit 我的模型:

model = Sequential()
model.add(Dense(1536, input_shape=(768,), activation='relu'))
model.add(Dense(1536, activation='relu'))
model.add(Dense(1536, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

opt = Adam(learning_rate=0.0001)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])

#Normally with early stopping so quite a few epochs
history = model.fit(train_features, train_labels, epochs=800, batch_size=68, verbose=1, 
validation_split=0.2, callbacks=[])

在训练过程中,损失减少了,而我的准确性如预期的那样提高了。但是 val_loss 增加了,而 val_accuracy 保持不变!当然我过度拟合了,但我希望 val_accuracy 会增加,至少在几个时期内会增加,然后在我过度拟合时会减少。

有没有人知道我做错了什么?也许 10.000 个值不足以概括?

模型如预期的那样过度拟合,但令我惊讶的是它在早期阶段开始过度拟合,如果您在验证集中有一些错误标记,这让我感到很困惑。无论如何尝试添加更改模型如下

model = Sequential()
model.add(Dense(1536, input_shape=(768,), activation='relu'))
model.add(Dropout(.3))
model.add(Dense(512, activation='relu'))
model.add(Dropout(.3))
model.add(Dense(128, activation='relu'))
model.add(Dropout(.3))
model.add(Dense(1, activation='sigmoid'))

看看这样能不能减少过拟合问题

这不仅是我的验证集中的错误标签,而且是我的整个数据。

我抽取了 100000 个条目的样本

train_df = train_df.sample(frac=1).reset_index(drop=True)
train_df = train_df.iloc[0:100000]

并删除一些值

train_df = train_df[train_df['label'] != '-']

之后,我在循环中使用 train_df.at 设置了一些值,但一些索引不存在,因为我删除了它们。 train_df.at 只抛出警告,所以我没有看到这个。我还混合了 .loc 和 .iloc 所以在我的情况下我选择了 .iloc[2:3] 但索引 2 不存在,所以它 return 索引 3 位于位置 2。之后我进行更改train_df.at 在位置 2 上插入失败,但我的循环继续进行。下一次迭代 .iloc returns 索引 4 在位置 3 上。然后我的循环将数据放在索引 3 上——从现在开始我所有的标签都偏离一个位置。