簡體   English   中英

使用TensorFlow進行多標簽文本分類

[英]Multilabel Text Classification using TensorFlow

文本數據被組織為具有20,000個元素的向量,例如[2,1,0,0,5,....,0]。 第i個元素指示文本中第i個單詞的頻率。

地面真相標簽數據也表示為具有4,000個元素的向量,例如[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

# hidden Layer
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

# output Layer
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

# model
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)

    # loss function
    out = o_layer.output()
    cross_entropy = -tf.reduce_sum(y_*tf.log(out + 1e-9), name='xentropy')    

    # regularization
    l2 = (tf.nn.l2_loss(h_layer.w) + tf.nn.l2_loss(o_layer.w))
    lambda_2 = 0.01

    # compute loss
    loss = cross_entropy + lambda_2 * l2

    # compute accuracy for single label classification task
    correct_pred = tf.equal(tf.argmax(out, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, "float"))

    return loss, accuracy

您必須使用其他形式的交叉熵函數來支持多標簽分類。 如果輸出數量少於一千,則應使用sigmoid_cross_entropy_with_logits ,如果輸出數量為4000,則可以考慮候選采樣,因為它比以前更快。

如何使用TensorFlow計算准確性

這取決於您的問題和想要實現的目標。 如果您不希望丟失圖像中的任何對象,那么如果分類器除一個之外一切正常,則應將整個圖像視為錯誤。 您還可以認為錯過或錯過分類的對象是錯誤。 我認為后者受sigmoid_cross_entropy_with_logits支持。

如何設置一個閾值來判斷標簽是正還是負。 例如,如果輸出為[0.80、0.43、0.21、0.01、0.32],並且基本事實為[1、1、0、0、1],則得分大於0.25的標簽應被判斷為正。

閾值是一種解決方法,您必須確定哪種方法。 但這是某種黑客手段,不是真正的多分類。 為此,您需要我之前說過的以前的功能。

將relu更改為輸出層的S形。 將交叉熵損失修改為S型交叉熵損失的顯式數學公式(在我的情況下/張量流版本中,顯性損失有效)

import tensorflow as tf

# hidden Layer
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

# output Layer
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
        #changed relu to sigmoid
        self.output = tf.nn.sigmoid(linarg)

        return self.output

# model
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)

    # loss function
    out = o_layer.output()
    # modified cross entropy to explicit mathematical formula of sigmoid cross entropy loss
    cross_entropy = -tf.reduce_sum( (  (y_*tf.log(out + 1e-9)) + ((1-y_) * tf.log(1 - out + 1e-9)) )  , name='xentropy' )    

    # regularization
    l2 = (tf.nn.l2_loss(h_layer.w) + tf.nn.l2_loss(o_layer.w))
    lambda_2 = 0.01

    # compute loss
    loss = cross_entropy + lambda_2 * l2

    # compute accuracy for single label classification task
    correct_pred = tf.equal(tf.argmax(out, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, "float"))

    return loss, accuracy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM