目前,我正在尝试训练一个Keras序列网络,它有来自BERT的联合输出。精细调整的BertForSequence分类结果很好,但是在神经网络中使用pooled_output并不像预期的那样工作。作为输入数据,我得到了10.000个值,每个值由我的伯特-模型提供的768个浮点数组成。我试图做一个简单的二进制分类,所以我也得到了1和0的标签。

如您所见,我的数据为这两个类提供了大量的示例。洗牌后,我做了一个正常的火车测试分裂,并创建/安装我的模型与:
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的值还不足以概括?
发布于 2021-04-10 07:59:09
这不仅仅是在我的验证集中的错误标记,而是在我的整个数据中。
我抽取了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,所以在我的例子中选择了.iloc2:3,但是索引2不存在,所以它返回位于位置2的索引3。在此之后,我做了更改,train_df.at在位置2上插入失败,但我的循环继续进行。下一次迭代.iloc在位置3上返回索引4,然后我的循环将数据放在索引3上-从现在起,我所有的标签都是一个位置。
发布于 2021-04-08 20:37:07
模型是过度拟合,如预期,但我很惊讶,它开始重新拟合在早期的时代,这使我的缠绕,如果你有一些错误的标签在你的验证集。无论如何,尝试添加更改模型如下
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'))看看这是否减少了过度拟合的问题。
https://stackoverflow.com/questions/67010607
复制相似问题