Как применить сигмовидную функцию для каждого выхода в Keras? - PullRequest
0 голосов
/ 30 августа 2018

Это часть моих кодов.

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

с этим кодом, он будет применять softmax ко всем выходам одновременно. Таким образом, вывод указывает вероятность среди всех. Тем не менее, я работаю над неисключительным классификатором, что означает, что я хочу, чтобы выходные данные имели независимую вероятность. Извини я плохо знаю английский... Но я хочу применить сигмоидную функцию к каждому выходу, чтобы они имели независимые вероятности.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Нет необходимости создавать 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 ]]

Как видите, классы вероятностей не зависят друг от друга. Сигмоид применяется к каждому классу отдельно.

0 голосов
/ 30 августа 2018

Вы можете попробовать использовать Functional 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])
...