반응형
허깅페이스 transformers 라이브러리로 불러온 모델에 대해 약간의 수정이 필요한 경우가 있습니다.
저 같은 경우에는 diffusers의 controlnet의 조건부 이미지 입력값을 더 키워서 다양한 조건을 한번에 입력받게끔 테스트를 진행하고 있는데요. 간단하게 in_channels를 수정하면 될 줄 알았는데 모델 레이어 전체를 바꿔야만 에러 없이 돌아가는 걸 확인하여 까먹지 않고자 정리해봅니다.
정리 중에 생각해보니까 in_channels만 수정한다고 weight가 생기지는 않을테니 당연한 내용이었네요.
간단하게 파라미터만 수정하는 경우
아래와 같이 컨트롤넷을 정의하고 조건부 이미지 입력값만 변경해보겠습니다.
controlnet = ControlNetModel()
controlnet.controlnet_cond_embedding.conv_in.in_channels = 4
controlnet.controlnet_cond_embedding
위 이미지처럼 in_channels가 변경된 것을 확인할 수 있지만?
controlnet.controlnet_cond_embedding(torch.zeros((1,4,32,32)))
바로 입력 채널이 다르다는 에러가 나는 걸 확인할 수 있습니다.
레이어를 통째로 변경하는 경우
허깅페이스는 파이토치 기반이므로 torch.nn.Conv2D 레이어를 불러와 아예 변경해보도록 하겠습니다.
controlnet = ControlNetModel()
controlnet.controlnet\_cond\_embedding.conv\_in = nn.Conv2d(in\_channels=4, out\_channels=16, kernel\_size=(3, 3), stride=(1, 1), padding=(1, 1))
controlnet.controlnet\_cond\_embedding
구조는 동일하게 변경된 것을 확인할 수 있고요.
controlnet.controlnet\_cond\_embedding(torch.zeros((1,4,32,32)))
이렇게 레이어를 아예 변경해야 문제 없이 돌아가는 걸 확인할 수 있습니다.
여기까지 적고 생각해보니 당연히 레이어를 생성해야한다는 걸 깨닿게 되었는데 어쨌건 까먹지 않기 위해 글은 올려둬야겠네요.
반응형