Tensorflow: перекрестная энтропия для классификации нескольких меток - PullRequest
0 голосов
/ 11 мая 2018

Я использую нейронную сеть для классификации набора объектов в n-классы.Каждый объект может принадлежать нескольким классам одновременно (несколько классов, несколько меток).

Например:

Input is ['a','b','c']  and labels are  [1,0,0,1,1,1]  # where 1 means it is in class and 0 means it's not in class  it's multi labels classification

Я ищу и обнаружил, что люди предлагают использовать сигмоидвместо softmax в задачах с несколькими метками.

некоторые ссылки:

Классификация настроений и жанров

предложение группы Reddit на мульти-лейблеклассификация

Отличный блог по объяснению теории классификации по нескольким меткам

еще один хороший учебник по мульти-лейблам

Вопрос об обмене стека

Теперь, прочитав эти вещи, я понял, что мне следует пойти на сигмовидную кишку, но у меня мало путаницы:

, поэтому для одиночной классификации, что я делал:

После модели (скрытые слои с lstm) я строил полностью связанный слой:

    #weights
    Wo = tf.get_variable('Wo', 
                    shape=[hdim*2, num_labels], 
                    dtype=tf.float32, 
                    initializer=tf.random_uniform_initializer(-0.01, 0.01))


   #bias
   bo = tf.get_variable('bo', 
                    shape=[num_labels,], 
                    dtype=tf.float32, 
                    initializer=tf.random_uniform_initializer(-0.01, 0.01))


  #logits
  logits = tf.matmul(tf.concat([fsf.c, fsb.c], axis=-1), Wo) + bo


   #probability 
   probs  = tf.nn.softmax(logits)

   #taking max probability
   preds  = tf.argmax(probs, axis=-1)


   # Cross Entropy
   ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels)

   #loss
   loss = tf.reduce_mean(ce)

   # Accuracy
   accuracy = tf.reduce_mean(
                            tf.cast(
                                tf.equal(tf.cast(preds, tf.int32), labels),
                                tf.float32
                                )
  #training                         )
  trainop = tf.train.AdamOptimizer().minimize(loss)

Но в мульти-лейблах, как я должен принимать входные данные:

так что я попробовал:

   #weights
    Wo = tf.get_variable('Wo', 
                    shape=[hdim*2, num_labels], 
                    dtype=tf.float32, 
                    initializer=tf.random_uniform_initializer(-0.01, 0.01))


   #bias
   bo = tf.get_variable('bo', 
                    shape=[num_labels,], 
                    dtype=tf.float32, 
                    initializer=tf.random_uniform_initializer(-0.01, 0.01))


  #logits
  logits = tf.matmul(tf.concat([fsf.c, fsb.c], axis=-1), Wo) + bo


   #probability 
   probs  = tf.nn.sigmoid(logits)

   #taking max probability
   preds  = tf.round(probs)




   # Cross Entropy
   ce = tf.nn.sigmoid_cross_entropy_with_logits(logits=logits, labels=labels)

   #loss
   loss = tf.reduce_mean(ce)

   # Accuracy
   accuracy = tf.reduce_mean(
                            tf.cast(
                                tf.equal(tf.cast(preds, tf.int32), labels),
                                tf.float32
                                )
  #training                         )
  trainop = tf.train.AdamOptimizer().minimize(loss)

Это тПравильный подход, я делаю правильно или нуждаюсь в исправлении где-нибудь?

Если я перехожу к tf.nn.sigmoid, нужно ли мне переходить на tf.nn.sigmoid_cross_entropy_with_logits или нет ??

Спасибо Вам.

...