¿Aumentar los valores de salida de la predicción sigmoide?

Creé un modelo Conv1D para la clasificación de texto.

Cuando se utiliza softmax / sigmoide en la última densidad, se obtiene el resultado como

softmax => [0.98502016 0.0149798 ] sigmoid => [0.03902826 0.00037046] 

Solo quiero que el primer índice del resultado sigmoide sea ​​al menos mayor que 0,8 . Solo quiero que las multi-clases tengan resultados independientes. ¿Cómo logro esto?

Resumen Modelo:

 _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding (Embedding) (None, 128, 100) 600 _________________________________________________________________ conv1d (Conv1D) (None, 126, 128) 38528 _________________________________________________________________ max_pooling1d (MaxPooling1D) (None, 63, 128) 0 _________________________________________________________________ conv1d_1 (Conv1D) (None, 61, 128) 49280 _________________________________________________________________ max_pooling1d_1 (MaxPooling1 (None, 30, 128) 0 _________________________________________________________________ conv1d_2 (Conv1D) (None, 28, 128) 49280 _________________________________________________________________ max_pooling1d_2 (MaxPooling1 (None, 14, 128) 0 _________________________________________________________________ flatten (Flatten) (None, 1792) 0 _________________________________________________________________ dense (Dense) (None, 2) 3586 ================================================================= Total params: 141,274 Trainable params: 141,274 Non-trainable params: 0 _________________________________________________________________ model.add(keras.layers.Dense(num_class, activation='sigmoid')) model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc']) 

Estoy de acuerdo con el comentario de @ blue-phoenox en que no debes usar sigmoid con entropía cruzada porque la sum de probabilidades de las clases no es igual a una. Pero si tiene razones para usar sigmoid , puede normalizar su salida por la sum de los elementos vectoriales para que sea igual a 1:

 output = output/tf.reshape(tf.reduce_sum(output, 1), (-1, 1)) 

Y obtendrá:

 import tensorflow as tf output = tf.Variable([[0.03902826, 0.00037046]]) output = output/tf.reshape(tf.reduce_sum(output, 1), (-1, 1)) summedup = tf.reduce_sum(output, axis=1) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(output.eval()) # [[0.9905971 0.00940284]] - new output print(summedup.eval()) # [1.] - summs up to 1 

Para implementarlo en keras puedes crear una subclase de tf.keras.layers.Layer así:

 from tensorflow.keras import layers class NormLayer(layers.Layer): def __init__(self): super(NormLayer, self).__init__() def call(self, inputs): return inputs / tf.reshape(tf.reduce_sum(inputs, 1), (-1, 1)) 

Y luego utilícelo dentro de su modelo Sequential() :

 # using dummy data to illustrate x_train = np.array([[-1.551, -1.469], [1.022, 1.664]], dtype=np.float32) y_train = np.array([[0, 1], [1, 0]], dtype=np.int32) model = tf.keras.models.Sequential() model.add(tf.keras.layers.Dense(units=2, activation=tf.nn.sigmoid, input_shape=(2, ))) model.add(NormLayer()) model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) model.fit(x=x_train, y=y_train, epochs=2, batch_size=2) # ... 

Sigmoid produce una salida entre 0 y 1. Si está utilizando la misma función de pérdida para softmax y sigmoid, entonces no funcionará. Intente binary_crossentropy en su lugar. Y si tiene más de 2 clases, no creo que sigmoid sea lo que está buscando.