4

这是我的代码的一部分。

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

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

4

2 回答 2

7

无需像接受的答案所建议的那样创建 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 分别应用于每个类。

于 2018-08-30T08:16:12.743 回答
4

您可以尝试使用功能 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])
于 2018-08-30T07:14:32.170 回答