PyTorch 학습 자료: http://www.feiguyunai.com/index.php/2019/09/11/pytorch-char03/ ———————————————————————————————————— torch.nn
Containers는 신경망 기본 구조를 제공하며, 6개의 클래스로 구성되어 있다. 가장 자주 사용되는 Module는 모든 신경망 모듈의 기반 클래스이다.
Module 모든 신경망 모델(하위 클래스)은 Module(상위 클래스)를 상속해야 한다. Module은 모든 신경망에 템플릿을 제공하지만, 필요에 따라 수정 가능하다. 공식 예제:
import torch.nn as nn
import torch.nn.functional as F
class Network(nn.Module):
def __init__(self):
super(Network, self).__init__()
self.layer1 = nn.Conv2d(1, 20, 5)
self.layer2 = nn.Conv2d(20, 20, 5)
def forward(self, x):
x = F.relu(self.layer1(x))
return F.relu(self.layer2(x))
예시 코드:
import torch
from torch import nn
class MyNetwork(nn.Module):
def __init__(self):
super().__init__()
# forward 과정에서 사용할 레이어 정의
def forward(self, x):
# 객체에 직접 입력값 전달 가능
output = x + 1
return output
model = MyNetwork()
input_tensor = torch.tensor(1.0)
output = model(input_tensor)
print(output)
torch.nn과 torch.nn.functional 차이 torch.nn은 클래스를 포함하고, torch.nn.functional은 함수를 포함한다.
참고 자료: https://blog.csdn.net/wangweiwells/article/details/100531264 ———————————————————————————————— torch.nn.functional의 conv2d 예시를 통해 컨볼루션의 주요 파라미터 설명
import torch.nn.functional as F
output = F.conv2d(input, kernel, stride=1, padding=1)
공식 문서 참고:
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) → Tensor
input: (minibatch, in_channels, iH, iW) 형식 요구
- 형식 불일치 시 reshape:
input = torch.reshape(input, (1, 1, 32, 32))weight: 커널, (out_channels, in_channels/groups, kH, kW) 형식 요구 bias: optional, 기본값 None stride: 기본값 1, 커널 이동 거리 padding: 기본값 0, 패딩 너비 및 높이 - 단일 값 입력 시 H, W 모두 적용 가능, 별도 지정도 가능(sH, sW), (padH, padW)
———————————————————————————————— Module 및 conv2d 기반 nn.Conv2d 학습 예시 코드:
import torchvision
from torch import nn
from torch.utils.data import DataLoader
test_dataset = torchvision.datasets.CIFAR10(root=r'./cifar10', train=False, transform=torchvision.transforms.ToTensor())
data_loader = DataLoader(test_dataset, batch_size=64)
class MyNetwork(nn.Module):
def __init__(self):
super().__init__()
self.conv_layer = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
def forward(self, x):
output = self.conv_layer(x)
return output
model = MyNetwork()
for batch in data_loader:
images, labels = batch
result = model(images)
print(result.shape)
nn.Conv2d 클래스에 필요한 파라미터:
self.conv_layer = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
in_channels: 입력 채널 수
out_channels: 출력 채널 수 - 커널 개수와 동일
예: 입력이 3채널 이미지일 경우, 3채널 커널로 각각 특징 맵 생성
kernel_size: 커널 크기 (학습 중 자동 조정)
stride, padding 동일
컨볼루션 출력 크기 계산: 입력: (N, C_in, H_in, W_in) 출력: (N, C_out, H_out, W_out) H_out = floor[(H_in + 2padding[0] - dilation[0](kernel_size[0]-1) -1)/stride[0] +1] W_out = floor[(W_in + 2padding[1] - dilation[1](kernel_size[1]-1) -1)/stride[1] +1] 입력/출력 크기 동일 시 padding = (kernel_size-1)/2 계산
—————————————————————————————— 컨볼루션 층: 특징 추출, 풀링 층: 특징 데이터량 감소 풀링 층: 작업: 컨볼루션 출력을 서브샘플링 처리, 커널 크기 지정 후 그룹별 대표값 선택 (max/mean) 장점: 계산량 감소 단점: 세부 정보 감지 어려움 최근에는 Pooling 사용 줄이고 Full Conv 방식 채택 (예: AlphaGo)
- 학습 파라미터 없음
- 채널 수 유지
- 위치 변화에 강함
nn.MaxPool2d학습:torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)파라미터: kernel_size – 최대값을 취할 창 크기 stride – 창 이동 거리 (기본값 kernel_size) padding – 양쪽에 추가할 0 패딩 dilation – 창 요소 이동 간격 return_indices – True 시 최대값 인덱스 반환 ceil_mode – True 시 floor 대신 ceil 사용
예시 코드:
import torchvision
from torch import nn
from torch.utils.data import DataLoader
test_dataset = torchvision.datasets.CIFAR10(root=r'./cifar10', train=False, transform=torchvision.transforms.ToTensor())
data_loader = DataLoader(test_dataset, batch_size=64)
class MyNetwork(nn.Module):
def __init__(self):
super().__init__()
self.conv = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
self.pool = nn.MaxPool2d(3)
def forward(self, x):
output = self.pool(self.conv(x))
return output
model = MyNetwork()
for batch in data_loader:
images, labels = batch
result = model(images)
print(result.shape)
———————————————————————————————————
비선형 변환: torch.nn의 Non-linear Activations
nn.ReLU()
nn.Sigmoid()
nn.Softmax()
등
———————————————————————————————————
정규화는 과적합 방지, 손실 함수에 영향
정규화는 학습 속도 향상, 활성화 함수 입력에 적용. 컨볼루션 층 뒤 BatchNorm2d 추가하여 데이터 정규화 가능
nn.BatchNorm2d
자세한 내용: https://blog.csdn.net/qq_50001789/article/details/120507768
———————————————————————————————————
선형 레이어, 딥러닝에서 특징 차원 변환
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
in_features: 입력 차원 (전개 필요 torch.flatten(imgs) 또는 nn.Flatten())
out_features: 출력 차원
예시 코드:
import torchvision
from torch import nn
from torch.utils.data import DataLoader
test_dataset = torchvision.datasets.CIFAR10(root=r'./cifar10', train=False, transform=torchvision.transforms.ToTensor())
data_loader = DataLoader(test_dataset, batch_size=64, drop_last=True)
class MyNetwork(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(196608, 10)
def forward(self, x):
output = self.fc(x)
return output
model = MyNetwork()
for batch in data_loader:
images, labels = batch
flattened = torch.flatten(images)
result = model(flattened)
print(result.shape)
———————————————————————————————————————
nn.Sequential
__init__에서 레이어 묶기:
self.network = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
__forward__에서 코드 간소화:
output = self.network(input)