개발자로 후회없는 삶 살기

PyTorch PART.PyTorch 탬플릿 Config 파일 활용 본문

[AI]/[딥러닝 | 이슈해결]

PyTorch PART.PyTorch 탬플릿 Config 파일 활용

몽이장쥰 2023. 11. 19. 10:56

서론

파이토치에서는 Config 파일을 재구성하여 학습에 유용하게 사용합니다. 어떻게 활용하는지 알아보겠습니다.

 

본론

1. config 파일을 파이썬 객체로 역직렬화

파이토치 탬플릿 코드를 보면 이런 코드가 있습니다.

 

메서드에 들어가 보면 object_hook이 있는데 이건 json 파일을 파이썬 객체로 다룰 수 있도록 합니다. 아래 코드로 예시를 보겠습니다.

 

import json

data = '{"str" : 42.2, "str01": 42}'

class my_jsonObj:                       # object_hook를 통해 임의의 사용자 클래스를 선언
    def __init__(self, d):
        self.__dict__ = d  

if __name__ == '__main__':
    data = json.loads(data,object_hook=my_jsonObj)  # 대상을 클래스인 객체로 연동해서 구현된다.
    
    print(data.str)

json 파일을 그대로 다룬다면 data["str"]로 접근해야 하는데 객체로 바꾸면 참조 연산자로 더 편하게 접근할 수 있습니다.

실행결과 data.str로 json에 접근할 수 있습니다.

 

다시 탬플릿으로 돌아와서 보겠습니다. config 파일은 위처럼 작성되어 있고 read 메서드에서는 이를 OrderedDict로 가져왔습니다.

 

이렇게 하면 json을 json에 적힌 순서대로 파이썬 OrderedDict 객체로 사용할 수 있습니다. 중괄호 {} 하나당 OrderDict 하나가 생깁니다.

 

dict 처럼 접근 가능합니다.

 

json을 dict 객체로 반환하면 좋은 점이 dict 내용을 수정하고 다시 json으로 저장하기 편합니다.

 

2. cls() 객체 반환

cls는 해당 클래스에서 클래스 자기 자신의 객체를 만드는 것입니다.

 

찍어보면 config, resume이 나오는데 modify는 없는 거 보면 __repr__을 위처럼 정의한 것 같습니다.

 

보면 config json을 dict 파이썬 객체로 만들었는데 ConfigParser가 그걸 또 사용하기 편하게 객체로 만드는 클래스입니다.

 

self 로 선언한 것들이 __dict__ print 결과로 나옵니다.

 

원래는 config를 []로 딕셔너리로 사용해야 했었는데 

 

config 파일을 dict로 바꾸고 dict를 또 ConfigParser 클래스로 바꿔서 config 파일을 사용하기 쉽게 변환합니다.

 

3. Object 클래스의 getattr 기능

getattr은 특정 모듈에서 원하는 요소를 가져옵니다.

 

1) getattr(args, _get_opt_name(opt.flags)) for opt in options

args 파서가 있을 때 이 내부에는 

위처럼 조건이 있을 것입니다.

args를 찍어보면 조건과 value가 있습니다.

 

getattr에 args, _get_opt_name(조건명)을 넣으면 value가 나옵니다.ex) (args, device) = None

 

 _get_opt_name(--config)가 들어가면 --을 제거하고 config만 나오는 것으로 봐서 getattr(args, 조건명)을 하면 value를 찾을 수 있습니다.

 

2) getattr(module, module_name)

module로 import data_loader.data_loaders as module_data 넣고 데이터 로더 만들고 module_name으로 해당 로더 이름 넣으면 데이터 로더 객체를 반환합니다.

 

4. __getitem__

train을 보면 config를 객체로 했는데 dict처럼 접근합니다. 객체는 callable만 가능하지 사전 형식으로는 불가능하며 config 객체로 만들어서 편리하게 하려고 한 건데 이상합니다.

 

Object 객체는 getitem을 재정의하면 데이터 셋 클래스처럼 객체를 사전이나 인덱스처럼 접근할 수 있습니다. 여기에 원하는 방식을 작성하면 됩니다. 인덱스도 [1]로 접근하고 사전도 ["name"]으로 접근하니 getitem의 함수 원형 부분은 똑같고 return 부만 다르게 해주면 됩니다.

Comments