内容简介:我们在做句子相似度计算的时候需要的输出是一个0到1之间的实数值,用来表示句子的相似程度。BERT默认只提供了run_classifier.py,它可以用于Fine-Tuning文本分类、相似度分类、Entailment等任务。但是无法实现实数值的输出,因此我参照run_classifier.py实现了一个run_reg.py。需要的读者可以我如果读者是其它的版本,也可以去
我们在做句子相似度计算的时候需要的输出是一个0到1之间的实数值,用来表示句子的相似程度。BERT默认只提供了run_classifier.py,它可以用于Fine-Tuning文本分类、相似度分类、Entailment等任务。但是无法实现实数值的输出,因此我参照run_classifier.py实现了一个run_reg.py。
代码
需要的读者可以我 fork的版本 去clone代码,这个fork的版本是最新(昨天pull过)的,log为:
commit ffbda2a1aafe530525212d13194cc84d92ed0313 Merge: 0a0ea64 3084a39 Author: Jacob Devlin <44483550+jacobdevlin-google@users.noreply.github.com> Date: Tue Feb 12 14:17:23 2019 -0800
如果读者是其它的版本,也可以去 这个pr ,把它合并到自己的版本了。不了解怎么把pr合并到本地的读者可以参考 这里 。
用法
用法和run_classifier.py很像,它要求的输入是如下格式:
手机号码注销了,怎么换手机号吗? 如何修改手机号 1 支付宝怎么充值 微信怎么充值 0.5
也就是使用TAB分割的文件,每行三列,前两列是两个句子,最后一列是一个实数值。
使用的示例代码为:
python run_reg.py \
--task_name=sim \
--do_train=true \
--do_eval=true \
--data_dir=/path/to/your/data \
--vocab_file=$BERT_BASE_DIR/vocab.txt \
--bert_config_file=$BERT_BASE_DIR/bert_config.json \
--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
--max_seq_length=64 \
--train_batch_size=8 \
--learning_rate=5e-5 \
--num_train_epochs=2 \
--output_dir=/tmp/sim/
需要指定task_name为sim,如果回归的输出范围不是0和1之间,那么需要设置--use_sigmoid_act=false。
如果读者的输入格式不同,也可以自己参考SimProcessor类实现自己的数据处理。
实现细节
代码基本是拷贝的run_classifier.py,然后把输入从label_ids(int32)变成了vals(float32),把loss从交叉熵改成了MSE,同时修改了相应的Metrics。不感兴趣的读者可以跳过,并不影响使用。
create_model函数的修改
原来的代码:
with tf.variable_scope("loss"):
if is_training:
# I.e., 0.1 dropout
output_layer = tf.nn.dropout(output_layer, keep_prob=0.9)
logits = tf.matmul(output_layer, output_weights, transpose_b=True)
logits = tf.nn.bias_add(logits, output_bias)
probabilities = tf.nn.softmax(logits, axis=-1)
log_probs = tf.nn.log_softmax(logits, axis=-1)
one_hot_labels = tf.one_hot(labels, depth=num_labels, dtype=tf.float32)
per_example_loss = -tf.reduce_sum(one_hot_labels * log_probs, axis=-1)
loss = tf.reduce_mean(per_example_loss)
return (loss, per_example_loss, logits, probabilities)
新的代码:
with tf.variable_scope("loss"):
if is_training:
# I.e., 0.1 dropout
output_layer = tf.nn.dropout(output_layer, keep_prob=0.9)
logits = tf.matmul(output_layer, output_weights, transpose_b=True)
logits = tf.nn.bias_add(logits, output_bias)
if FLAGS.use_sigmoid_act:
output = tf.nn.sigmoid(logits)
else:
output = logits
output = tf.squeeze(output, [1])
loss = tf.losses.mean_squared_error(vals, output)
return (loss, output)
file_based_convert_examples_to_features的修改
原代码:
features = collections.OrderedDict()
features["input_ids"] = create_int_feature(feature.input_ids)
features["input_mask"] = create_int_feature(feature.input_mask)
features["segment_ids"] = create_int_feature(feature.segment_ids)
features["label_ids"] = create_int_feature([feature.label_id])
features["is_real_example"] = create_int_feature(
[int(feature.is_real_example)])
修改后的:
def create_float_feature(vals):
return tf.train.Feature(float_list=tf.train.FloatList(value=vals))
features = collections.OrderedDict()
features["input_ids"] = create_int_feature(feature.input_ids)
features["input_mask"] = create_int_feature(feature.input_mask)
features["segment_ids"] = create_int_feature(feature.segment_ids)
features["vals"] = create_float_feature([feature.val])
model_fn_builder的修改
原来是分类,因此有eval_accuracy和eval_loss等指标,现在是回归,因此只有eval_loss这一个指标。
原代码:
def metric_fn(per_example_loss, label_ids, logits, is_real_example):
predictions = tf.argmax(logits, axis=-1, output_type=tf.int32)
accuracy = tf.metrics.accuracy(
labels=label_ids, predictions=predictions, weights=is_real_example)
loss = tf.metrics.mean(values=per_example_loss, weights=is_real_example)
return {
"eval_accuracy": accuracy,
"eval_loss": loss,
}
eval_metrics = (metric_fn,
[per_example_loss, label_ids, logits, is_real_example])
修改后的:
def metric_fn(preds, vals):
return {
"eval_loss": tf.metrics.mean_squared_error(vals, preds),
}
eval_metrics = (metric_fn, [pred_vals, vals])
file_based_input_fn_builder
读取TFRecord文件时也有小的修改。从
name_to_features = {
"input_ids": tf.FixedLenFeature([seq_length], tf.int64),
"input_mask": tf.FixedLenFeature([seq_length], tf.int64),
"segment_ids": tf.FixedLenFeature([seq_length], tf.int64),
"label_ids": tf.FixedLenFeature([], tf.int64),
"is_real_example": tf.FixedLenFeature([], tf.int64),
}
变成
name_to_features = {
"input_ids": tf.FixedLenFeature([seq_length], tf.int64),
"input_mask": tf.FixedLenFeature([seq_length], tf.int64),
"segment_ids": tf.FixedLenFeature([seq_length], tf.int64),
"vals": tf.FixedLenFeature([], tf.float32),
}
以上所述就是小编给大家介绍的《使用BERT回归的代码》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 机器学习代码实战:使用逻辑回归帮助诊断心脏病
- K近邻算法用作回归的使用介绍(使用Python代码)
- 为你介绍7种流行的线性回归收缩与选择方法(附代码)
- 送你一份使用k近邻算法实现回归的实用指南(附代码、链接)
- 机器学习算法之岭回归、Lasso回归和ElasticNet回归
- [机器学习实战-Logistic回归]使用Logistic回归预测各种实例
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
颠覆式创新:移动互联网时代的生存法则
李善友 / 机械工业出版社 / 2015-3-1
为什么把每件事情都做对了,仍有可能错失城池?为什么无人可敌的领先企业,却在一夜之间虎落平阳?短短三年间诺基亚陨落,摩托罗拉以区区29亿美元出售给联想,芯片业霸主英特尔在移动芯片领域份额几乎为零,风光无限的巨头转眼成为被颠覆的恐龙,默默无闻的小公司一战成名迅速崛起,令人瞠目结舌的现象几乎都能被“颠覆式创新”法则所解释。 颠覆式创新教你在新的商业竞争中“换操作系统”而不是“打补丁”,小公司用破坏......一起来看看 《颠覆式创新:移动互联网时代的生存法则》 这本书的介绍吧!