我应该使用 softmax 还是 tf.nn.sigmoid_cross_entropy

我正在阅读有关 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

列:


DNASeq -> 一串 DNA 序列(即“序列”)

Sample1Name -> 分类值,解释 DNASeq 所在溶液的化学性质。

Sample2Name -> 分类值,解释 DNASeq 所在溶液的化学性质。

ConcOfDNAInSample -> Sample2SName 中 DNA 浓度的定量值。

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),但是因为 DNA 位可以粘在一起,它们随后可以在其他类中(found_in_1、found_in_2、found_in_3 )

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

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

  4. 从我的数据可以看出,我的数据集是不平衡的,found_in_3中的数据量明显低于其他(我的完整训练数据大约80000行;但是其中只有大约10000行是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 点中看到的代表性不足的地方)。我有一系列的功能......所以假设我有一个标准化的数据集,即上表。

所以我知道我想为我的数据复制一组类似的步骤,并且我正在尝试解决如何做到这一点,我无法理解的是我是否必须使用 tf.nn.sigmoid_cross_entropy_with_logits 来解决这个问题(因为每个输入都可以属于移动而不是一个标签,即可以存在于found_in_1、found_in_2和found_in_3中,这可以产生每个类的概率输出?)


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


素胚勾勒不出你
浏览 104回答 3
3回答

幕布斯6054654

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

慕盖茨4494581

softmax和之间有根本的区别sigmoid_cross_entropy_with_logits。第一个应用softmax函数。本质上,您提供输入的非标准化分数(logits)并输出可以解释为概率的标准化值。另一方面,sigmoid_cross_entropy_with_logits首先会得到一个 sigmoid,然后labales以数值稳定的方式计算交叉熵(反对 ,它的第一个参数!)。更详细的解释可以在这里找到,例如。我猜你追求的是softmax.

蓝山帝景

经验法则:假设您有多个类/标签,每个样本是否恰好属于一个类(只有一个标签)?是的:多类。使用 softmax 进行激活,使用 [sparse] 分类交叉熵进行损失。不,对象可以同时属于多个类:多标签。使用 sigmoid 进行激活,使用二元交叉熵进行损失。根据描述,我不确定您的情况是什么情况。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python