"Keras 내 HDF5Matrix 클래스를 이용하면 된다."Keras에서 학습을 위한 데이터를 만들거나 가져올 때, numpy array로 변환해 모델에 넣어주는 것이 일반적이다. 데이터셋의 크기가 컴퓨터 사양에 비해 충분히 작으면, 누구나 자신이 원하는 데이터를 numpy array로 바꾸어 넣어줄 수 있고, 이런 점이 굉장히 편리하다. 그러나 numpy array로 만드는 작업이 결국 모든 데이터를 담은 자료구조를 메모리에 올리는 행위이기 때문에, 내 컴퓨터 메모리 용량에 비해 데이터셋의 크기가 압도적으로 큰 경우 메모리에 데이터를 전부 올리지 못하고 위 같은 경우 데이터셋을 줄이는 방법이 있을 수 있지만, 모델의 크기나 풀고 싶은 문제의 난이도에 따라 그럴 수 없는 경우도 많다. 이 때 해결 방법은 두 가지인데,
Keras 에서 제공하는 만약 데이터를 내가 생성하거나, 혹은 generator 함수를 이용하는 것이 느리고 불편하다면 다른 방법이 있는데, HDF5 포맷은 대용량 데이터를 처리하기 위한 파일 형식으로, 많은 양의 데이터를 안정적으로 저장할 뿐만 아니라, Random Access 및 빠른 검색 등을 지원한다. 위키에 조금 더 자세한 내용이 나와 있다. Python에서 HDF5 포맷을 다루는 방법은, 일단
위 코드는 filename 경로에 filename 은 데이터셋은 마치 딕셔너리와 같은데, HDF5 파일 내부에 세부 경로를 만들고 그 경로에 주어진 데이터가 들어간다. 즉, 경로를 key로, 데이터를 value로 가지는 대용량의 딕셔너리로 봐도 된다. 데이터셋을 생성한 뒤에, 실제 저장된 파일의 인덱스에 값을 대입하는 방법은 다음과 같다.
위와 같이 HDF5 파일의 자료는 원하는 양 만큼 잘라낸 후 numpy array 를 다루듯이 사용할 수 있다. 이 때, HDF5 파일은 실제 데이터 값에 접근하기 전까지는 메모리로 올라오지 않고, 데이터에 접근할 때도 메모리 제한 내에서 load와 close 를 반복하기 때문에 데이터 양과 무관하게 마음껏 사용할 수 있게 된다. 물론 데이터가 저장된 디스크의 File I/O 가 bottleneck 으로 작용할 수 있다는 문제가 있지만, 이 정도는 많은 데이터 양을 다루는 데에 필요한 trade-off 라 생각할 수 있다. 특히, Keras 에선 이 HDF5 파일을 쉽게 학습 데이터로 사용할 수 있게
지원해주고 있다.
위처럼 데이터를 파일로 저장해 두어도 HDF5포맷과 keras의 HDF5Matrix를 이용하면, 복잡한 처리 없이 대용량 데이터를 쉽게 학습할 수 있다. 학습에 필요한 데이터가 많을 때 고려해볼 만 한 방법이다.
|