nn.Linear 은 신경망 은닉층의 한 레이어를 만들어줍니다. 선형함수입니다. 두가지 인자가 입력되는데 하나는 입력텐서의 차원이고 다른 하나는 출력텐서의 차원입니다.
예를 들어 아래와 같은 레이어를 만들었다고 합시다.
import torch.nn as nn
layer1=nn.Linear(3,1)
입력 텐서는 세개의 차원을 갖습니다. $[x_{1},x_{2},x_{3}]$ 라고 쓰겠습니다. 출력텐서는 하나의 차원을 갖습니다. y라고 쓰겠습니다. 이때 생성된 layer 는 아래와 같은 형태의 선형 함수입니다.
$y=w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+b$
b는 bias 입니다. nn.Linear 은 위와 같은 형태의 함수를 정의해줍니다. nn.Linear 에 담겨있는 정보는 weigth 들과 bias 입니다.
nn.Linear 는 weight와 bias 를 임의의 값으로 초기화합니다. 추후 학습을 통해 이 값을 업데이트합니다.
초기값을 확인하는 방법은 아래와 같습니다.
>>> layer1.weight
Parameter containing:
tensor([[-0.0059, 0.2145, 0.2442]], requires_grad=True)
>>> layer1.bias
Parameter containing:
tensor([-0.5115], requires_grad=True)
데이터가 레이어를 지나도록 만들어봅시다. nn.Linear 에서는 곱셈이 아래 형태로 정의되어 있습니다.
$y=\begin{bmatrix}
x_{1} &x_{2} &x_{3}
\end{bmatrix}\begin{bmatrix}
w_{1}\\
w_{2}\\
w_{3}
\end{bmatrix}+b$
따라서 행벡터 형태로 입력해야합니다. 텐서를 하나 정의합니다.
import torch
t1=torch.tensor([2,4,6])
레이어에 데이터를 통과시켜봅시다 .
>>> layer1(t1)
tensor([0.8290], grad_fn=<ViewBackward0>)
아래와 같이 y가 계산됩니다. 만약 두개의 데이터를 입력시키려면 어떻게 해야 할까요? 아래와 같이 각 행에 데이터가 오도록 만들면 됩니다.
t2=torch.tensor([[2.0,4.0,6.0],[1.0,5.0,7.0]])
>>> t2.size()
torch.Size([2, 3])
2행 3열임을 알 수 있습니다. 레이어에 통과시켜 봅시다.
>>> layer1(t2)
tensor([[0.8290],
[0.8121]], grad_fn=<AddmmBackward0>)
댓글