Keras 如果可以激活多个输出,softmax层的替换是什么?

Keras 如果可以激活多个输出,softmax层的替换是什么?,keras,conv-neural-network,mnist,softmax,Keras,Conv Neural Network,Mnist,Softmax,例如,我有CNN,它试图从MNIST数据集(使用Keras编写的代码)预测数字。它有10个输出,形成softmax层。只有一个输出可以为真(独立于0到9之间的每个数字): 由于softmax的定义,预测值之和等于1.0 假设我有一项任务,需要对一些对象进行分类,这些对象可以分为几个类别: Real: [0, 1, 0, 1, 0, 1, 0, 0, 0, 1] 所以我需要用另一种方式正常化。我需要一个函数,它给出范围[0,1]上的值,它的和可以大于1 我需要这样的东西: Predicted:

例如,我有CNN,它试图从MNIST数据集(使用Keras编写的代码)预测数字。它有10个输出,形成softmax层。只有一个输出可以为真(独立于0到9之间的每个数字):

由于softmax的定义,预测值之和等于1.0

假设我有一项任务,需要对一些对象进行分类,这些对象可以分为几个类别:

Real: [0, 1, 0, 1, 0, 1, 0, 0, 0, 1]
所以我需要用另一种方式正常化。我需要一个函数,它给出范围[0,1]上的值,它的和可以大于1

我需要这样的东西:

Predicted: [0.1, 0.9, 0.05, 0.9, 0.01, 0.8, 0.1, 0.01, 0.2, 0.9]
每个数字都是对象属于给定类别的概率。之后,我可以使用一些阈值(如0.5)来区分给定对象所属的类别

出现以下问题:

  • 那么哪种激活功能可以用于此
  • Keras中是否已经存在此功能
  • 也许你可以提出一些其他的方法来预测这种情况

  • 您的问题是一个多标签分类问题,在Keras的上下文中,这里讨论了它,例如:

    简言之,keras中建议的解决方案是将softmax层替换为sigmoid层,并使用二进制交叉熵作为成本函数

    该线程中的一个示例:

    # Build a classifier optimized for maximizing f1_score (uses class_weights)
    
    clf = Sequential()
    
    clf.add(Dropout(0.3))
    clf.add(Dense(xt.shape[1], 1600, activation='relu'))
    clf.add(Dropout(0.6))
    clf.add(Dense(1600, 1200, activation='relu'))
    clf.add(Dropout(0.6))
    clf.add(Dense(1200, 800, activation='relu'))
    clf.add(Dropout(0.6))
    clf.add(Dense(800, yt.shape[1], activation='sigmoid'))
    
    clf.compile(optimizer=Adam(), loss='binary_crossentropy')
    
    clf.fit(xt, yt, batch_size=64, nb_epoch=300, validation_data=(xs, ys), class_weight=W, verbose=0)
    
    preds = clf.predict(xs)
    
    preds[preds>=0.5] = 1
    preds[preds<0.5] = 0
    
    print f1_score(ys, preds, average='macro')
    
    #构建一个为最大化f1_分数而优化的分类器(使用类权重)
    clf=顺序()
    clf.增加(辍学率(0.3))
    clf.add(稠密(xt.shape[1],1600,activation='relu'))
    clf.增加(辍学率(0.6))
    clf.add(密集型(1600、1200,激活='relu'))
    clf.增加(辍学率(0.6))
    clf.add(密集型(1200、800,激活='relu'))
    clf.增加(辍学率(0.6))
    clf.add(稠密(800,yt.shape[1],activation='sigmoid'))
    compile(优化器=Adam(),loss='binary\u crossentropy')
    clf.fit(xt,yt,批次大小=64,nb,epoch=300,验证数据=(xs,ys),类别权重=W,详细度=0)
    preds=clf.predict(xs)
    preds[preds>=0.5]=1
    
    preds[predsLooks一些有用的评论可以在这里找到:他们建议只使用sigmoid层。在这种情况下,我也会使用sigmoid层。然后出现另一个问题:loss='category\u crossentropy'的使用是否会给出足够的结果?谢谢。看起来这正是我需要的!
    # Build a classifier optimized for maximizing f1_score (uses class_weights)
    
    clf = Sequential()
    
    clf.add(Dropout(0.3))
    clf.add(Dense(xt.shape[1], 1600, activation='relu'))
    clf.add(Dropout(0.6))
    clf.add(Dense(1600, 1200, activation='relu'))
    clf.add(Dropout(0.6))
    clf.add(Dense(1200, 800, activation='relu'))
    clf.add(Dropout(0.6))
    clf.add(Dense(800, yt.shape[1], activation='sigmoid'))
    
    clf.compile(optimizer=Adam(), loss='binary_crossentropy')
    
    clf.fit(xt, yt, batch_size=64, nb_epoch=300, validation_data=(xs, ys), class_weight=W, verbose=0)
    
    preds = clf.predict(xs)
    
    preds[preds>=0.5] = 1
    preds[preds<0.5] = 0
    
    print f1_score(ys, preds, average='macro')