Quelle est l'importance de la fusion de modèles dans Keras?

10

J'ai appris que Keras a une fonctionnalité pour «fusionner» deux modèles selon ce qui suit:

from keras.layers import Merge

left_branch = Sequential()
left_branch.add(Dense(32, input_dim=784))

right_branch = Sequential()
right_branch.add(Dense(32, input_dim=784))

merged = Merge([left_branch, right_branch], mode='concat')

Quel est l'intérêt des NN fusionnés, dans quelles situations est-ce utile? Est-ce une sorte de modélisation d'ensemble? Quelle est la différence entre les différents "modes" (concat, avg, dot etc ...) dans le sens de la performance?

Hendrik
la source

Réponses:

14

Il est utilisé pour plusieurs raisons, fondamentalement, il est utilisé pour relier plusieurs réseaux ensemble. Un bon exemple serait où vous avez deux types d'entrée, par exemple des balises et une image. Vous pouvez construire un réseau qui a par exemple:

IMAGE -> Conv -> Max Pooling -> Conv -> Max Pooling -> Dense

TAG -> Incorporation -> Couche dense

Pour combiner ces réseaux en une seule prédiction et les former ensemble, vous pouvez fusionner ces couches denses avant la classification finale.

Les réseaux où vous avez plusieurs entrées en sont l'utilisation la plus 'évidente', voici une image qui combine des mots avec des images à l'intérieur d'un RNN, la partie multimodale est l'endroit où les deux entrées sont fusionnées:

Réseau neuronal multimodal

Un autre exemple est la couche Inception de Google où vous avez différentes convolutions qui sont ajoutées ensemble avant de passer à la couche suivante.

Pour alimenter plusieurs entrées vers Keras, vous pouvez passer une liste de tableaux. Dans l'exemple mot / image, vous auriez deux listes:

x_input_image = [image1, image2, image3]
x_input_word = ['Feline', 'Dog', 'TV']
y_output = [1, 0, 0]

Ensuite, vous pouvez adapter comme suit:

model.fit(x=[x_input_image, x_input_word], y=y_output]
Jan van der Vegt
la source
Désolé, je ne vois pas l'intérêt de créer des réseaux distincts pour les instances de formation et les étiquettes alors qu'il est possible de les alimenter dans un seul réseau dans la phase d'adaptation qui fait le travail de toute façon. Je peux voir que la fusion est une possibilité mais pas son avantage par rapport à la «non-fusion».
Hendrik
Comment les nourrissez-vous dans la phase d'adaptation? Les entrées sont toujours séparées, vous ne pouvez pas utiliser votre couche de convolution sur vos étiquettes, ces couches doivent donc être fusionnées d'une manière ou d'une autre.
Jan van der Vegt du
En Keras model.fit()accepte à la fois X et y pour l'ajustement et modeldans ce cas peut être aussi un modèle "non fusionné". Un peu comme les autres types de modèles dans Sklearn par exemple.
Hendrik
3
Les étiquettes peuvent être un nom mal choisi de mon côté, disons que vous avez une image et l'annotation avec cette image, et que vous souhaitez classer si cette combinaison concerne les chats ou non, alors vous avez deux types d'entrée et une sortie binaire . Pour obtenir la synergie entre eux, vous devrez fusionner les couches quelque part. Un autre exemple est celui où vous avez deux photos, une du haut et une du bas que vous devez classer ensemble
Jan van der Vegt
3
@Hendrik: Il n'y a pas de "modèles de composants", il n'y a qu'un seul modèle. Il s'agit d'un problème complexe, activé par la fonction de fusion des couches. Vous l'évaluez comme vous le faites pour n'importe quel modèle - c'est-à-dire avec une métrique par rapport à un ensemble de données de test de maintien (dans l'exemple image / mots avec des données comprenant des images, du texte partiel associé et le mot suivant comme étiquette à prévoir). Si vous le souhaitez, vous pouvez inspecter les couches du modèle pour voir ce qu'elles font - par exemple, l'analyse des entités CNN peut toujours être appliquée aux couches convolutives.
Neil Slater