train santa not neural network net multi learning convolutional conv classifier python neural-network keras multilabel-classification

python - santa - ¿Cómo maneja Keras la clasificación multicabel?



santa not santa keras (1)

En breve

No uses softmax .

Use sigmoid para la activación de su capa de salida.

Use binary_crossentropy para la función de pérdida.

Utilice predict para la evaluación.

Por qué

En softmax al aumentar la puntuación para una etiqueta, todas las demás se reducen (es una distribución de probabilidad). No quieres eso cuando tienes varias etiquetas.

Código completo

from keras.models import Sequential from keras.layers import Dense, Dropout, Activation from keras.optimizers import SGD model = Sequential() model.add(Dense(5000, activation=''relu'', input_dim=X_train.shape[1])) model.add(Dropout(0.1)) model.add(Dense(600, activation=''relu'')) model.add(Dropout(0.1)) model.add(Dense(y_train.shape[1], activation=''sigmoid'')) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss=''binary_crossentropy'', optimizer=sgd) model.fit(X_train, y_train, epochs=5, batch_size=2000) preds = model.predict(X_test) preds[preds>=0.5] = 1 preds[preds<0.5] = 0 # score = compare preds and y_test

No estoy seguro de cómo interpretar el comportamiento predeterminado de Keras en la siguiente situación:

Mi Y (verdad básica) se configuró utilizando el MultilabelBinarizer () de scikit-learn.

Por lo tanto, para dar un ejemplo aleatorio, una fila de mi columna y está codificada en caliente como tal: [0,0,0,1,0,1,0,0,0,0,1] .

Entonces tengo 11 clases que podrían predecirse, y más de una puede ser cierta; De ahí la naturaleza multicabel del problema. Hay tres etiquetas para esta muestra en particular.

Entreno el modelo como lo haría para un problema que no es de múltiples capas (negocios como siempre) y no obtengo errores.

from keras.models import Sequential from keras.layers import Dense, Dropout, Activation from keras.optimizers import SGD model = Sequential() model.add(Dense(5000, activation=''relu'', input_dim=X_train.shape[1])) model.add(Dropout(0.1)) model.add(Dense(600, activation=''relu'')) model.add(Dropout(0.1)) model.add(Dense(y_train.shape[1], activation=''softmax'')) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss=''categorical_crossentropy'', optimizer=sgd, metrics=[''accuracy'',]) model.fit(X_train, y_train,epochs=5,batch_size=2000) score = model.evaluate(X_test, y_test, batch_size=2000) score

¿Qué hace Keras cuando se encuentra con mi y_train y ve que está codificado en caliente "multi", lo que significa que hay más de un ''uno'' presente en cada fila de y_train ? Básicamente, ¿Keras realiza automáticamente la clasificación de múltiples etiquetas? ¿Alguna diferencia en la interpretación de las métricas de puntuación?