Distilling the Knowledge in a Neural Network 논문 리뷰 중... 급 작성..

 

Deep learning 모델에서 일종의 학습 척도인 loss 와 모델의 확률 값인 softmax 값에 대한 정리.

5개의 클래스를 분류하는 모델의 예제로 살펴보겠다.

 

어떠한 아키텍처을 통과하고 마지막 클래스 갯수를 가지는 logits layer가 있다고 생각해보자.

로짓값들에 softmax를 취하게 되면 p1 ~ p5 값으로 나오게 된다.

다음으로 y 값(target)과 Ground Truth를 비교해 참으로 할당된 값에대해 cross_entropy를 취함.

  * 틀린 레이블의 경우 cross_entropy를 통과해도 0값이 나오기 때문에 생략해준다.

cross_entropy 값이 즉 데이터에 대한 loss 값이 되고 softmax 값이 모델의 확률값이 된다.

  * 마찬가지로 exp(-loss) 값을 해주어도 모델의 확률 값이 됨.

logits value -> softmax(logits) -> cross_entropy(softmax(true label))

logits value p1~p5 -> softmax(p1~p5) -> cross_entropy(softmax(p3))

 

pytorch에서 Imbalance data set을 만들고 model을 동작했을때 오류.

ex) 10개의 클래스를 가진 데이터를 2개의 클래스만 사용하도록 imbalance한 데이터 셋을 만들었다. 모델의 마지막 fully connected layer의 경우 num_classes를 10에서 사용한 클래스 만큼2로 바꿔주었지만 에러가 발생함.

 

10개의 클래스가 있는 데이터에서 1번과 10번의 클래스를 사용한다고 했을때, target 데이터는 0,9의 값을 갖게됨. 여기서 문제가 발생. pytorch가 0~9개의 y값을 갖는다 생각 하는듯..?

y 값을 0,1로 바꿔주어야함. 즉 클래스 개수만큼 target 데이터는 0 ~ 클래수 갯수 만큼 1씩 증가시켜 줘야함.

ex) 4개의 데이터를 사용하면 target data = 0,1,2,3의 값으로 변경.

 

 

1. target values are not in the expected range of [0, num_classes].

   -> fixed num_classes 

2. change target data -> 0 ~ num_classes 

   if you have 10 classes data (target data is 0~9) but using 3 classes (target data 1,5,9)

   change target data  :   target data 1,5,9 -> target data is 0,1,2 

resnet RuntimeError: Given groups=1, weight of size [16, 3, 3, 3], expected input[128, 32, 32, 3] to have 3 channels, but got 32 channels instead 오류

 

Cifar 데이터를 Pytorch에서 제공하는 dataloader가 아닌 Custom data set으로 만들어 주었을때 위와 같은 오류가 발생.

보통의 경우 dataloader에서 나오는 데이터형식과 모델에서 받는 데이터 형식이 다르기 때문이다.

x 데이터의 형식을 torch.permute()로 변경해서 해결.

 

monetworkel의 forward의 단에서 수정을 해줌.

loader를 통해서 network에 input 변수(x data)가 들어감. 

for i, (input, target) in enumerate(loader):
  output = network(input)  

 

model 정의 부분에 forward 부분에서 s.Szie를 해준 결과 [128,32,32,3]의 결과가 나옴.

pytorch에서 정의해준 데이터셋을 사용할 경우 [128,3,32,32]이 나오게 됨.

torch.permute()를 이용해서 데이터의 위치를 바꿔줘야함.

loader를 통해 나온 값은 [128,3,32,32] -> [배치사이즈,이미지채널,이미지가로,이미지세로]의 형식을 가져야한다.

 

def forward(self, x):
  x = x.permute(0,3,1,2)

  out = self.conv1(x)

Pytorch 에서의 학습 모델 저장하고 불러오기.

train model save & load

 

# Save

net = resnet.ResNet(110, 100).cuda()

train()

torch.save(net.state_dict(), './resnet110_cifar100.pth'))

 

# Load

net.load_state_dict(torch.load( './resnet110_cifar100.pth'))

test()

 

모델 구조가 같은데 파라미터들의 이름이 다른 경우.

model same but parameters name differ

 

net = resnet.ResNet(110, 100).cuda()

net.load_state_dict(torch.load( './resnet110_cifar100.pth'))


new_model = NewModel(net)

pretrained_dict = new_model.state_dict()
model_dict = net.state_dict()
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}

# update & load
model_dict.update(pretrained_dict)
net.load_state_dict(model_dict)

+ Recent posts