O projeto constrói uma Rede Neural Recorrente (RNN) para geração de música. O modelo é treinado para aprender os padrões de partituras brutas em notação ABC, que gera música. O conjunto de dados é coletado do kaggle e contém notação ABC de músicas. Link: https://www.kaggle.com/datasets/raj5287/abc-notation-of-tunes?datasetId=156963&sortBy=dateRun&tab=profile O texto no conjunto de dados é primeiro vetorizado para criar representação numérica para manter uma tabela de pesquisa. Estaremos usando alguns exemplos de sequências para treinar o RNN com um comprimento de sequência definido. Haverá também uma sequência alvo para prever o próximo caractere. Isso será implementado usando o método em lote que converterá esse fluxo de índices de caracteres em sequências do tamanho desejado. O modelo RNN que criamos será baseado na arquitetura LSTM e possui inicializador “glorot_uniform” e função de ativação “sigmoid”, onde utilizaremos vetor de estado para manter informações sobre as relações temporais entre caracteres consecutivos. A saída final do LSTM é então alimentada em uma camada Densa totalmente conectada, onde produziremos um softmax sobre cada caractere do vocabulário e, em seguida, faremos uma amostra dessa distribuição para prever o próximo caractere.
Camada 1: Camada de incorporação para transformar índices em vetores densos de tamanho de incorporação fixo
Camada 2: LSTM com número de unidades rnn_units.
Camada 3: Camada densa (totalmente conectada) que transforma a saída LSTM no tamanho do vocabulário.
O modelo RNN é então treinado usando uma forma de perda de entropia cruzada (perda de probabilidade logarítmica negativa), ou seja, perda de entropia cruzada_categórica esparsa, pois utiliza alvos inteiros para tarefas de classificação categórica. Queremos calcular a perda usando os alvos verdadeiros – os rótulos – e os alvos previstos – os logits. Os hiperparâmetros são definidos para configuração e otimização. O otimizador Adam é usado como otimizador para operação de treinamento. O modelo é treinado para 3.000 iterações, com tamanho de lote 10 e comprimento de sequência 100. O modelo aprende melhor quando a taxa de aprendizado é definida como 1e-3. Para gerar música, o modelo segue um procedimento de predição:
Etapa 1: Inicialize uma string inicial "semente" e o estado RNN e defina o número de caracteres que queremos gerar.
Passo 2: Use a string inicial e o estado RNN para obter a distribuição de probabilidade sobre o próximo caractere previsto.
Passo 3: Amostra da distribuição multinomial para calcular o índice do caracter previsto. Esse caractere previsto é então usado como a próxima entrada do modelo.
Passo 4: A cada passo de tempo, o estado RNN atualizado é realimentado no modelo, para que agora tenha mais contexto para fazer a próxima previsão. Depois de prever o próximo caractere, os estados RNN atualizados são novamente realimentados no modelo, que é como ele aprende as dependências de sequência nos dados, à medida que obtém mais informações das previsões anteriores.
Agora, o modelo gera músicas com "start_string" e "generation_length" definidos pelo usuário.