https://pytorch.org/docs/stable/generated/torch.nn.Linear.html 참고
파이토치 공식 페이지를 참고하면 Weight를 Transpose하여 계산하게 되어있다. 왜 그렇까?
결론부터 말하자면 weight 는 노드의 개수 x feature 수 의 형태로 생성이되기 때문이다.
(# nn.Linear 는 개x채x행x열에서 "채" 행렬로(1D data)로 들어오길 기대하는 녀석이다.
# 이미지 데이터가 아니면, 개 채로 읽어야한다. 키와 몸무게를 가진 데티어 5개 -> 채널이 2개다, feature가 2개다. 개가 5이다. 5개의
데이터)
예를 들어보면서 설명해보겠다. (x라는 데이터가 fc1 layer를 1번 통과한다고 가정)
x = 1개의 feature를 가진 데이터가 1개 [[x1]]
fc1 = input 1개, output 3개 Linear 모델 -> weight: (3, 1)[[w1], [w2], [w3]] bias: (1, 3) [[b1, b2, b3]]
이런 경우 수식으로 결과를 표현하자면,
[[x1 * w1 + b1, x1 * w2 + b3, x1 * w3 + b3]]로 (1,3)의 shape의 결과로 나올 것이다.
벡터로 표기하자면, 아래와 같을 것이다.
pytorch에 weight 형식은 노드의 개수 x feature의 수 (3,1)로 되어있으니, (1,3)으로 transpose해줘야한다.
코드로 보자면 이렇다.
weight가 (3, 1)로 되어있어 (1,3)으로 transpose한 후 결과를 표기하면 fc1(x1)을 한 값과 동일한 결과를 얻을 수 있다.
'인공지능 > Deep Learning' 카테고리의 다른 글
분류경계선이 선형으로 나오는 모델은 선형분류만 가능 (0) | 2023.03.02 |
---|---|
BinaryClassification 직접 구현 (0) | 2023.03.01 |
Batch Normalization (0) | 2023.02.25 |
최적화 개념과 경사 하강법(Gradient Descent) (0) | 2023.02.21 |
역전파 (Backpropagation) 유도하기 (0) | 2023.02.19 |