Search

torch.nn

대분류
프레임워크
소분류
PyTorch
유형
신경망 계층 정의
활성화 함수
모듈 분류
PyTorch Core
최종 편집 일시
2024/10/27 15:25
생성 일시
2024/09/12 02:30
14 more properties

What is torch.nn(Neuron Network)?

PyTorch에서 신경망을 구성하고 학습하는 데 필요한 여러 도구들을 제공하는 매우 중요한 모듈
딥러닝 모델을 만들 때 필요한 레고 블록처럼, 신경망을 구성하는 다양한 구성 요소들을 제공해주는 역할

신경망 (Artificial Neural Network, ANN)

신경망은 뉴런(neuron)/노드(node)로 구성되며, 이들이 서로 연결된 형태를 가진다.

신경망의 동작 방식

입력 데이터를 받아 여러 층을 거쳐서 출력값을 생성하는 것
입력 데이터 전파(Forward Propagation):
입력층에서 입력 데이터를 받아들이고, 이를 은닉층을 통해 순차적으로 처리한다.
각 뉴런에서는 **가중치(weight)**와 **편향(bias)**를 적용한 선형 연산이 일어나며, 이를 **활성화 함수(activation function)**를 통해 비선형 변환을 거친다.
이러한 과정이 여러 은닉층을 통과하며 반복되고, 최종적으로 출력층에서 예측값이 나온다.
오차 계산:
출력층의 예측값과 실제 값(라벨) 간의 차이를 계산하여, **손실 함수(loss function)**를 통해 오차를 구한다.
오차가 크다면, 신경망의 가중치와 편향을 수정할 필요가 있다.
역전파(Backward Propagation):
역전파는 오차를 기반으로 각 가중치에 대한 기울기를 계산하고, 이를 통해 가중치를 업데이트하는 과정이다.
이때, 기울기 하강법(Gradient Descent) 같은 최적화 알고리즘을 사용하여 가중치를 조금씩 조정한다.
이 과정이 반복되면서 신경망은 점차 학습되어 오차가 줄어들고, 더 정확한 예측을 하게 된다.

신경망의 유형

1.
단층 퍼셉트론(Single Layer Perceptron):
하나의 은닉층이 없는 신경망으로, 매우 간단한 패턴만 학습할 수 있다.
XOR 문제와 같은 복잡한 패턴을 학습하는 데는 한계가 있다.
2.
다층 퍼셉트론(Multi-layer Perceptron, MLP):
여러 개의 은닉층을 포함한 신경망으로, 복잡한 데이터 패턴을 학습할 수 있다.
일반적으로 딥러닝(Deep Learning)이라는 용어는 은닉층이 여러 개 있는 신경망을 지칭
3.
합성곱 신경망(Convolutional Neural Network, CNN):
주로 이미지 처리에 사용되며, 이미지의 국소적 특징을 추출하는 데 유리한 구조
합성곱 레이어와 풀링 레이어를 통해 이미지의 공간 정보를 압축하고 중요한 특징을 학습한다.
4.
순환 신경망(Recurrent Neural Network, RNN):
시계열 데이터나 순차 데이터를 처리하는 데 특화된 신경망
시간적 연속성이 있는 데이터에서 과거 정보가 현재 예측에 영향을 줄 수 있도록 설계되었다.
RNN의 변형인 LSTM(Long Short-Term Memory)과 GRU(Gated Recurrent Unit)는 장기 의존성을 더 잘 학습할 수 있다.

신경망의 장점과 단점

장점
1.
복잡한 패턴 학습: 신경망은 선형 모델로는 학습하기 어려운 복잡한 데이터 패턴을 잘 학습할 수 있다.
2.
범용성: 이미지, 음성, 텍스트 등 다양한 형태의 데이터를 처리하는 데 강력하다.
3.
비선형성: 활성화 함수를 통해 비선형성을 도입하여, 선형 변환만으로는 해결할 수 없는 문제를 풀 수 있다.
단점
1.
많은 데이터 요구: 신경망이 잘 학습되려면 대규모 데이터셋이 필요하다.
2.
과적합 위험:
데이터가 적거나 모델이 너무 복잡할 경우 과적합(overfitting)이 발생할 수 있다.
→ 이를 방지하기 위해 드롭아웃(Dropout) 같은 기법을 사용
3.
학습 속도
신경망은 학습 과정에서 많은 연산이 필요하므로, 훈련 속도가 느릴 수 있다.
특히, 매우 깊은 신경망에서는 학습 시간이 오래 걸릴 수 있다.
→ 그래서 GPU를 사용

레이어

신경망(Neural Network)의 핵심 구성 요소 중 하나
데이터를 입력받아 여러 계산을 수행한 뒤 출력값을 반환하는 연산(계산) 단위
신경망은 여러 개의 레이어가 연결된 구조로 되어 있으며, 입력 데이터를 처리하고 특징을 추출하여 최종 예측을 할 수 있도록 한다.
각 레이어는 입력을 받아 가중치(weight)와 편향(bias)을 적용한 뒤, 활성화 함수(activation function)를 사용하여 비선형적인 출력을 생성

정규화

nn.Module

설명
nn.Module은 모든 신경망 레이어(layer)와 모델의 기본 클래스다. 즉, 신경망의 블록들을 만들어내는 틀 역할
nn.Module을 상속받아 새로운 신경망 모듈을 만들 수 있다.
대부분의 PyTorch 모델은 이 클래스를 상속하여 만들어진다.
특징
forward() 메서드를 사용해 데이터가 어떻게 처리될지를 정의하고, 그 외에도 학습 가능한 파라미터(가중치 등)를 자동으로 관리한다.
예시
import torch.nn as nn class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.layer1 = nn.Sequential( nn.Conv2d(in_channels=hidden_units, out_channels=hidden_units, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(in_channels=hidden_units, out_channels=hidden_units, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) # 다시 절반으로 줄임 ) def forward(self, x): x = self.layer1(x) return x
Python
복사

주요 정의 메서드

__init__(self)

모델의 레이어를 정의하는 부분.
신경망의 레이어나 필요한 변수를 초기화하는 데 사용된다. 모델의 구조를 이곳에서 정의한다.
예시
import torch.nn as nn class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.fc1 = nn.Linear(10, 20) # 10개의 입력, 20개의 출력 self.relu = nn.ReLU() # 활성화 함수 self.fc2 = nn.Linear(20, 1) # 20개의 입력, 1개의 출력
Python
복사

forward(self, x)

입력 데이터가 어떻게 네트워크를 통과할지를 정의하는 메서드
입력 데이터가 모델을 통해 전달되는 과정을 정의한다.
이 메서드는 신경망이 순방향으로 데이터를 처리하는 방식(순전파)을 설명한다.
예시
def forward(self, x): x = self.fc1(x) # 첫 번째 선형 레이어를 통과 x = self.relu(x) # ReLU 활성화 함수 적용 x = self.fc2(x) # 두 번째 선형 레이어를 통과 return x
Python
복사

핵심 메서드

to()

모델을 GPU나 CPU로 이동시킬 때 사용된다.
예를 들어, 모델을 GPU에서 학습하려면 to() 메서드를 사용하여 모델과 데이터를 GPU로 옮겨야 한다.
device = 'cuda' model = MyModel().to(device) # 모델을 GPU로 이동
Python
복사

eval()

모델을 평가 모드로 전환한다.
드롭아웃(Dropout)이나 배치 정규화(BatchNorm) 같은 레이어들은 학습 모드와 평가 모드에서 다르게 동작하므로, 평가할 때는 eval()로 설정해야 한다.
model.eval() # 모델을 평가 모드로 전환
Python
복사

train() : 기본값

모델을 학습 모드로 전환한다.
기본적으로 모델은 학습 모드로 설정되지만, 평가 후 다시 학습을 할 때는 train()으로 설정해주어야 한다.
model.train() # 모델을 학습 모드로 전환
Python
복사

레이어(Layer)

nn.Sequential

설명
여러 레이어를 순차적으로 쌓아 간단하게 모델을 구성할 수 있게 해주는 모듈
각 레이어를 순서대로 연결해 모델을 정의하는 경우 유용하다.
용례: 간단한 네트워크를 정의할 때 매우 편리하다.
순서대로 레이어를 정의한다.
model = nn.Sequential( nn.Linear(10, 20), nn.ReLU(), nn.Linear(20, 5) )
Python
복사

nn.Linear (선형 레이어)

설명
입력과 출력 사이의 선형 변환을 수행하는 레이어
즉, 입력 데이터를 특정 가중치와 곱하고 편향을 더해 결과를 도출한다.
메소드: nn.Linear(in_features, out_features)
in_features: 입력 데이터의 크기
out_features: 출력 데이터의 크기
용례: Fully Connected Layer(완전 연결 층)에서 주로 사용된다. = Dense Layer
사용 용도: 회귀 문제, 분류 문제 등에서 많이 사용된다.
예제 코드
linear = nn.Linear(10, 5) # 입력 크기 10, 출력 크기 5
Python
복사

nn.Conv{nn}d (nnD 합성곱 레이어)

설명
n차원 데이터를 처리하는 합성곱 레이어
이미지의 공간 정보를 유지하며 특징을 추출할 때 사용
메소드:
nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0)
in_channels: 입력 채널 수 (예: 단어 임베딩의 크기 또는 시계열 데이터의 채널 수)
out_channels: 출력 채널 수 (필터 개수)
kernel_size: 합성곱 커널(필터)의 크기 (예: 3은 한 번에 3개의 값을 처리)
stride: 커널이 이동하는 간격 (기본값은 1, 값을 크게 하면 특성 크기 축소)
padding: 입력 데이터 가장자리에 추가하는 값 (입력을 더 크게 만들어 정보 손실을 방지)
추가 옵션
dilation: 커널의 크기를 확장하여 넓은 범위에서 특징을 추출할 수 있음.
groups: 입력과 출력 채널을 그룹으로 나누어 처리하는 옵션
(default: 1, 모든 채널 처리).
bias: 편향 값 사용 여부 (기본값은 True).
nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0)
in_channels: 입력 채널 수 (예: RGB 이미지라면 3, 흑백 이미지라면 1)
out_channels: 출력 채널 수 (필터의 개수)
kernel_size: 합성곱 커널의 크기 (예: (3, 3)은 3x3 크기의 필터)
stride: 커널이 이동하는 간격 (기본값 1, 값이 크면 출력 크기 축소)
padding: 입력 데이터 가장자리에 추가하는 값 (필터가 경계까지 적용되도록 함)
추가 옵션
dilation: 커널의 크기를 확장하여 더 넓은 영역을 학습 (기본값 1).
groups: 채널을 그룹으로 나누어 처리 (예: groups=2이면 2개의 그룹으로 나누어 학습).
bias: 편향 값을 추가할지 여부 (기본값은 True).
nn.Conv3d(in_channels, out_channels, kernel_size, stride=1, padding=0)
in_channels: 입력 채널 수 (예: 3D 의료 영상 데이터라면 채널 수)
out_channels: 출력 채널 수 (필터의 개수)
kernel_size: 3차원 합성곱 커널의 크기 (예: (3, 3, 3)은 3x3x3 필터)
stride: 커널이 이동하는 간격 (기본값 1, 값을 크게 하면 계산 속도는 빨라지지만 출력 크기 축소)
padding: 입력 데이터 가장자리에 추가하는 값 (정보 손실을 방지하기 위해 경계에서 패딩을 추가)
추가 옵션
dilation: 커널의 확장 정도 (확장된 커널은 더 넓은 영역에서 특징 추출).
groups: 채널을 그룹으로 나누어 처리 (default: 1, 모든 채널 처리).
bias: 편향 값 사용 여부 (기본값은 True).
용례
1D : 시계열 데이터연속적인 데이터에서 사용
2D : 이미지 처리(컴퓨터 비전)에서 사용
3D : 비디오 데이터3차원 데이터(의료 3D 스캔 데이터, 점 구름 데이터 처리) 를 처리
사용 용도: 이미지 분류, 객체 탐지, 이미지 생성 등.
예제 코드
conv = nn.Conv2d(3, 16, 3, stride=1, padding=1) # 입력 채널 3, 출력 채널 16, 커널 크기 3x3
Python
복사

nn.MaxPool2d (최대 풀링: 차원축소 레이어)

설명
합성곱 층에서 추출한 특징 맵을 다운샘플링하는 역할
주어진 영역에서 가장 큰 값을 선택해 출력한다.
계산량을 줄인다.
메소드: nn.MaxPool2d(kernel_size, stride=None, padding=0)
kernel_size: 풀링을 할 영역의 크기
stride: 이동 간격 (지정하지 않으면 kernel_size와 동일)
padding: 입력의 가장자리에 추가하는 값
용례: 이미지 데이터의 크기를 줄이고 특징을 요약할 때 사용된다.
사용 용도: 이미지 처리에서 주로 사용
예제 코드
maxpool = nn.MaxPool2d(2, 2) # 2x2 영역에서 최대값을 선택, stride 2
Python
복사

nn.BatchNorm2d (배치 정규화 레이어)

설명
입력 데이터를 정규화해 학습 속도를 빠르게 하고, 모델의 일반화 성능을 높이는 데 사용한다.
메소드: nn.BatchNorm2d(num_features)
num_features: 입력의 채널 수
용례: 합성곱 신경망(CNN)에서 자주 사용된다.
사용 용도 : 과적합을 방지하고 모델의 학습을 안정화할 때 유용
예제 코드
batchnorm = nn.BatchNorm2d(16) # 채널 수 16개
Python
복사

nn.Dropout (드롭아웃 레이어)

설명: 학습 과정에서 일부 뉴런을 랜덤하게 비활성화해 과적합을 방지하는 데 사용
메소드: nn.Dropout(p=0.5)
p: 드롭아웃 비율 (0과 1 사이의 값, 0.5는 50%의 뉴런을 비활성화함)
용례: 과적합을 방지하기 위해 신경망의 중간에서 자주 사용된다.
사용용도: 과적합이 발생할 위험이 있는 복잡한 모델에서 많이 사용된다.
예제 코드
dropout = nn.Dropout(0.5)
Python
복사

nn.LSTM (Long Short-Term Memory, LSTM 레이어)

설명: 순환 신경망(RNN)의 한 종류로, 시계열 데이터를 처리할 때 장기 의존성을 기억할 수 있는 레이어다.
메소드: nn.LSTM(input_size, hidden_size, num_layers)
input_size: 입력 데이터의 크기
hidden_size: LSTM의 은닉 상태 크기
num_layers: LSTM 레이어의 수
용례: 자연어 처리, 시계열 분석 등에서 주로 사용된다.
주로 사용되는 문제: 자연어 처리, 시계열 데이터 예측.
예제 코드
lstm = nn.LSTM(10, 20, 2) # 입력 크기 10, 은닉 상태 크기 20, 2개의 LSTM 레이어
Python
복사

nn.Embedding (임베딩 레이어)

설명: 정수 인덱스를 임베딩 벡터로 변환하는 레이어로, 주로 텍스트 데이터에서 단어를 벡터로 변환하는 데 사용된다.
메소드: nn.Embedding(num_embeddings, embedding_dim)
num_embeddings: 임베딩할 단어의 개수
embedding_dim: 임베딩 벡터의 크기
용례: 자연어 처리에서 단어를 벡터로 변환할 때 자주 사용된다.
주로 사용되는 문제: 텍스트 데이터를 벡터화할 때 자주 사용.
예제 코드
embedding = nn.Embedding(1000, 64) # 1000개의 단어, 임베딩 크기 64
Python
복사

nn.Flatten (평탄화 레이어)

설명
입력 텐서를 1차원 벡터로 변환하는 레이어
CNN과 같은 네트워크에서 Convolutional Layer의 출력을 Fully Connected Layer로 입력할 때 주로 사용한다.
다차원 텐서를 하나의 연속된 차원으로 평탄화하여 인공 신경망의 선형 계층에 연결하기 쉽게 만들어준다.
메소드: nn.Flatten(start_dim=1, end_dim=-1)
start_dim: 평탄화할 시작 차원을 지정 (기본값은 1).
end_dim: 평탄화할 마지막 차원을 지정 (기본값은 -1, 즉 마지막 차원까지).
용례: 컨볼루션 연산 이후 결과를 선형 레이어에 넣기 전에 사용된다. 예를 들어, 2D 이미지의 출력 텐서를 1D 벡터로 변환할 때 사용된다.
사용 용도: 컨볼루션 층에서 추출한 특징 맵을 선형 레이어로 전달할 때, 이를 일차원 벡터로 변환하기 위해 사용된다.
예제 코드
flatten = nn.Flatten()
SQL
복사

nn.Embedding (임베딩 레이어)

설명
정수 인덱스를 고정된 크기의 밀집 벡터로 변환하는 레이어.
주로 자연어 처리에서 단어를 벡터 표현으로 바꾸기 위해 사용된다. 입력으로 단어의 인덱스를 받아 그 인덱스에 해당하는 임베딩 벡터를 반환한다.
임베딩은 학습 가능한 레이어로, 단어 간의 의미적 유사성을 학습해 벡터 공간에서 이를 반영할 수 있다.
메소드: nn.Embedding(num_embeddings, embedding_dim)
num_embeddings: 단어 사전의 크기 (전체 단어의 개수).
embedding_dim: 각 단어를 표현하는 벡터의 차원 (임베딩 벡터의 크기).
용례: 단어를 정수로 표현한 뒤, 이를 벡터로 변환해 신경망에 입력하는 경우에 사용된다. 주로 자연어 처리(NLP) 모델에서 단어 임베딩을 생성하기 위해 많이 사용된다.
사용 용도: 텍스트 데이터 처리 시 단어 또는 문장을 임베딩 벡터로 변환해 모델의 입력으로 사용하기 위해 사용된다. 이를 통해 단어의 의미를 벡터 공간에서 다룰 수 있다.
예제 코드:
embedding = nn.Embedding(100, 10)
SQL
복사

Transformer Layers

nn.TransformerEncoderLayer

d_model: 기본값이 512
nhead: 기본값이 8
dim_feedforward: 기본값이 2048
batch_first: 기본값이 False

nn.TransformerEncoder

encoder_layer: TransformerEncoderLayer의 객체
num_layers: 인수로 전달 받은 인코더 레이어를 얼마나 쌓을 것인가의 수
트랜스포머 모델의 주요 파라미터
d_model: 트랜스포머의 인코더와 디코더에서의 정해진 입력과 출력의 크기를 의미합니다. (default=512)
num_encoder_layers: 트랜스포머 모델에서 인코더가 총 몇 층으로 구성되었는지를 의미합니다. (default=6)
num_decoder_layers: 트랜스포머 모델에서 디코더가 총 몇 층으로 구성되었는지를 의미합니다. (default=6)
nhead: 멀티헤드 어텐션 모델의 헤드 수, 어텐션을 사용할 때 여러 개로 분할해서 병렬로 어텐션을 수행하고 결과값을 다시 하나로 합치는 방식에서 병렬의 수 (default=8)
dim_feedforward: feedforward network model 의 차원, 피드 포워드 신경망의 은닉층의 크기(default=2048).

함수

nn.ReLU (비선형 활성화 함수)

설명
비선형 활성화 함수 중 하나
입력 값이 0보다 크면 그대로 반환하고, 0 이하이면 0으로 만든다.
신경망에 비선형성을 부여해 복잡한 패턴을 학습하게 도와준다.
용례
대부분의 딥러닝 모델에서 매우 자주 사용
특히 깊은 신경망에서는 필수적인 활성화 함수
주요 파라미터
inplace: True로 설정하면 입력 데이터를 덮어쓰기 방식으로 변환하여 메모리 사용을 줄일 수 있다. 기본값은 False.
relu = nn.ReLU() # 대체론 이렇게 # or relu = nn.ReLU(inplace=True)
Python
복사

nn.CrossEntropyLoss (손실 함수)

설명
분류 문제에서 자주 사용하는 손실 함수
모델의 예측 값과 실제 라벨 간의 차이를 계산해 모델을 학습시키는 데 사용
이 함수는 모델의 예측 확률 분포와 실제 라벨을 비교해 손실을 계산
용례
이진 분류나 다중 클래스 분류 문제에서 사용되며, 모델이 틀린 예측을 할 때 더 큰 손실 값을 반환해 이를 학습 과정에서 줄이도록 돕는다.
주요 파라미터
weight: 각 클래스에 대해 가중치를 부여할 때 사용. 클래스의 비율이 불균형한 경우 유용.
reduction: 손실 값을 어떻게 처리할지 결정하는 파라미터. mean은 손실 값을 평균내고, sum은 합을 구하며, none은 별도의 처리 없이 그대로 반환.
loss_fn = nn.CrossEntropyLoss(weight=None, reduction='mean')
Python
복사