모델 계층 (Layer)
input_image = torch.rand(3,28,28)
print(input_image.size()) # layer 확인
Out:
torch.Size([3, 28, 28])
nn.Flatten
nn.Flatten는 layer를 초기화하여 각 28x28의 2D image를 784 pixel 값을 갖는 연속된 array로 변환한다. (dim=0의 미니배치 차원은 유지)
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.size())
Out:
torch.Size([3, 784])
nn.Linear
nn.Linear은 저장된 가중치 (weight)와 편향 (bias)을 사용하여 입력에 선형 변환 (linear transformation)을 적용하는 module이다.
layer1 = nn.Linear(in_features=28*28, out_features=20)
hidden1 = layer1(flat_image)
print(hidden1.size())
Out:
torch.Size([3, 20])
nn.ReLU
비선형 활성화 (activation)는 모델의 입력과 출력 사이에 복잡한 관계 (mapping)를 만든다. 비선형 활성화는 선형 변환 후에 적용되어 비선형성 (nonlinearity) 을 도입하고, 신경망이 다양한 현상을 학습할 수 있도록 돕는다. 이 모델에서는 nn.ReLU를 선형 계층들 사이에 사용하지만, 모델을 만들 때는 비선형성을 가진 다른 활성화를 도입할 수도 있다.
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
Before ReLU: tensor([[ 1.5047e-01, 3.6946e-01, -2.1153e-02, -3.4564e-04, -3.0788e-01,
1.9882e-02, -1.1780e-01, -5.4993e-01, -5.9037e-01, -2.5108e-01,
-5.1110e-01, 2.6428e-01, -1.5706e-01, -3.4855e-01, 2.4683e-01,
6.6800e-02, 1.1840e-01, 2.0951e-01, 2.1114e-01, 5.9677e-01],
[-2.0407e-01, -1.0187e-01, -1.3862e-01, 5.8749e-02, -1.1944e-02,
-3.9302e-01, 4.2164e-01, -3.6521e-01, -8.1786e-01, -1.8983e-01,
-3.8495e-01, 5.3707e-01, -7.4002e-02, -2.6657e-01, -1.4418e-01,
2.3176e-01, 3.7283e-01, 3.6056e-01, 1.0917e-01, 3.4045e-01],
[-3.6583e-01, 6.8759e-02, 2.1978e-01, -3.4410e-01, 2.0898e-02,
-1.0892e-01, 4.3534e-02, -2.3046e-01, -7.4926e-01, -4.0952e-01,
-1.3200e-01, 3.0964e-01, 1.9641e-01, -4.8414e-01, 1.0395e-01,
7.7206e-02, 5.4719e-01, 2.9023e-01, 4.2290e-02, 3.4000e-01]],
grad_fn=<AddmmBackward0>)
After ReLU: tensor([[0.1505, 0.3695, 0.0000, 0.0000, 0.0000, 0.0199, 0.0000, 0.0000, 0.0000,
0.0000, 0.0000, 0.2643, 0.0000, 0.0000, 0.2468, 0.0668, 0.1184, 0.2095,
0.2111, 0.5968],
[0.0000, 0.0000, 0.0000, 0.0587, 0.0000, 0.0000, 0.4216, 0.0000, 0.0000,
0.0000, 0.0000, 0.5371, 0.0000, 0.0000, 0.0000, 0.2318, 0.3728, 0.3606,
0.1092, 0.3404],
[0.0000, 0.0688, 0.2198, 0.0000, 0.0209, 0.0000, 0.0435, 0.0000, 0.0000,
0.0000, 0.0000, 0.3096, 0.1964, 0.0000, 0.1039, 0.0772, 0.5472, 0.2902,
0.0423, 0.3400]], grad_fn=<ReluBackward0>)
nn.Sequential
nn.Sequential은 순서를 갖는 module의 컨테이너이다. 데이터는 정의된 것과 같은 순서로 모든 moduel을 통해 전달된다. 순차 컨테이너 (sequential container)를 사용하여 seq_modules와 같은 신경망을 빠르게 만들 수 있다.
seq_modules = nn.Sequential(
flatten,
layer1,
nn.ReLU(),
nn.Linear(20, 10)
)
input_image = torch.rand(3,28,28)
logits = seq_modules(input_image)
nn.Softmax
신경망의 마지막 선형 계층은 nn.Softmax module에 전달될 [-infty, infty] 범위의 raw 값인 logits 를 반환한다. logits는 모델의 각 분류 (class)에 대한 예측 확률을 나타내도록 [0, 1] 범위로 비례하여 조정 (scale)된다. dim 매개변수는 값의 합이 1이 되는 차원을 나타낸다.
softmax = nn.Softmax(dim=1)
pred_probab = softmax(logits)
https://tutorials.pytorch.kr/beginner/basics/buildmodel_tutorial.html
'Python Library > PyTorch' 카테고리의 다른 글
[PyTorch] 자동 미분 (Automatic differentiation) (0) | 2022.01.13 |
---|---|
[PyTorch] 모델 매개변수 (Parameter) (0) | 2022.01.13 |
[PyTorch] 신경망 모델 구성 (0) | 2022.01.13 |
[PyTorch] 변형 (Transform) (0) | 2022.01.13 |
[PyTorch] DATASET / DATALOADER (0) | 2022.01.13 |