【问题标题】:Should I use softmax or tf.nn.sigmoid_cross_entropy_with_logits to generate a multi class classification with a probability per class?我应该使用 softmax 还是 tf.nn.sigmoid_cross_entropy_with_logits 来生成每个类概率的多类分类?
【发布时间】:2020-04-27 00:08:25
【问题描述】:

我正在阅读关于 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 -> 一串 DNA 序列(即“序列”)
  2. Sample1Name -> 分类值,解释 DNASeq 所在溶液的化学性质。
  3. Sample2Name -> 分类值,解释 DNASeq 所在溶液的化学性质。
  4. ConcOfDNAInSample -> Sample2SName 中 DNA 浓度的定量值。
  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)

有一些注意事项:

    1234563 (found_in_1, found_in_2, found_in_3)
  1. 我只对 found_in_1、found_in_2 和 found_in_3 类的输出感兴趣(即,我想要最后的三类概率,而不是 found_in_0 的四类概率)。

  2. 我能够从 DNA 序列中生成其他特征,这只是一个示例。

  3. 从我的数据可以看出,我的数据集是不平衡的,found_in_3 中的数据量明显低于其他(我的完整训练数据大约 80,000 行;但其中只有大约 10,000 行是found_in_3;其他都是found_in_0、found_in_1或found_in_2)。

我要解决的是算法,特别是针对一个特定点。我的想法是:

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

我知道这里的一般想法是在 keras 中执行此操作的 tensorflow 等效项(即,这是针对“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中,这可以产生每个类的概率输出?)

或者我可以只使用像 this 这样的 softmax 函数吗?

【问题讨论】:

    标签: python tensorflow machine-learning keras


    【解决方案1】:

    softmaxsigmoid_cross_entropy_with_logits 之间存在根本区别。第一个应用softmax 函数。本质上,您提供输入的非标准化分数(logits)并输出可以解释为概率的标准化值。

    另一方面,sigmoid_cross_entropy_with_logits 将首先为您提供一个 sigmoid,然后以数值稳定的方式计算交叉熵(针对 labales,它的第一个参数!)。

    可以找到更详细的解释,例如here。我猜你想要的是softmax

    【讨论】:

      【解决方案2】:

      经验法则:假设您有多个类/标签,每个样本是否恰好属于一个类(只有一个标签)?

      是的: 多类。使用 softmax 进行激活,使用 [sparse] 分类交叉熵进行损失。

      ,对象可以同时属于多个类:多标签。使用 sigmoid 进行激活,使用二元交叉熵进行损失。

      根据描述,我不确定您的情况是什么情况。

      【讨论】:

        【解决方案3】:

        如果每个输入可以属于多个标签/类,则需要使用tf.nn.sigmoid_cross_entropy_with_logits。如果您在模型输出中使用sigmoid,您将获得3 标签的3 概率。您可以阅读更多详细信息here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-16
          • 2019-11-16
          • 2020-05-23
          • 2018-10-12
          • 1970-01-01
          • 2019-07-20
          • 2019-11-10
          相关资源
          最近更新 更多