¿Cómo agregar una nueva categoría a un modelo de aprendizaje profundo?

15

Digamos que he realizado el aprendizaje de transferencia en una red pre-entrenada para reconocer 10 objetos. ¿Cómo agrego un undécimo elemento que la red puede clasificar sin perder las 10 categorías que ya entrené ni la información del modelo original previamente entrenado? Un amigo me dijo que se está realizando una investigación activa en este campo, pero que no puedo encontrar documentos relevantes o un nombre para buscar.

Gracias.

nnrales
fuente
Si entrenas con mucha más clase, entonces hay? ¿eso puede ayudar? Por ejemplo, supongamos que sabe que no habrá más de 1000 clases. Entrenas desde el principio tu clasificador con 1000 clases en las 10 clases que tienes actualmente, y cuando tienes más clases, simplemente mantienes el tren en ellas ... ¿Puede ser una buena solución? ¿Hay algún documento sobre este enfoque?
Michael

Respuestas:

13

Si este es solo un caso de una sola vez, simplemente puede volver a entrenar la red neuronal. Si con frecuencia tiene que agregar nuevas clases, esta es una mala idea. Lo que desea hacer en tales casos se llama recuperación de imágenes basada en contenido (CBIR), o simplemente recuperación de imágenes o búsqueda visual. Explicaré ambos casos en mi respuesta a continuación.

Caso de una sola vez

Si esto solo sucede una vez, usted olvidó la clase 11, o su cliente cambió de opinión, pero no volverá a suceder , entonces puede simplemente un 11 ° nodo de salida a la última capa. Inicialice los pesos de este nodo al azar, pero use los pesos que ya tiene para las otras salidas. Luego, solo entrena como de costumbre. Puede ser útil arreglar algunos pesos, es decir, no entrenarlos.

Un caso extremo sería entrenar solo los nuevos pesos y dejar todos los demás fijos. Pero no estoy seguro de si esto funcionará tan bien, podría valer la pena intentarlo.

Recuperación de imágenes basada en contenido.

Considere el siguiente ejemplo: está trabajando para una tienda de CD, que quiere que sus clientes puedan tomar una foto de la portada de un álbum, y la aplicación les muestra el CD que escanearon en su tienda en línea. En ese caso, tendría que volver a entrenar la red para cada nuevo CD que tengan en la tienda. Eso podría ser 5 nuevos CD cada día, por lo que volver a entrenar la red de esa manera no es adecuado.

La solución es entrenar una red, que mapea la imagen en un espacio de características. Cada imagen estará representada por un descriptor, que es, por ejemplo, un vector de 256 dimensiones. Puede "clasificar" una imagen calculando este descriptor y comparándolo con su base de datos de descriptores (es decir, los descriptores de todos los CD que tiene en su tienda). El descriptor más cercano en la base de datos gana.

¿Cómo se entrena una red neuronal para aprender un vector descriptor de este tipo? Ese es un campo activo de investigación. Puede encontrar trabajo reciente buscando palabras clave como "recuperación de imágenes" o "aprendizaje métrico".

En este momento, las personas generalmente toman una red pre-entrenada, por ejemplo, VGG-16, cortan las capas FC y usan la convolucional final como su vector descriptor. Puede entrenar aún más esta red, por ejemplo, utilizando una red siamesa con pérdida de triplete.

hbaderts
fuente
He estado estudiando el aprendizaje de una sola vez. ¿Crees que eso me puede ayudar?
nnrales
Realmente no sé sobre el aprendizaje de una sola vez. Pero los documentos de aprendizaje profundo de una sola vez que encontré se parecen bastante al enfoque de CBIR, por lo que definitivamente podría ser útil para usted
hbaderts
2

La topología de su red puede verse diferente, pero al final, su red pre-entrenada tiene una capa que maneja el reconocimiento de 10 clases originales. El truco más fácil (y funcional) para introducir la clase 11, 12 .. enésima, es usar todas las capas antes de la última según lo otorgado y agregar una capa adicional (en un nuevo modelo, o como una paralela) que también se sentará encima de todas las capas, excepto las últimas, se verá igual a la capa de 10 clases (que probablemente sea una capa densa y una matriz de forma[len(dense layer), 10] con sesgo opcional).

Tu nueva capa sería una capa matmul con forma [len(dense layer), len(new classes)] .

Sin acceso a los datos de entrenamiento originales, tendría dos opciones:

  1. Congele todos los pesos en capas originales permitiendo que el "nuevo" modelo optimice solo nuevos pesos. Eso le dará exactamente el mismo poder predictivo para las 10 clases originales y podría ofrecer un rendimiento correcto para las nuevas.
  2. Entrene toda la red a la vez (propagando el error de nuevas clases), lo que podría estar funcionando para las nuevas clases, pero terminará con una solución original ineficaz para 10 clases (ya que los pesos se cambiarán para las clases más bajas y la capa final) no se actualizará para que coincida con esos cambios).

Aunque, dado que tiene acceso a los datos de entrenamiento originales, puede agregar fácilmente una nueva clase a la red original y volver a entrenarla para admitir 11 clases listas para usar.

chewpakabra
fuente
2

Esto se puede hacer fácilmente.

Primero construya un modelo con esas 10 clases y guarde el modelo como base_model.

Cargue base_model y también defina un nuevo modelo llamado new_model como-

new_model = Sequential()

Luego agregue las capas de base_model a new_model -

# getting all the layers except the last two layers
for layer in base_model.layers[:-2]: #just exclude the last two layers from base_model
    new_model.add(layer)

Ahora haga que las capas del nuevo modelo no sean entrenables ya que no desea que su modelo sea entrenado nuevamente.

# prevent the already trained layers from being trained again
for layer in new_model.layers:
    layer.trainable = False

Ahora, a medida que transfiere el aprendizaje, cuando elimina las últimas capas, el modelo se olvida de las 10 clases, por lo que tenemos que retener los pesos del modelo base al modelo nuevo.

weights_training = base_model.layers[-2].get_weights()
new_model.layers[-2].set_weights(weights_training) 

Ahora agregue una capa densa al final y solo entrenaremos esta capa densa en este ejemplo.

new_model.add(Dense(CLASSES, name = 'new_Dense', activation = 'softmax'))

Ahora entrene al modelo y espero que dé el resultado correcto para todas las 11 clases.

Feliz aprendizaje.

Subham Tiwari
fuente