Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于TensorFlow的多标签文本分类_Python_Tensorflow_Text Classification_Multilabel Classification - Fatal编程技术网

Python 基于TensorFlow的多标签文本分类

Python 基于TensorFlow的多标签文本分类,python,tensorflow,text-classification,multilabel-classification,Python,Tensorflow,Text Classification,Multilabel Classification,文本数据被组织为具有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.3

文本数据被组织为具有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

# 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

为了支持多标签分类,您必须在其他方面使用交叉熵函数的变体。如果你有少于一千的输出,你应该使用,在你的情况下,你有4000个输出,你可以考虑,因为它比以前更快。 如何使用TensorFlow计算精度

这取决于你的问题和你想要达到的目标。如果你不想错过一个图像中的任何对象,那么如果分类器得到正确的,但是一个,那么你应该认为整个图像是一个错误。你也可以考虑遗漏或错误分类的对象是一个错误。后者我认为是由sigmoid,cross,entropy和logits支持的

如何设置判断标签是否为正数的阈值 消极的例如,如果输出为[0.80,0.43,0.21,0.01, 0.32]而基本事实是[1,1,0,0,1],分数超过0.25的标签应被判定为阳性


门槛是一条路要走,你必须决定哪一条。但这是某种黑客行为,不是真正的多标签分类。为此,您需要我前面提到的函数。

将relu更改为输出层的sigmoid。 将交叉熵损失修改为sigmoid交叉熵损失的显式数学公式(显式损失在我的案例/tensorflow版本中有效)


我认为除了交叉熵之外,可能还有更好的损失函数可以使用。对于多标签分类问题,有许多不同的准确度度量:一个错误准确度、秩损失、平均准确度等。我自己仍在学习TensorFlow,尚未成功地实现其中任何一个。但也许这篇论文会帮助你:如果你有任何进展,请告诉我!为了更好地计算精度,考虑计算精度和回想起。@ Benben什么是<代码> y> 我不知道它的定义。我不知道为什么人们建议“SigoMIDIXOXION EngPyPixLogLog'”。如果它是它的名字所暗示的,即-Y*ln(sigmoid(logits))。然后,它将通过给每个类赋予高概率来最小化损失,事实上,在我的例子中,它给出了高概率。这个函数不返回概率。我看不出它如何通过给出一个高值来最小化损失。如果将类设置为1,当类不存在时设置为0,则当对象不在图像中时,网络会给出接近0的值,如果对象在图像中,则网络会给出接近1或更大的值(甚至2 o3)。我正在使用它,并且工作得很好。它将通过给每个类赋予一个高值来最小化损失,因为给标记为0的类赋予高值不会带来任何惩罚(或0损失)。所以我们需要用二元交叉熵(y*ln(sigmoid(logits))+1-y*ln(sigmoid(1-logits)))来修正交叉熵损失。sigmoid_cross_entropy_with_logits没有在内部实现二进制交叉熵。我很惊讶为什么它在你们的案例中起作用,你们在使用theano etcI吗?我认为你们在数学上是错的。它是:y*ln(sigmoid(logits))+(1-y)*ln(1-sigmoid(logits))所以:logits=0,y=0=>0;logits=1,y=1=>0;logits=1,y=0=>1.3;logits=0,y=1=>1.3;你可以用数字在谷歌游戏中绘制函数。只要搜索y*-ln(1/(1+e^-x))+(1-y)*-ln(1-1/(1+e^-x))我的坏,忽略我上面的数学。这里是我使用的,对我有用,-tf.reduce_平均值(tf.mul(y,tf.log(tf.nn.sigmoid(logits)+1e-9))+tf.mul(1-y,tf.log(1-tf.nn.sigmoid(logits)+1e-9))。这起作用了,而你的建议没有起作用,如果我的论点有错,请告诉我
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