pytorch 음성 클래스 사용자 정의 데이터 집합을 불러오는 방법 강좌

앞말
pytorch는 자주 사용하는 공개 데이터 집합에 대해 편리한 API 인터페이스를 가지고 있지만 우리가 자신의 데이터 집합을 사용하여 신경 네트워크를 훈련해야 할 때 사용자 정의 데이터 집합이 필요합니다. pytorch에서 몇 가지 종류를 제공하여 우리가 자신의 데이터 집합을 정의하는 데 편리합니다
  • torch.utils.data.Dataset: 상속된 모든 하위 클래스는 __len()__  , __getitem()__ 이 두 가지 방법
  •  __len()__ :데이터 집중 데이터의 수량을 되돌려줍니다
  •   __getitem()__ :다음 색인 방식을 지원하는 데이터를 되돌려줍니다
  • torch.utils.data.DataLoader: 데이터 세트를 패키징하여 batch_ 설정 가능사이즈, 셔플 여부...
  • 첫걸음
    사용자 정의 Dataset은 torch를 계승해야 합니다.utils.data.Dataset 클래스 및 두 구성원을 다시 쓰는 방법:
  • __len()__:데이터를 읽고 데이터와 탭을 되돌려줍니다
  • __getitem()__:데이터 집합의 길이를 되돌려줍니다.
  • 
    from torch.utils.data import Dataset
    
    
    class AudioDataset(Dataset):
     def __init__(self, ...):
     """ """
     pass
    
     def __getitem__(self, item):
     """ , """
     return data, label
    
     def __len__(self):
     """ """
     return total
    주의사항: Dataset은 데이터의 추상만 책임지고, 한 번에 getiitem을 호출하면 샘플 하나만 되돌려줍니다.
    사례:
    파일 디렉토리 구조
  • p225
  • ***.wav
  • ***.wav
  • ***.wav
  • ...
  • dataset.py
  • 목적: p225 폴더의 오디오 데이터 읽기
    
    class AudioDataset(Dataset):
     def __init__(self, data_folder, sr=16000, dimension=8192):
     self.data_folder = data_folder
     self.sr = sr
     self.dim = dimension
    
     #  
     self.wav_list = []
     for root, dirnames, filenames in os.walk(data_folder):
     for filename in fnmatch.filter(filenames, "*.wav"): #  , “.wav” 
     self.wav_list.append(os.path.join(root, filename))
    
     def __getitem__(self, item):
     #  , 
     filename = self.wav_list[item]
     wb_wav, _ = librosa.load(filename, sr=self.sr)
    
     #    
     if len(wb_wav) >= self.dim:
     max_audio_start = len(wb_wav) - self.dim
     audio_start = np.random.randint(0, max_audio_start)
     wb_wav = wb_wav[audio_start: audio_start + self.dim]
     else:
     wb_wav = np.pad(wb_wav, (0, self.dim - len(wb_wav)), "constant")
    
     return wb_wav, filename
    
     def __len__(self):
     #  
     return len(self.wav_list)
    주의사항: 19-24줄: 오디오마다 길이가 다르기 때문에 데이터를 직접 읽고 되돌려주면 차원이 일치하지 않아 오류를 보고할 수 있기 때문에 매번 오디오 파일을 꺼내서 한 프레임만 읽을 수 있습니다. 이렇게 하면 모든 음성 데이터가 사용되지 않습니다.
    두 번째 단계
    실례화된 Dataset 객체
    
    Dataset= AudioDataset("./p225", sr=16000)
    
    batch를 통해 데이터를 읽으려면 세 번째 단계로 넘어갈 수 있습니다. 데이터를 하나하나 읽으려면 다음 동작을 보십시오.
    
    #  AudioDataset 
    train_set = AudioDataset("./p225", sr=16000)
    
    for i, data in enumerate(train_set):
     wb_wav, filname = data
     print(i, wb_wav.shape, filname)
    
     if i == 3:
     break
     # 0 (8192,) ./p225\p225_001.wav
     # 1 (8192,) ./p225\p225_002.wav
     # 2 (8192,) ./p225\p225_003.wav
     # 3 (8192,) ./p225\p225_004.wav
    세 번째 단계
    batch를 통해 데이터를 읽으려면 DataLoader를 사용하여 포장해야 합니다.
    DataLoader를 사용해야 하는 이유
  • 딥러닝 입력은 mini_배치 형식
  • 샘플을 불러올 때 무작위로 순서를 어지럽히고 shuffle 작업을 해야 할 수 있습니다
  • 견본 적재는 다중 스레드를 사용해야 한다.
  • pytorch에서 제공하는 DataLoader는 상술한 기능을 봉인하여 더욱 편리하게 사용할 수 있습니다.
    
    DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=default_collate, pin_memory=False, drop_last=False)
    
    매개변수:
  • dataset: 로드된 데이터 세트(Dataset 대상)
  • batch_size: 한 번에 몇 개의 견본을 불러와야 합니까? (기본값: 1)
  • shuffle: 모든 epoch가 데이터를 혼란스럽게 하는지 여부
  • sampler: 데이터 집합에서 샘플을 추출하는 정책을 정의합니다.만약 지정한다면, 세패를 지정할 수 없습니다..
  • batch_sampler: sampler와 유사하지만, 매번 색인을 되돌려줍니다.와batch_size, shuffle, sampler 및drop_last 서로 배척..
  • num_workers: 다중 프로세스가 불러오는 프로세스 수를 사용합니다. 0은 다중 루틴을 사용하지 않습니다
  • collate_fn: 여러 샘플 데이터를batch로 어떻게 연결하는지 기본 연결 방식을 사용합니다
  • pin_memory:pin memory 구역에 데이터를 저장할지 여부,pin memory의 데이터는 GPU로 이동하는 것이 빠릅니다
  • drop_last:dataset의 데이터 개수는batch_가 아닐 수 있습니다size의 정수 배,drop_last는 True로 batch가 부족한 데이터를 많이 버립니다.
  • 반환: 데이터 로더
    사례:
    
    #  AudioDataset 
    train_set = AudioDataset("./p225", sr=16000)
    train_loader = DataLoader(train_set, batch_size=8, shuffle=True)
    
    for (i, data) in enumerate(train_loader):
     wav_data, wav_name = data
     print(wav_data.shape) # torch.Size([8, 8192])
     print(i, wav_name)
     # ('./p225\\p225_293.wav', './p225\\p225_156.wav', './p225\\p225_277.wav', './p225\\p225_210.wav',
     # './p225\\p225_126.wav', './p225\\p225_021.wav', './p225\\p225_257.wav', './p225\\p225_192.wav')
    우리 밤 몇 개를 먹고 소화해 보자.

    이 예는 본문에서 줄곧 예로 들었는데, 밤 1은 단지 합쳐졌을 뿐이다
    파일 디렉토리 구조
  • p225
  • ***.wav
  • ***.wav
  • ***.wav
  • ...
  • dataset.py
  • 목적: p225 폴더의 오디오 데이터 읽기
    
    import fnmatch
    import os
    import librosa
    import numpy as np
    from torch.utils.data import Dataset
    from torch.utils.data import DataLoader
    
    
    class Aduio_DataLoader(Dataset):
     def __init__(self, data_folder, sr=16000, dimension=8192):
     self.data_folder = data_folder
     self.sr = sr
     self.dim = dimension
    
     #  
     self.wav_list = []
     for root, dirnames, filenames in os.walk(data_folder):
      for filename in fnmatch.filter(filenames, "*.wav"): #  , “.wav” 
      self.wav_list.append(os.path.join(root, filename))
    
     def __getitem__(self, item):
     #  , 
     filename = self.wav_list[item]
     print(filename)
     wb_wav, _ = librosa.load(filename, sr=self.sr)
    
     #    
     if len(wb_wav) >= self.dim:
      max_audio_start = len(wb_wav) - self.dim
      audio_start = np.random.randint(0, max_audio_start)
      wb_wav = wb_wav[audio_start: audio_start + self.dim]
     else:
      wb_wav = np.pad(wb_wav, (0, self.dim - len(wb_wav)), "constant")
    
     return wb_wav, filename
    
     def __len__(self):
     #  
     return len(self.wav_list)
    
    
    train_set = Aduio_DataLoader("./p225", sr=16000)
    train_loader = DataLoader(train_set, batch_size=8, shuffle=True)
    
    
    for (i, data) in enumerate(train_loader):
     wav_data, wav_name = data
     print(wav_data.shape) # torch.Size([8, 8192])
     print(i, wav_name)
     # ('./p225\\p225_293.wav', './p225\\p225_156.wav', './p225\\p225_277.wav', './p225\\p225_210.wav',
     # './p225\\p225_126.wav', './p225\\p225_021.wav', './p225\\p225_257.wav', './p225\\p225_192.wav')
    참고 사항:
  • 27-33 줄: 오디오마다 길이가 다르기 때문에 데이터를 직접 읽고 되돌려주면 차원이 일치하지 않아 오류를 보고할 수 있기 때문에 매번 오디오 파일을 꺼내서 한 프레임만 읽을 수 있습니다. 이렇게 하면 모든 음성 데이터가 사용되지 않습니다
  • 48 줄: 우리는 __getitem__에서 numpy 수조를 텐서 형식으로 바꾸지는 않았지만, 48줄에 표시된 데이터는 텐서 형식입니다.이곳은 주의를 끌 필요가 있다

  • 사례1에 비해 사례2가 중점이다. 왜냐하면 우리는 매번 한 오디오 파일에서 한 프레임만 읽고 다른 오디오 파일을 읽을 수 없기 때문이다. 통상적으로 한 단락의 오디오에는 많은 프레임이 있기 때문이다. 우리가 필요로 하는 것은 순서대로batch_size의 오디오 프레임은 첫 번째 오디오 파일을 읽고 만약batch가 충족된다면 두 번째batch를 읽지 않고 한 개batch가 부족하면 두 번째 오디오 파일을 읽어서 보충합니다.
    나는 먼저 순서대로 모든 오디오 파일을 읽고 창 길이 8192, 프레임 이동 4096으로 음성을 나누어 연결할 것을 건의한다.(프레임 수, 프레임 길이, 1)(frame_num, frame_len, 1)의 그룹을 h5에 저장합니다.그리고 위에서 말한 토치로utils.data.Dataset과 torch.utils.data.DataLoader에서 데이터를 읽습니다.
    구현 코드:
    1단계: H5_ 생성generation 스크립트는 데이터를 h5 형식 파일로 변환하는 데 사용됩니다.
    2단계: Dataset을 통해 h5 형식 파일에서 데이터 읽기
    
    import numpy as np
    from torch.utils.data import Dataset
    from torch.utils.data import DataLoader
    import h5py
    
    def load_h5(h5_path):
     # load training data
     with h5py.File(h5_path, 'r') as hf:
     print('List of arrays in input file:', hf.keys())
     X = np.array(hf.get('data'), dtype=np.float32)
     Y = np.array(hf.get('label'), dtype=np.float32)
     return X, Y
    
    
    class AudioDataset(Dataset):
     """ """
     def __init__(self, data_folder):
     self.data_folder = data_folder
     self.X, self.Y = load_h5(data_folder) # (3392, 8192, 1)
    
     def __getitem__(self, item):
     #  
     X = self.X[item]
     Y = self.Y[item]
    
     return X, Y
    
     def __len__(self):
     return len(self.X)
    
    
    train_set = AudioDataset("./speaker225_resample_train.h5")
    train_loader = DataLoader(train_set, batch_size=64, shuffle=True, drop_last=True)
    
    
    for (i, wav_data) in enumerate(train_loader):
     X, Y = wav_data
     print(i, X.shape)
     # 0 torch.Size([64, 8192, 1])
     # 1 torch.Size([64, 8192, 1])
     # ...
    __에서init__에서 h5 파일을 생성하지만 메모리가 폭발하는 것이 이상하기 때문에 나는 헤어질 수밖에 없다.
    참고
    pytorch 학습(4) - 사용자 정의 데이터 집합 (비교적 상세)
    총결산
    이는pytorch가 음성류 사용자 정의 데이터 집합을 불러오는 것에 관한 글을 소개합니다. 더 많은 관련pytorch가 음성류 사용자 정의 데이터 집합을 불러오는 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기