Compor músicas automaticamente
Quase imediatamente depois de aprender a programar, eu queria criar um software capaz de compor músicas.
Por vários anos, fiz tentativas primitivas de compor músicas automaticamente para
Visions of Chaos . Basicamente, foram utilizadas fórmulas matemáticas simples ou mutações genéticas de seqüências aleatórias de notas. Tendo alcançado recentemente um sucesso modesto no estudo e aplicação do TensorFlow e das redes neurais para
procurar autômatos celulares , decidi tentar usar redes neurais para criar música.
Como isso funciona
O compositor ensina uma rede neural com memória de
longo prazo (LSTM). As redes LSTM são adequadas para prever o que vem a seguir nas sequências de dados. Leia mais sobre LSTM
aqui .
Uma rede LSTM recebe várias seqüências de notas (nesse caso, são arquivos midi de canal único). Após treinamento suficiente, ela tem a oportunidade de criar músicas semelhantes aos materiais de ensino.
Os elementos internos do LSTM podem parecer intimidadores, mas o uso do
TensorFlow e / ou
Keras simplifica bastante a criação e a experimentação do LSTM.
Música de origem para treinamento de modelos
Para redes LSTM simples, basta que as composições de origem sejam um único canal midi. Ótimo para isso são arquivos midi do solo ao piano. Encontrei arquivos midi com solos de piano na
página e
mfiles do
Classical Piano e usei-os para treinar meus modelos.
Coloquei a música de diferentes compositores em pastas separadas. Graças a isso, o usuário pode selecionar Bach, clicar no botão Compor e obter uma música que (espero) seja como Bach.
Modelo LSTM
O modelo com base no qual escrevi o código selecionou
este exemplo do autor
Sigurður Skúli Sigurgeirsson , sobre quem ele escreve com mais detalhes
aqui .
Executei o script lstm.py e após 15 horas ele concluiu o treinamento. Quando executei o predict.py para gerar os arquivos midi, fiquei desapontado porque eles consistiam em uma nota repetida. Repetindo o treinamento duas vezes, obtive os mesmos resultados.
Modelo de origem
model = Sequential() model.add(CuDNNLSTM(512,input_shape=(network_input.shape[1], network_input.shape[2]),return_sequences=True)) model.add(Dropout(0.3)) model.add(CuDNNLSTM(512, return_sequences=True)) model.add(Dropout(0.3)) model.add(CuDNNLSTM(512)) model.add(Dense(256)) model.add(Dropout(0.3)) model.add(Dense(n_vocab)) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy', optimizer='rmsprop',metrics=["accuracy"])
Depois de adicionar a saída do gráfico ao script, vi por que meu modelo não funcionou. A precisão não cresceu com o tempo, como deveria. Veja abaixo no post os bons gráficos que mostram como deve ser o modelo de trabalho.
Eu não tinha ideia do por que aconteceu. mas abandonou esse modelo e começou a ajustar as configurações.
model = Sequential() model.add(CuDNNLSTM(512, input_shape=(network_input.shape[1], network_input.shape[2]), return_sequences=True)) model.add(Dropout(0.2)) model.add(BatchNormalization()) model.add(CuDNNLSTM(256)) model.add(Dropout(0.2)) model.add(BatchNormalization()) model.add(Dense(128, activation="relu")) model.add(Dropout(0.2)) model.add(BatchNormalization()) model.add(Dense(n_vocab)) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=["accuracy"])
É mais compacto e possui menos camadas LSTM. Também adicionei o BatchNormalization, vendo-o no
vídeo sentdex . Provavelmente, existem modelos melhores, mas este funcionou muito bem em todas as minhas sessões de treinamento.
Observe que nos dois modelos substituí LSTM por CuDNNLSTM. Então, consegui um treinamento LSTM muito mais rápido, graças ao uso do Cuda. Se você não possui uma
GPU com suporte ao Cuda , use o LSTM. Obrigado ao
sendtex por esta dica. Aprender novos modelos e compor arquivos midi usando CuDNNLSTM é cerca de cinco vezes mais rápido.
Por quanto tempo o modelo deve ser treinado
A semelhança dos resultados com a música original depende da duração do treinamento do modelo (o número de épocas). Se houver poucas eras, o resultado resultante terá muitas notas repetidas. Se houver muitas eras, o modelo será treinado novamente e simplesmente copie a música original.
Mas como você sabe quantas épocas parar?
Uma solução simples é adicionar um retorno de chamada que armazene o modelo e o gráfico de precisão / perda a cada 50 épocas em uma execução de treinamento em 500 épocas. Graças a isso, após concluir o treinamento, você obterá modelos e gráficos com um incremento de 50 épocas, mostrando como o treinamento ocorre.
Aqui estão os resultados dos gráficos de uma execução com salvamento a cada 50 épocas, combinados em um GIF animado.
Estes são os gráficos que queremos ver. As perdas devem cair e permanecer baixas. A precisão deve aumentar e permanecer próxima de 100%.
É necessário usar um modelo com o número de épocas correspondente ao momento em que os gráficos atingiram seus limites pela primeira vez. Para o gráfico mostrado acima, serão 150 eras. Se você usar modelos mais antigos, eles serão treinados novamente e provavelmente levarão a uma cópia simples do material de origem.
O modelo correspondente a essas colunas foi treinado em arquivos midi da categoria Hinos, extraídos
daqui .

Saída de dados midi em um modelo com 150 eras.

Saída Midi em um modelo de 100 épocas.
Mesmo um modelo com 100 eras pode copiar a fonte com muita precisão. Isso pode ser devido a uma amostra relativamente pequena de arquivos midi para treinamento. Com mais notas, o aprendizado é melhor.
Quando o aprendizado vai mal
A imagem acima mostra um exemplo do que pode e acontece durante o treinamento. As perdas são reduzidas e a precisão é aumentada, como de costume, mas de repente elas começam a enlouquecer. Nesta fase, também pode valer a pena parar. O modelo não aprenderá mais (pelo menos na minha experiência) novamente. Nesse caso, o modelo salvo com 100 eras ainda é muito aleatório e, com 150 eras, o momento de falha do modelo já passou. Agora eu sou salvo a cada 25 épocas para encontrar exatamente o momento ideal da modelo com o melhor treinamento, mesmo antes de ela treinar novamente e travar.
Outro exemplo de erro de aprendizagem. Este modelo foi treinado em arquivos midi retirados
daqui . Nesse caso, ela se manteve bem por pouco mais de 200 épocas. Ao usar um modelo com 200 eras, o resultado a seguir é obtido no Midi.

Sem a criação de gráficos, nunca saberíamos se o modelo tem problemas e quando surgiram, e também não conseguiríamos um bom modelo sem começar do zero.
Outros exemplos

Um modelo com 75 eras, criado com base nas composições de
Chopin .

Um modelo da era 50 baseado em
arquivos Midi para composições de Natal .

Um modelo de 100 épocas baseado em
arquivos Midi para composições de Natal . Mas eles são realmente "Natal"?

Um modelo de 300 épocas baseado em arquivos Bach Midi, extraídos
daqui e
daqui .

Um modelo de 200 épocas baseado no único arquivo Midi de Balakirev tirado
aqui .

Modelo com 200 épocas, baseado em composições
Debussy .

Um modelo da era 175 baseado nas composições de Mozart.

Um modelo com 100 épocas baseado em composições de
Schubert .

Um modelo da era 200 baseado em composições de
Schumann .

Um modelo da época 200 baseado nas composições
de Tchaikovsky .

Um modelo com 175 épocas baseado em canções folclóricas.

Modelo com 100 eras baseado em canções de ninar.

Um modelo da era 100 baseado na música do casamento.

Um modelo de 200 épocas baseado em meus próprios arquivos midi, extraídos das minhas trilhas sonoras de
vídeos do YouTube . Pode ser um pouco reciclado, porque basicamente gera cópias dos meus arquivos midi curtos de um e dois tempos.
Pontuações
Depois de
obter seus arquivos midi, você pode usar ferramentas on-line como o
SolMiRe para convertê-los em pontuações. Abaixo está a pontuação do arquivo midi Softology 200-epoch apresentado acima.
Onde posso testar o compositor
O LSTM Composer agora está incluído no
Visions of Chaos .
Selecione um estilo na lista suspensa e clique em Escrever. Se você instalou o mínimo necessário de Python e TensorFlow (consulte as instruções
aqui ), em alguns segundos (se você tiver uma GPU rápida), você receberá um novo arquivo midi composto por máquina que poderá ouvir e usar para qualquer outra finalidade. Sem direitos autorais, sem royalties. Se você não gostar dos resultados, poderá clicar em Redigir novamente e após alguns segundos uma nova composição estará pronta.
Os resultados ainda não podem ser considerados composições completas, mas eles têm pequenas sequências interessantes de notas que usarei para criar música no futuro. Nesse sentido, o compositor LSTM pode ser uma boa fonte de inspiração para novas composições.
Fonte Python
Abaixo está o código de script Python que usei para treinamento e previsão de LSTM. Para que esses scripts funcionem, não é necessário instalar o Visions of Chaos, e o aprendizado e a geração do midi funcionarão na linha de comando.
Aqui está o script de treinamento
lstm_music_train.py
E aqui está o script da geração midi
lstm_music_predict.py
:
Tamanhos de arquivo de modelo
A desvantagem de incluir redes neurais no Visions of Chaos é o tamanho dos arquivos. Se a geração do modelo fosse mais rápida, basta adicionar um botão para que o usuário final possa treinar os modelos. Mas como algumas das sessões de treinamento de muitos modelos podem levar vários dias, isso não é particularmente prático. Pareceu-me que é melhor fazer todo o treinamento e testar você mesmo e adicionar apenas os melhores modelos de trabalho. Isso também significa que o usuário final só precisa pressionar um botão, e modelos treinados criarão composições musicais.
Cada um dos modelos tem um tamanho de 22 megabytes. Nas condições da Internet moderna, isso não é muito, mas ao longo dos anos de desenvolvimento, Visions of Chaos vem aumentando de tamanho gradualmente, e apenas recentemente aumentou repentinamente de 70 para 91 MB (devido ao modelo de busca por autômatos celulares). Portanto, até agora, adicionei apenas um modelo ao instalador principal do Visions of Chaos. Para usuários que desejam mais, publiquei um link para outros 1 GB de modelos. Eles também podem usar o script acima para criar seus próprios modelos com base em seus arquivos midi.
O que vem a seguir?
Nesse estágio, o compositor LSTM é o exemplo mais simples de uso de redes neurais para compor música.
Eu já encontrei outros compositores de música em redes neurais com as quais experimentarei no futuro, então você pode esperar que em Visions of Chaos existam novas possibilidades para compor músicas automaticamente.