Auparavant, j'ai créé un article appelé Classification de texte avec NN convolutionnel récurrent et j'ai écrit le code pour classer le texte avec R-CNN qui n'est pas une image.
A ce moment, j'ai écrit que "covolution_2d ne peut pas être utilisé pour la convolution sur l'axe x fixe", mais en réalité, c'est une méthode de convolution similaire au traitement des images (application d'un filtre en se déplaçant dans les directions x et y). Mais la performance semble sortir. Il y avait une personne qui a mis en œuvre Chainer par cette méthode.
Vous pouvez créer un grand vecteur bidimensionnel en connectant les vecteurs d'incorporation de mots tels qu'ils sont dans l'ordre des mots et l'utiliser pour apprendre le classificateur, mais en raison de la nature du texte, sa taille dépend de la longueur de la phrase. Par conséquent, dans l'implémentation précédente, la longueur maximale de toutes les phrases est mesurée une fois, fixée à cette taille (0 remplissage si nécessaire) et traitée.
C'est une façon de le faire, mais en utilisant le regroupement de pyramides spatiales pour la couche de regroupement, toute entrée de longueur peut être un vecteur de longueur fixe. En utilisant cela, vous pouvez créer un modèle qui accepte une entrée de longueur variable. Puisqu'il est implémenté en tant que fonction spatial_pyramid_ Covoiturage_2d dans Chainer, remplacez max_ Covoiturage_2d par ceci et combinez le nombre d'unités dans la couche FC intermédiaire avec la sortie de SPP pour terminer.
def __call__(self, x):
h1 = F.spatial_pyramid_pooling_2d(F.relu(self.conv1(x)), 2, F.MaxPooling2D) # max_pooling_Remplacer par 2d
h2 = F.dropout(F.relu(self.l1(h1)))
y = self.l2(h2)
return y
La précision du test est à peu près la même que l'original (environ 75%).
Recommended Posts