【问题标题】:How to apply sigmoid function for each outputs in Keras?如何为 Keras 中的每个输出应用 sigmoid 函数?
【发布时间】:2019-02-05 00:49:39
【问题描述】:

这是我的代码的一部分。

model = Sequential()
model.add(Dense(3, input_shape=(4,), activation='softmax'))
model.compile(Adam(lr=0.1),
          loss='categorical_crossentropy',
          metrics=['accuracy'])

使用此代码,它将一次将 softmax 应用于所有输出。所以输出表示所有概率。但是,我正在研究非排他性分类,这意味着我希望输出具有独立的概率。 对不起,我的英语不好... 但我想做的是对每个输出应用 sigmoid 函数,这样它们就有独立的概率。

【问题讨论】:

    标签: python machine-learning keras deep-learning sigmoid


    【解决方案1】:

    无需像接受的答案所建议的那样创建 3 个单独的输出。

    只需一行即可达到相同的结果:

    model.add(Dense(3, input_shape=(4,), activation='sigmoid'))
    

    你可以在最后一层使用'sigmoid'激活:

    from tensorflow.keras.layers import GRU
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Dropout, Activation
    import numpy as np
    
    from tensorflow.keras.optimizers import Adam
    
    model = Sequential()
    model.add(Dense(3, input_shape=(4,), activation='sigmoid'))
    model.compile(Adam(lr=0.1),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
    
    pred = model.predict(np.random.rand(5, 4))
    print(pred)
    

    独立概率的输出:

    [[0.58463055 0.53531045 0.51800555]
     [0.56402034 0.51676977 0.506389  ]
     [0.665879   0.58982867 0.5555959 ]
     [0.66690147 0.57951677 0.5439698 ]
     [0.56204814 0.54893976 0.5488999 ]]
    

    如您所见,类概率是相互独立的。 sigmoid 分别应用于每个类。

    【讨论】:

    • 哇,我明白了。我想我在 Sigmoid 和 softmax 之间感到困惑......如果我使用 softmax,它不会是独立概率,对吧?我只需要使用 sigmoid。
    • 完全正确 - softmax 为您提供所有输出的概率分布,而 sigmoid 只是将您的输出映射到 0 到 1 之间的值。但对于每个值都是独立的。因此,没有必要像“Sreeram TP”的答案所建议的那样这样做。只需使用 sigmoid 即可获得相同的结果。
    • 我的独立概率在 sigmoid 中没有增加([0.08844085 0.00417994])。使用 softmax 我得到了正确的结果。将其更改为 softmax ([0.98502016 0.0149798 ])。为什么它在 sigmoid 中表现不佳?
    • @GiriAnnamalaiM Softmax 和 Sigmoid 是两个完全不同的函数,用于完全不同的目的。解释差异对于评论来说太多了。我强烈建议您阅读更多有关 Sigmoid 和 Softmax 的内容,并尝试了解其中的区别。如果您仍然卡住,可以在这里提出问题,包括问题的必要细节!
    • @blue-phoenox 我就此提出了一个问题。检查这个stackoverflow.com/questions/55469601/…
    【解决方案2】:

    您可以尝试使用功能 API 创建具有 n 个输出的模型,其中每个输出都使用sigmoid 激活。

    你可以这样做

    in = Input(shape=(4, ))
    
    dense_1 = Dense(units=4, activation='relu')(in)
    
    out_1 = Dense(units=1, activation='sigmoid')(dense_1)
    out_2 = Dense(units=1, activation='sigmoid')(dense_1)
    out_3 = Dense(units=1, activation='sigmoid')(dense_1)
    
    model = Model(inputs=[in], outputs=[out_1, out_2, out_3])
    

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 2020-06-16
      • 1970-01-01
      • 2017-05-15
      • 2020-12-05
      • 2018-01-08
      • 2018-08-14
      • 2018-03-17
      • 1970-01-01
      相关资源
      最近更新 更多