pytorch 음성 클래스 사용자 정의 데이터 집합을 불러오는 방법 강좌
pytorch는 자주 사용하는 공개 데이터 집합에 대해 편리한 API 인터페이스를 가지고 있지만 우리가 자신의 데이터 집합을 사용하여 신경 네트워크를 훈련해야 할 때 사용자 정의 데이터 집합이 필요합니다. pytorch에서 몇 가지 종류를 제공하여 우리가 자신의 데이터 집합을 정의하는 데 편리합니다
사용자 정의 Dataset은 torch를 계승해야 합니다.utils.data.Dataset 클래스 및 두 구성원을 다시 쓰는 방법:
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을 호출하면 샘플 하나만 되돌려줍니다.사례:
파일 디렉토리 구조
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를 사용해야 하는 이유
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, collate_fn=default_collate, pin_memory=False, drop_last=False)
매개변수:사례:
# 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은 단지 합쳐졌을 뿐이다
파일 디렉토리 구조
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')
참고 사항:사례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가 음성류 사용자 정의 데이터 집합을 불러오는 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정확도에서 스케일링의 영향데이터셋 스케일링은 데이터 전처리의 주요 단계 중 하나이며, 데이터 변수의 범위를 줄이기 위해 수행됩니다. 이미지와 관련하여 가능한 최소-최대 값 범위는 항상 0-255이며, 이는 255가 최대값임을 의미합니다. 따...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.