Я использую нейронную сеть для классификации набора объектов в 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 или нет ??
Спасибо Вам.