Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[모델학습] training/train.py 분석 #4

Open
Yeonji-Lim opened this issue Aug 2, 2022 · 8 comments
Open

[모델학습] training/train.py 분석 #4

Yeonji-Lim opened this issue Aug 2, 2022 · 8 comments
Assignees
Labels
model_training AI model training part task Project task

Comments

@Yeonji-Lim
Copy link
Member

Yeonji-Lim commented Aug 2, 2022

해야할 일

dataset 구하기 전후로 업무가 바뀔 것임

  • 단순 코드 분석
  • dataset 구해지면 해당 dataset으로 직접 실행

참고

scripts/training/block_placement_ddc2/opt.json
scripts/training/block_selection_new2/opt.json

@dolppe dolppe self-assigned this Aug 2, 2022
@dolppe dolppe added the task Project task label Aug 2, 2022
@Yeonji-Lim Yeonji-Lim changed the title [모델학습] training/train.py 분석 [모델학습] training/train.py 분석 Aug 2, 2022
@dolppe
Copy link
Collaborator

dolppe commented Aug 3, 2022

train.py

training/block_placement_ddc2/opt.json => ddc 모델, training/data/general_beat_saber_dataset.py 데이터셋 이용
training/block_selection_new2/opt.json => transformer 모델, training/data/stage_two_dataset.py 데이터셋 이용
해당 opt에 있는 옵션에 해당하는 모델과 데이터셋을 이용하여 모델 세팅을 진행
모델의 경우 nn.Module을 상속 받아서 진행, 데이터셋의 경우 torch.utils.data.dataset을 상속 받은 base_dataset을 상속 받음

디폴트 옵션

디폴트 옵션이 다른 것으로 설정되어 있어서 원하는 옵션을 선택해서 가져올 수 있도록함
argparseparser을 이용하여 옵션 선택 => 최종적으로는 해당 parsernameSpace로 바꿈
따라서 최종 형태인 nameSpace에 직접 원하는 옵션을 선택하도록 함
현재 ddc2 옵션을 선택하도록 만듦

DataSet

데이터셋이 없어서 학습을 진행하지 못함
데이터셋 포맷을 찾아야 함

@Yeonji-Lim
Copy link
Member Author

Yeonji-Lim commented Aug 3, 2022

DataSet

PR #7 참고하여 데이터셋 활용 시도 가능함

@dolppe
Copy link
Collaborator

dolppe commented Aug 3, 2022

활용 시도 결과 파일 전처리 과정, 데이터 구조 일관성 등 확인이 필요

@dolppe
Copy link
Collaborator

dolppe commented Aug 5, 2022

process_songs.py

파일 확인 결과 결국 stage1, 2에서 사용 되었던 extract_feature_mel, multi_mel 등이 이용되는 것으로 확인
즉, process_songs.py는 다운로드 받은 곡을 mel 형태로 변환하여 song+_feature_name_+feature_size+.npy 형태로 저장
ex) a.egg => a_mel_100.npy 와 같은 형태임
원래 자동으로 곡과 노트 파일을 추출하여 data/extraced_data에 저장하게 되면, 이를 자동으로 extract_feature를 진행하기 위함임
그렇기에 data를 다루고 저장, 변환하는 방식만 맞추면 SuperStar의 곡을 이용할 때 자동화할 수 있어보임

고려해야 하는 것

train.py에서 dataSet을 불러올 때 사용하는 코드들에는 데이터셋 형식이 정해져 있음
이는 [곡 다운로드 => 특징 추출 => 추출된 특징을 이용하여 학습]을 자동화하는 과정으로 보임
그러나 데이터셋 형식이 잘 맞지 않음 => 새로운 구조를 정리하고, 필요한 부분을 다 바꿔야 할듯?
아니면 좀 더 엄밀하게 분석해보는 방안도 존재

@dolppe
Copy link
Collaborator

dolppe commented Aug 5, 2022

  • 문제 상황
    extract_feature 이외에 추가적으로 처리된 파일이 필요
    blocks_reduced_classes_file이 필요함 => List of audio files cannot be empty라고 에러가 뜸
    => 찾아본 결과 Level_processing_function.py에서 해당 파일을 만드는 것으로 추정
    그러나 만드는 함수가 매우 많아서 어떤 것을 써야할지 찾아봐야함

  • 원래 진행됐던 것 방안에 대한 추측

  1. process_song을 진행한 후에 따로 level_processing_funciton을 돌림
  2. process_song과 level_processing_function을 한번에 돌리는 파일이 있나 찾아봐야함

@dolppe
Copy link
Collaborator

dolppe commented Aug 5, 2022

process_songs_tensors.py 파일에서 해당 파일을 생성하는 것 확인 => 분석 진행 해봄

@dolppe
Copy link
Collaborator

dolppe commented Aug 5, 2022

현재 파일들을 모두 정상적으로 돌아가며, train.py의 torch.save 부분에만 문제가 생겨서 파악 중

@dolppe
Copy link
Collaborator

dolppe commented Aug 12, 2022

전체적인 실행 흐름

  1. opt 파일을 받아서 각 원하는 학습을 진행
  2. opt 파일에 해당하는 model을 불러옴 ex) ddc => ddc_model.py => DDCModel(BaseModel), DDCNet(nn.Module)
  • 모델에는 앞서 설명한 인공지능 모델의 구조(레이어)가 존재합니다.
  • 또한 학습에 필요한 forward, backward 과정, 파라미터 값 변경 등이 포함되어 있습니다.
  • nn.module을 이용함
  1. opt 파일에 해당하는 dataset을 불러옴 => 이 때 전처리된 음악 파일을 가져와서 .dat, .npy 등의 정보를 담아감(audio_file,level_file ... )
  • 이 때 dataSet의 원형은 torch.utils.data.DataSet이다.
  • opt 입력을 통해 학습에 필요한 데이터셋을 불러온다(특징 추출된 것, reduced된 것 => 노래, 노래에 해당하는 노트파일, info 파일 )
  1. 만들어둔 dataset을 이용하여 학습 중에 Data를 불러올 dataloader를 생성한다.
  • 이 때 dataloader의 원형은 torch.utils.data.dataloader이다.
  • 데이터로더는 만들어둔 데이터셋을 이용하기 편하게 만들기 위하여 사용된다.
  1. 모든 준비가 끝나면 설정된 epoch만큼의 반복을 시작한다.
  • epoch는 준비된 전체 데이터셋에 대해 한 번씩 학습을 진행하면 1이 올라간다.
  1. 데이터는 데이터셋을 통째로 이용하는 것이 아니라 dataloader에서 batch 값만큼만 불러서 이용한다.
  • batch는 dataloader에서 설정할 수 있다.
  • batch 값만큼 데이터를 불렀을 때 이는 data변수에 저장되어 있고, 이 때 input과 target으로 나눠지는데 이는 get_item() 메서드에서 설정된다.
    target은 정답이라고 생각하면 된다.

getItem

하나의 곡을 뽑을 때 호출된다. 즉 batch수가 10이라면 10번의 getItem이 호출된다.
패딩 진행, window 개수만큼 indices를 랜덤하게 뽑음
이후 time_shifts만큼 input windows를 뽑음(10,80,3,100)
이 때 indicies의 위치부터 input_length까지를 뽑는거
원래 y => (80,3,8286) 인데 이 8286중 indices ~ indices+100까지 뽑고(80,3,100) 모아둔것 => input windows
이를 time_shifts만큼 뽑으면 input windowss(15,10,80,3,100) 
input => (10,10,15,80,3,100) => input windowss => batch size만큼 모은 것
reduced => (8286,1) 인데 이 중 indices ~ indices+100까지 뽑고(100,1) 모아둠 (10,100,1)
=> 타겟 => (10,10,100,1) => target => batch size만큼 모은 것
  1. 뽑은 데이터를 model.set_input을 통해 모델에 인풋으로 적용한다.
  • input, target 설정
  1. optimize_parameters를 진행하며 이 때 forward()와 backward()가 한번씩 진행된다.
  • forward 해서 나온 결과 => target과 비교
  • 이후 backward를 통해 값을 변경함
  1. 이후 loss값 계산과 metrics를 통해 학습을 평가한다.
  2. 이렇게 1 batch 만큼의 학습이 진행된다. 이후 epoch에 도달할 때 까지 반복한다.
  3. 1 epoch가 지나면 leaning_rate를 업데이트한다.

학습 관련된 변수들은 opt에 저장되어 있음 제대로 하려면 이를 변형시키면서 진행하는 듯

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
model_training AI model training part task Project task
Projects
Status: 🔥 In Progress
Development

No branches or pull requests

3 participants