使用TensorFlow进行多标签文本分类

5 浏览
0 Comments

使用TensorFlow进行多标签文本分类

文本数据以一个有20000个元素的向量形式组织,如[2, 1, 0, 0, 5, ...., 0]。

第i个元素表示文本中第i个单词的频率。

地面真实标签数据也表示为一个有4000个元素的向量,如[0, 0, 1, 0, 1, ...., 0]。

第i个元素表示第i个标签是否是文本的正标签。

文本的标签数量因文本而异。

我有一个用于单标签文本分类的代码。

我该如何编辑以下代码以用于多标签文本分类?

特别是,我想知道以下几点。

  • 如何使用TensorFlow计算准确率。
  • 如何设置一个判断标签是否为正标签的阈值。例如,如果输出为[0.80, 0.43, 0.21, 0.01, 0.32],地面真实标签为[1, 1, 0, 0, 1],那么得分超过0.25的标签应被判断为正标签。

谢谢。

import tensorflow as tf
# 隐藏层
class HiddenLayer(object):
    def __init__(self, input, n_in, n_out):
        self.input = input
        w_h = tf.Variable(tf.random_normal([n_in, n_out],mean = 0.0,stddev = 0.05))
        b_h = tf.Variable(tf.zeros([n_out]))
        self.w = w_h
        self.b = b_h
        self.params = [self.w, self.b]
    def output(self):
        linarg = tf.matmul(self.input, self.w) + self.b
        self.output = tf.nn.relu(linarg)
        return self.output
# 输出层
class OutputLayer(object):
    def __init__(self, input, n_in, n_out):
        self.input = input
        w_o = tf.Variable(tf.random_normal([n_in, n_out], mean = 0.0, stddev = 0.05))
        b_o = tf.Variable(tf.zeros([n_out]))
        self.w = w_o
        self.b = b_o
        self.params = [self.w, self.b]
    def output(self):
        linarg = tf.matmul(self.input, self.w) + self.b
        self.output = tf.nn.relu(linarg)
        return self.output
# 模型
def model():
    h_layer = HiddenLayer(input = x, n_in = 20000, n_out = 1000)
    o_layer = OutputLayer(input = h_layer.output(), n_in = 1000, n_out = 4000)
    # 损失函数
    out = o_layer.output()
    cross_entropy = -tf.reduce_sum(y_*tf.log(out + 1e-9), name='xentropy')    
    # 正则化
    l2 = (tf.nn.l2_loss(h_layer.w) + tf.nn.l2_loss(o_layer.w))
    lambda_2 = 0.01
    # 计算损失
    loss = cross_entropy + lambda_2 * l2
    # 计算单标签分类任务的准确率
    correct_pred = tf.equal(tf.argmax(out, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, "float"))
    return loss, accuracy

0