web-dev-qa-db-ja.com

TensorFlowを使用したマルチラベルテキスト分類

テキストデータは、[2、1、0、0、5、....、0]のような20,000個の要素を持つベクトルとして編成されます。 i番目の要素は、テキスト内のi番目の単語の頻度を示します。

グラウンドトゥルースラベルデータは、[0、0、1、0、1、....、0]のような4,000要素のベクトルとしても表されます。 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
34
Benben

Reluを出力レイヤーのシグモイドに変更します。クロスエントロピー損失をシグモイドクロスエントロピー損失の明示的な数式に変更します(明示的な損失は私の場合/テンソルフローのバージョンで機能していました)

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
13
Alok Nayak

マルチラベル分類をサポートするには、他のクロスエントロピー関数のバリエーションを使用する必要があります。 1000未満の出力がある場合は sigmoid_cross_entropy_with_logits を使用する必要があります。4000の出力がある場合は、 候補サンプリング を使用する必要があります。

TensorFlowを使用して精度を計算する方法。

これは、あなたの問題と何を達成したいかによって異なります。画像内のオブジェクトを見逃したくない場合は、分類器が1つを除いてすべて正しい場合、画像全体をエラーと見なす必要があります。また、見逃したオブジェクトや分類ミスしたオブジェクトはエラーであると考えることもできます。後者はsigmoid_cross_entropy_with_logitsによってサポートされていると思います。

ラベルが正か負かを判断するしきい値を設定する方法。たとえば、出力が[0.80、0.43、0.21、0.01、0.32]で、グランドトゥルースが[1、1、0、0、1]である場合、スコアが0.25を超えるラベルは正と判断されます。

しきい値は移動する1つの方法であり、どちらを決定する必要があります。しかし、それはある種のハックであり、実際の乗算可能な分類ではありません。そのためには、前に言った以前の機能が必要です。

14
jorgemf