작성
·
157
0
주피터 노트북 "06_1_DNN_PYTORCH" 자료에서 등록된 parameter 의 차원을 출력해보면 최초 출력되는 파라미터가 최초 등록한 nn.Linear(input_dim, 10) // (4, 10) 이면 (4, 10) 이 출력되어야 할 것 같은데 왜 (10, 4) 가 출력될까요?
x = torch.ones(4) # input tensor
y = torch.zeros(3) # expected output
input_dim = x.size(0)
output_dim = y.size(0)
model = nn.Sequential (
nn.Linear(input_dim, 10),
nn.LeakyReLU(0.1),
nn.Linear(10, 10),
nn.LeakyReLU(0.1),
nn.Linear(10, 10),
nn.LeakyReLU(0.1),
nn.Linear(10, output_dim)
)
loss_function = nn.MSELoss()
learning_rate = 0.01
nb_epochs = 1000
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
for epoch in range(nb_epochs + 1):
y_pred = model(x)
loss = loss_function(y_pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(loss)
for param in model.parameters():
print (param)
print(param.shape)
답변 1
0
안녕하세요. 답변 도우미입니다.
PyTorch에서 nn.Linear
모듈을 사용할 때 주의해야 할 중요한 점은 파라미터의 차원이 어떻게 표현되는지입니다. PyTorch의 nn.Linear
모듈은 내부적으로 가중치(weight) 행렬을 저장할 때 전치(transpose)된 형태로 저장합니다. 즉, nn.Linear(input_dim, output_dim)
을 사용할 경우 내부적으로 가중치 행렬의 크기는 (output_dim, input_dim)
으로 저장됩니다.
예를 들어, nn.Linear(4, 10)
은 내부적으로 가중치 행렬을 (10, 4)
의 형태로 가지고 있습니다. 이는 PyTorch가 선형 계층을 계산할 때 입력 벡터 \( x \)를 오른쪽에서 곱하기 때문에 \( Wx + b \)의 형태로 계산되도록 설정되어 있기 때문입니다. 여기서 \( W \)는 가중치 행렬이며, \( b \)는 편향(bias)입니다.
따라서 nn.Linear(input_dim, 10)
의 파라미터를 출력했을 때 (4, 10)
이 아니라 (10, 4)
로 출력되는 것이 정상적인 동작입니다. 이는 PyTorch의 구현 상세(detail)에 따른 것으로, 이러한 방식은 다른 프레임워크에서도 비슷하게 볼 수 있습니다.
감사합니다.
잔재미코딩 드림.