为什么使用 BERT learner.autofit 期间数据项会发生变化?
Why is there is a change in data items during learner.autofit using BERT?
我正在尝试拟合 BERT 文本分类器。我的训练和测试数据如下所示。
x_train = data["TEXT"].head(4500).tolist()
y_train= [label2id[label] for label in data["EMOTION"].head(4500).values.tolist()]
x_test = data["TEXT"].tail(500).tolist()
y_test = [label2id[label] for label in data["EMOTION"].tail(500).values.tolist()]
然后,我下载预训练的 BERT 模型 (uncased_L-12_H-768_A-12.zip)...
(x_train, y_train), (x_test, y_test), preproc = text.texts_from_array(x_train=x_train, y_train=y_train,
x_test=x_test, y_test=y_test,
class_names=data['EMOTION'].unique().tolist(),
preprocess_mode='bert',
ngram_range=1,
maxlen=350,
max_features=35000)
为了分类,我们将bert模型设置为
model = text.text_classifier('bert', train_data=(x_train, y_train), preproc=preproc)
learner = ktrain.get_learner(model, train_data=(x_train, y_train), batch_size=6)
最后,我尝试使用 1cycle 政策利率拟合模型
hist = learner.fit_onecycle(2e-5, 1)
我用 750 个样本而不是 4500 个样本得到结果。我还用各种数据对此进行了测试。所以数据项总是有变化的。你能说说背后的原因吗?
begin training using onecycle policy with max lr of 2e-05...
750/750 [==============================] - 875s 1s/step - loss: 0.3740 - accuracy: 0.8544
感谢您提前回复。
我个人的想法是,当你用 ktrain.get_learner
实例化学习器时,你给它一个 batch size = 6
作为输入参数。
因此,当您尝试通过简单地执行 learner.fit_onecycle (2e-5, 1)
来训练学习器时,它只需要一批进行训练,实际上需要 4500 training data / batch size (6) = 750
个数据来训练。
此时要么尝试更改批量大小,要么像这样执行 for 循环:
for epoch in range(X):
....
for batch in chunker(train, batch_size):
....
其中 chunker()
可能是这样的:
def chunker(sequence, size):
"""useful for splitting a sequence into minibatches"""
for i in range(0, len(sequence), size):
chunk = sequence[i:i+size]
# sort sentences in batch by length in descending order
chunk.sort(key=lambda x: len(x), reverse=True)
yield chunk
简而言之,这个想法是你必须做一个循环,在这个循环中,每次要使用一组数据(批次)来训练你的模型时,你都会去 select。
我正在尝试拟合 BERT 文本分类器。我的训练和测试数据如下所示。
x_train = data["TEXT"].head(4500).tolist()
y_train= [label2id[label] for label in data["EMOTION"].head(4500).values.tolist()]
x_test = data["TEXT"].tail(500).tolist()
y_test = [label2id[label] for label in data["EMOTION"].tail(500).values.tolist()]
然后,我下载预训练的 BERT 模型 (uncased_L-12_H-768_A-12.zip)...
(x_train, y_train), (x_test, y_test), preproc = text.texts_from_array(x_train=x_train, y_train=y_train,
x_test=x_test, y_test=y_test,
class_names=data['EMOTION'].unique().tolist(),
preprocess_mode='bert',
ngram_range=1,
maxlen=350,
max_features=35000)
为了分类,我们将bert模型设置为
model = text.text_classifier('bert', train_data=(x_train, y_train), preproc=preproc)
learner = ktrain.get_learner(model, train_data=(x_train, y_train), batch_size=6)
最后,我尝试使用 1cycle 政策利率拟合模型
hist = learner.fit_onecycle(2e-5, 1)
我用 750 个样本而不是 4500 个样本得到结果。我还用各种数据对此进行了测试。所以数据项总是有变化的。你能说说背后的原因吗?
begin training using onecycle policy with max lr of 2e-05...
750/750 [==============================] - 875s 1s/step - loss: 0.3740 - accuracy: 0.8544
感谢您提前回复。
我个人的想法是,当你用 ktrain.get_learner
实例化学习器时,你给它一个 batch size = 6
作为输入参数。
因此,当您尝试通过简单地执行 learner.fit_onecycle (2e-5, 1)
来训练学习器时,它只需要一批进行训练,实际上需要 4500 training data / batch size (6) = 750
个数据来训练。
此时要么尝试更改批量大小,要么像这样执行 for 循环:
for epoch in range(X):
....
for batch in chunker(train, batch_size):
....
其中 chunker()
可能是这样的:
def chunker(sequence, size):
"""useful for splitting a sequence into minibatches"""
for i in range(0, len(sequence), size):
chunk = sequence[i:i+size]
# sort sentences in batch by length in descending order
chunk.sort(key=lambda x: len(x), reverse=True)
yield chunk
简而言之,这个想法是你必须做一个循环,在这个循环中,每次要使用一组数据(批次)来训练你的模型时,你都会去 select。