
바로 모델을 만들면서 Custom dataset을 구성해보도록 하겠다. 일단 Pytorch의 특징을 살리기 위해서 객체지향을 통해 진행해보겠다.
.
├── dataloader.py
├── model.py
├── pickle
└── run.py
1 directory, 3 files
model.py 는 모델 코드이고 dataloader.py 는 데이터를 불러오는 객체,pickle 는 디렉토리인데 이때 디렉토리는 데이터 디렉토리 이다. 그리고 run.py 는 전체 객체를 하나로 갖고와서 모델 불러오고 데이터를 불러오고 최종적으로는 학습 및 테스트를 진행하는 코드이다.
일단 나는 기본 데이터베이스는 MIT-BIH 데이터를 갖고 진행하였다. MIT-BIH 는 Pysionet을 통해 직접 다운 받을 수 있다. MIT-BIH Arrythmia Database는 꽤나 전통적이고 golden standard 처럼 이용되는 데이터베이스이다. Electrocardiography 를 라이브러리를 통해 읽어오기 위해서는 WFDB 라이브러리르 활용할 수 있다. WFDB는 Wave Form Data Base 의 약자이다.
WFDB의 사이트에 들어가면 아래와 같은 설명이 적혀 있다.
Software for viewing, analyzing, and creating recordings of physiologic signals
물리적 신호 데이터를 시각적으로 보고 파악, 생성 등 생체 신호를 위해서 쓰이는 라이브러리이다. 시작은 라이브러리도 되었으나 해당 라이브러리를 활용하기에는 많은 어려움이 있어 어플리케이션으로 변형 및 컴파일이 되어 좀 더 쉽게 사용할 수 있도록 배포가 되고 있기도 하다. 파이썬 모듈이 제공되기도 하니 참고하시길... 🤗
어떤식으로 저장하냐에 따라 다르겠지만 나는 각 비트를 WFDB를 활용하여 ecg-rr 코드를 작성하였다. 각 비트를 잘라서 Pickle 파일로 저장하는 방식이다. 그렇게 각 비트를 428로 저장을 하는데 해당 부분은 github repository, ecg-rr 의 README.md 를 참고하길 바란다.
사실 모델 코드는 본인이 어떻게 하냐에 따라 아직 초반 단계이기 때문에 단순한 모델로 구성을 한다고 하고 진행 해보겠다.
class Model(nn.Module):
def __init__(self) -> None:
super(Model, self).__init__()
self.flatten = nn.Flatten()
self.stack = nn.Sequential(
nn.Linear(28 * 28, 512),
nn.ReLU(),
nn.Conv2d(512, 512, (3, 3), (2, 2)),
nn.ReLU(),
nn.Conv2d(512, 256, (3, 3), (2, 2)),
nn.ReLU(),
nn.Linear(256, 10),
)
def forward(self, x):
x = self.flatten(x)
logits = self.stack(x)
return logits