파이토치 첫걸음에서 모르는 부분이 있습니다.

2024.07.14 01:39 691 조회

3 딥러닝 모델 만들기에서 2번째 문제 이해가 안됩니다.

torch.nn을 사용할 때는


fc_layer = nn.Linear(in_features = 5, out_features = 3)

input_data = torch.rand(1,5)


를  functional을 사용할 때


weight = torch.rand(3, 5)

bias = torch.rand(3)

input_data = torch.rand(1, 5)로 코드를 작성하는데

torch.nn을 사용할 때 가중치가 torch.nn.functional을 사용할 때는 전치행렬이 되어야하는지 모르겠습니다.


이제 막 배우고 있는 단계라 답변 부탁드립니다. 감사합니다!!

로그인이 필요합니다
0 / 1000
DACON.JE
2024.07.15 17:22

안녕하세요 현주오님,

질문하신 내용 답변드립니다.
torch.nn 모듈을 사용할 때는 `nn.Linear` 클래스가 내부적으로 가중치와 바이어스를 관리합니다.

```python
fc_layer = nn.Linear(in_features=5, out_features=3)
input_data = torch.rand(1, 5)

fc_layer.weight.shape # torch.Size([3, 5])
```

위 코드에서 `fc_layer`는 내부적으로 가중치(weight)와 바이어스(bias)를 가지고 있으며, forward 연산 시 이들을 자동으로 사용합니다. 이때 `fc_layer.weight`의 크기는 `(3, 5)`가 됩니다. 즉, out_features가 행, in_features가 열로 저장됩니다.

반면에, torch.nn.functional 모듈을 사용할 때는 직접 가중치와 바이어스를 정의하고 이를 사용하여 연산을 수행해야 합니다.

```python
weight = torch.rand(3, 5)
bias = torch.rand(3)
input_data = torch.rand(1, 5)
output = torch.nn.functional.linear(input_data, weight, bias)
```

여기서 중요한 차이점은 가중치의 형태입니다. `nn.Linear`를 사용할 때는 가중치가 `(out_features, in_features)` 형태로 저장되며, `torch.nn.functional.linear`를 사용할 때도 동일하게 가중치가 `(out_features, in_features)` 형태로 주어져야 합니다. 따라서 `torch.nn.functional`을 사용할 때는 전치 행렬을 사용할 필요는 없습니다.

즉, nn.Linear에서의 가중치 형태 `(3, 5)`와 torch.nn.functional에서 직접 정의한 가중치 `(3, 5)`는 동일한 형태를 가집니다.

감사합니다.

ohjoohyun
2024.07.16 12:23

순전파 공식이 XW아닌가요? 입력 데이터가 size가 (1,5)이고 가중치는 (3, 5)인데 함수 내부적으로 전치행렬이 되어 자동으로 계산되는 건가요?

DACON.JE
2024.07.23 10:42

네, 일반적으로 순전파 공식은 일반적으로 XW 형태로 표현됩니다. 여기서 X는 입력 데이터이고, W는 가중치입니다.
입력 데이터의 크기가 (1, 5)이고, 가중치의 크기가 (3, 5)일 때, 행렬 곱셈이 가능하려면 가중치가 전치(transpose)된 상태여야 합니다. torch.nn.Linear 클래스와 torch.nn.functional.linear 함수는 이를 "내부적으로 처리"해줍니다.

nn.Linear 클래스에서는 가중치가 (out_features, in_features) 형태로 저장되며, 내부적으로 전치된 상태로 계산이 이루어집니다. 

ohjoohyun
2024.07.24 15:26

감사합니다!!