Le projet construit un réseau neuronal récurrent (RNN) pour la génération de musique. Le modèle est formé pour apprendre les modèles de partitions brutes en notation ABC, qui génèrent de la musique. L'ensemble de données est collecté à partir de Kaggle et contient la notation ABC des chansons. Lien : https://www.kaggle.com/datasets/raj5287/abc-notation-of-tunes?datasetId=156963&sortBy=dateRun&tab=profile Le texte de l'ensemble de données est d'abord vectorisé pour créer une représentation numérique afin de maintenir une table de recherche. Nous utiliserons quelques exemples de séquences pour entraîner le RNN avec une longueur de séquence définie. Il y aura également une séquence cible pour la prédiction du caractère suivant. Ceci sera implémenté à l'aide de la méthode batch qui convertira ce flux d'index de caractères en séquences de la taille souhaitée. Le modèle RNN que nous créons sera basé sur l'architecture LSTM et possède un initialiseur "glorot_uniform" et une fonction d'activation "sigmoïde", où nous utiliserons un vecteur d'état pour conserver des informations sur les relations temporelles entre les caractères consécutifs. La sortie finale du LSTM est ensuite introduite dans une couche Dense entièrement connectée où nous générerons un softmax sur chaque caractère du vocabulaire, puis échantillonnerons à partir de cette distribution pour prédire le caractère suivant.
Couche 1 : Couche d'intégration pour transformer les indices en vecteurs denses d'une taille d'intégration fixe
Couche 2 : LSTM avec le nombre d'unités rnn_units.
Couche 3 : couche dense (entièrement connectée) qui transforme la sortie LSTM en taille du vocabulaire.
Le modèle RNN est ensuite entraîné en utilisant une forme de perte crossentropy (perte de vraisemblance log négative), c'est-à-dire la perte sparse_categorical_crossentropy, car il utilise des cibles entières pour les tâches de classification catégorielle. Nous voulons calculer la perte en utilisant les véritables cibles – les étiquettes – et les cibles prédites – les logits. Les hyperparamètres sont définis pour le réglage et l'optimisation. L'optimiseur Adam est utilisé comme optimiseur pour les opérations de formation. Le modèle est entraîné pour 3 000 itérations, avec une taille de lot de 10 et une longueur de séquence de 100. Le modèle apprend mieux lorsque le taux d'apprentissage est défini sur 1e-3. Pour générer de la musique, le modèle suit une procédure de prédiction :
Étape 1 : Initialisez une chaîne de démarrage « graine » et l'état RNN, et définissez le nombre de caractères que nous souhaitons générer.
Étape 2 : utilisez la chaîne de début et l'état RNN pour obtenir la distribution de probabilité sur le prochain caractère prédit.
Étape 3 : Échantillon à partir d’une distribution multinomiale pour calculer l’indice du caractère prédit. Ce caractère prédit est ensuite utilisé comme entrée suivante du modèle.
Étape 4 : À chaque pas de temps, l'état RNN mis à jour est réinjecté dans le modèle, afin qu'il dispose désormais de plus de contexte pour effectuer la prédiction suivante. Après avoir prédit le caractère suivant, les états RNN mis à jour sont à nouveau réinjectés dans le modèle, ce qui permet d'apprendre les dépendances de séquence dans les données, à mesure qu'il obtient plus d'informations des prédictions précédentes.
Désormais, le modèle génère des chansons avec un "start_string" et un "generation_length" définis par l'utilisateur.