이 프로젝트는 음악 생성을 위한 순환 신경망(RNN)을 구축합니다. 모델은 음악을 생성하는 ABC 표기법의 원본 악보의 패턴을 학습하도록 훈련되었습니다. 데이터 세트는 Kaggle에서 수집되었으며 노래의 ABC 표기법이 포함되어 있습니다. 링크: https://www.kaggle.com/datasets/raj5287/abc-notation-of-tunes?datasetId=156963&sortBy=dateRun&tab=profile 먼저 데이터세트의 텍스트를 벡터화하여 조회 테이블을 유지하기 위한 숫자 표현을 생성합니다. 우리는 명확한 시퀀스 길이로 RNN을 훈련하기 위해 몇 가지 예제 시퀀스를 사용할 것입니다. 다음 문자를 예측하기 위한 대상 시퀀스도 있습니다. 이는 문자 인덱스 스트림을 원하는 크기의 시퀀스로 변환하는 일괄 처리 방법을 사용하여 구현됩니다. 우리가 생성하는 RNN 모델은 LSTM 아키텍처를 기반으로 하며 이니셜라이저 "glorot_uniform"과 활성화 함수 "sigmoid"를 갖습니다. 여기서 상태 벡터를 사용하여 연속 문자 간의 시간적 관계에 대한 정보를 유지합니다. 그런 다음 LSTM의 최종 출력은 완전히 연결된 Dense 레이어에 입력되어 어휘의 각 문자에 대한 소프트맥스를 출력한 다음 이 분포에서 샘플링하여 다음 문자를 예측합니다.
레이어 1: 인덱스를 고정된 임베딩 크기의 밀집 벡터로 변환하는 임베딩 레이어
레이어 2: rnn_units 단위의 LSTM.
레이어 3: LSTM 출력을 어휘 크기로 변환하는 조밀한(완전 연결) 레이어입니다.
그런 다음 RNN 모델은 교차엔트로피 손실(음의 로그 우도 손실) 형태, 즉 sparse_categorical_crossentropy 손실을 사용하여 훈련됩니다. 이는 범주형 분류 작업에 정수 목표를 활용하기 때문입니다. 우리는 실제 목표인 라벨과 예측된 목표인 로짓을 사용하여 손실을 계산하려고 합니다. 설정 및 최적화를 위해 하이퍼파라미터가 정의됩니다. 학습 연산을 위한 옵티마이저로 Adam 옵티마이저를 사용합니다. 모델은 배치 크기가 10이고 시퀀스 길이가 100인 3000회 반복에 대해 학습되었습니다. 학습률이 1e-3으로 설정되면 모델이 더 잘 학습됩니다. 음악을 생성하기 위해 모델은 예측 절차를 따릅니다.
1단계: "시드" 시작 문자열과 RNN 상태를 초기화하고 생성하려는 문자 수를 설정합니다.
2단계: 시작 문자열과 RNN 상태를 사용하여 다음 예측 문자에 대한 확률 분포를 얻습니다.
3단계: 다항 분포에서 샘플링하여 예측 문자의 인덱스를 계산합니다. 이 예측된 문자는 모델의 다음 입력으로 사용됩니다.
4단계: 각 시간 단계에서 업데이트된 RNN 상태가 모델에 다시 피드백되므로 이제 다음 예측을 수행하는 데 더 많은 컨텍스트가 제공됩니다. 다음 문자를 예측한 후 업데이트된 RNN 상태는 다시 모델에 피드백됩니다. 이는 이전 예측에서 더 많은 정보를 얻으면서 데이터의 시퀀스 종속성을 학습하는 방법입니다.
이제 모델은 사용자가 정의한 "start_string" 및 "세대_길이"를 사용하여 노래를 생성합니다.