Nak*_*euh 4 python classification multilabel-classification tensorflow
我想使用BERT模型对Tensorflow进行多标签分类。
要做到这一点,我想适应的例子run_classifier.py来自BERT GitHub的仓库,这是关于如何使用BERT做简单的分类,使用一个例子由谷歌研究给出预训练的权重。(例如使用BERT-Base, Cased)
我有X不同的标签,它们的值为0或1,所以我想在原始BERT模型中添加一个新的Dense层,X并使用sigmoid_cross_entropy_with_logits激活函数。
因此,从理论上讲,我认为我很好。
问题是我不知道如何附加一个新的输出层,并使用现有BertModel类仅使用我的数据集重新训练该新层。
这是我想必须从中进行修改的原始create_model()功能run_classifier.py。但是我对如何做却有些迷茫。
def create_model(bert_config, is_training, input_ids, input_mask, segment_ids,
labels, num_labels, use_one_hot_embeddings):
"""Creates a classification model."""
model = modeling.BertModel(
config=bert_config,
is_training=is_training,
input_ids=input_ids,
input_mask=input_mask,
token_type_ids=segment_ids,
use_one_hot_embeddings=use_one_hot_embeddings)
output_layer = model.get_pooled_output()
hidden_size = output_layer.shape[-1].value
output_weights = tf.get_variable(
"output_weights", [num_labels, hidden_size],
initializer=tf.truncated_normal_initializer(stddev=0.02))
output_bias = tf.get_variable(
"output_bias", [num_labels], initializer=tf.zeros_initializer())
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)
Run Code Online (Sandbox Code Playgroud)
这是相同的功能,但有一些修改,但是哪里缺少东西(也有错误的东西?)
def create_model(bert_config, is_training, input_ids, input_mask, segment_ids, labels, num_labels):
"""Creates a classification model."""
model = modeling.BertModel(
config=bert_config,
is_training=is_training,
input_ids=input_ids,
input_mask=input_mask,
token_type_ids=segment_ids)
output_layer = model.get_pooled_output()
hidden_size = output_layer.shape[-1].value
output_weights = tf.get_variable("output_weights", [num_labels, hidden_size],initializer=tf.truncated_normal_initializer(stddev=0.02))
output_bias = tf.get_variable("output_bias", [num_labels], initializer=tf.zeros_initializer())
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)
per_example_loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=labels, logits=logits)
loss = tf.reduce_mean(per_example_loss)
return (loss, per_example_loss, logits, probabilities)
Run Code Online (Sandbox Code Playgroud)
我在代码中进行了其他修改,并且没有遇到任何问题:
因此,如果有人知道我应该怎么做才能解决我的问题,或者甚至指出我可能犯了一些明显的错误,我将很高兴听到它。
注意事项:
您想要用在模型上为每个类别建模独立分布的Sigmoid代替对可能的输出(所有分数加起来等于一个)的单一分布建模的softmax(对每个输出都有是/否的分布)。
因此,您可以正确更改损失函数,但是还需要更改计算概率的方式。它应该是:
probabilities = tf.sigmoid(logits)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您不需要log_probs。
| 归档时间: |
|
| 查看次数: |
1474 次 |
| 最近记录: |