Должен ли я использовать softmax или tf.nn.sigmoid_cross_entropy_with_logits для генерации мультиклассовой классификации с вероятностью на класс? - PullRequest
0 голосов
/ 26 апреля 2020

Я читаю о NN, а также хотел бы создать свой первый NN одновременно (чтобы дополнить мое чтение).

У меня есть такой набор данных:

DNA_seq  Sample1Name  Sample1Name  ConcOfDNAInSample  DNASeqFoundInProcessCat

AGGAG     cat_0     cat_1    0.1   found_in_0  
AGGAG     cat_1     cat_2    0.4   found_in_3
ACCCC     cat_1     cat_7    0.1   found_in_2
AGAGAGA   cat_2     cat_10   1.9   found_in_1
ADAS      cat_332   cat_103  8.9   found_in_1

Столбцы:

  1. DNASeq -> строка последовательности ДНК (т.е. sequence ')
  2. Sample1Name -> категориальное значение, объясняющее химическое свойство раствора, в котором находится DNASeq.
  3. Sample2Name -> категориальное значение, объясняющее химическое свойство раствора, в котором DNASeq.
  4. ConcOfDNAInSample -> количественное значение концентрации ДНК в Sample2SName.
  5. DNASeqFoundInProcessCat -> Это метка, которую я хочу предсказать. Это категориальное значение с четырьмя категориями (found_in_0 -> found_in_3). Это выходные данные, где я провел три теста для каждого DNASeq, чтобы увидеть, манипулирую ли я исходным решением (которое является found_in_0), присутствует ли DNASeq.

Мой вопрос: Для невидимый набор последовательностей, я хочу, чтобы выходной набор меток был мультиклассовой вероятностью 'found_in_1', 'found_in_2', 'found_in_3'.

, т. е. если приведенный выше пример был выводом из моего теста установить, мой вывод в идеале должен выглядеть так:

DNA_seq  Sample1Name  Sample1Name  ConcOfDNAInSample  DNASeqFoundInProcessCat

AGGAG     cat_0     cat_1    0.1   (0.9,0.5,0.1)  
AGGAG     cat_1     cat_2    0.4   (0.8,0.7,0.3)
ACCCC     cat_1     cat_7    0.1   (0.2,0.5,0.3)
AGAGAGA   cat_2     cat_10   1.9   (0.7,0.2,0.9)
ADAS      cat_332   cat_103  8.9   (0.6,0.8,0.7)

Есть несколько примечаний:

  1. Возможно, что из-за процессов, которые я выполняю, некоторые последовательности не могут быть в исходном решении (found_in_0), но тогда, поскольку кусочки ДНК могут слипаться, они МОГУТ впоследствии быть в других классах (found_in_1, found_in_2, found_in_3)

  2. I меня интересуют только выходные данные для классов found_in_1, found_in_2 и found_in_3 (т. е. я хочу получить вероятность трех классов в конце, а не вероятность четырех классов с found_in_0).

  3. Я могу видеть из своих данных, что мой набор данных несбалансирован, объем данных в found_in_3 значительно ниже, чем у других (мои полные данные о тренировках составляют около 80 000 строк; но только около 10000 из этих строк найдены_в_3; остальные все - found_in_0, found_in_1 или found_in_2).

То, что я пытаюсь выяснить, - это алгоритм, в частности, для одной конкретной c точки. Моя идея была:

1.Читать данные.

df = pd.read_csv('data')

2. Разделить набор данных на поезд и проверить

import sklearn
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test = train_test_split(X,y,test_size=0.2,random_state=42)

3.Понимать набор данных (то есть, где я увидел недопредставление в пункте 4 выше). У меня есть ряд функций для этого ... так скажем, у меня есть стандартизированный набор данных, который приведен в таблице выше.

4.Создать нейронную сеть.

import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras import Model

Я знаю общая идея здесь будет эквивалентна тензорному потоку, делающему это в кератах (т.е. это для набора данных 'iris'; где я инициализирую модель, добавляю несколько слоев и функцию активации, компилирую модель, генерирую выходные данные модели и затем подгоните модель и затем прогнозируйте после этого (не показано)):

from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(8,input_dim=4,activation='relu'))
model.add(Dense(8,input_dim=4,activation='relu'))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(x_train,y_train, epochs=150,verbose=0)

Итак, я понимаю, что хочу повторить аналогичный набор шагов для моих данных, и я пытаюсь понять, как сделать это, что я не могу понять, это то, что я должен использовать tf.nn.sigmoid_cross_entropy_with_logits для этой проблемы (поскольку каждый вход может принадлежать перемещению, а не одной метке, то есть может присутствовать в found_in_1, found_in_2 и found_in_3, это может привести к выход вероятности на класс?)

Или я могу просто использовать функцию softmax, такую ​​как this ?

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

Практическое правило: если у вас есть несколько классов / меток, относится ли каждый образец к одному классу (имеет ровно одну метку)?

Да: мультикласс. Используйте softmax для активации и [разреженную] категориальную кросс-энтропию для потери.

Нет , объект может принадлежать нескольким классам одновременно: многолинейный. Используйте sigmoid для активации и двоичную перекрестную энтропию для потери.

Из описания я не уверен, что происходит в вашем сценарии.

0 голосов
/ 26 апреля 2020

Если каждый вход может принадлежать более чем одной метке / классу, вам нужно использовать tf.nn.sigmoid_cross_entropy_with_logits. Если вы используете sigmoid на выходе модели, вы получите 3 вероятности для 3 меток. Вы можете прочитать подробности здесь .

0 голосов
/ 26 апреля 2020

Существует принципиальная разница между softmax и sigmoid_cross_entropy_with_logits. Первый применяет функцию softmax . По сути, вы вводите на вход ненормализованные оценки (логиты) и выводите нормализованные значения, которые можно интерпретировать как вероятности.

С другой стороны, sigmoid_cross_entropy_with_logits сначала даст вам сигмоид, а затем вычислит перекрестную энтропию (против labales, ее первый аргумент!) Численно устойчивым способом.

Более подробное объяснение можно найти, например, здесь . Я думаю, что вы после того, как softmax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...