torch.nn.Module & nn.funcional
두 패키지가 제공하는 기능은 비슷하지만 사용하는 방법에 차이가 있다.
nn패키지 : 가중치(weight), 편향(bias) 값들이 내부에서 자동 생성되는 layer
nn.functional : weight나 bias를 직접 선언
nn이 제공하는 기능
- Parameters
- Containers
- Conv Layers
- Pooling Layers
- Padding Layers
- Non-linear Activation
- Normalization Layers
- Recuurent Layers
- Linear Layers
- Dropout Layers
- Sparse Layers
- Distance Functions
- Loss
- ...
nn.functional이 제공하는 기능
- Conv functions
- Pooling functions
- None-linear activation functions
- Normalization functions
- Linear functions
- Dropout functions
- Sparse functions
- Distance functions
- Loss functions
- ...
torch.nn.Parameter
- torch.nn.Parameter 클래스는 torch.Tensor 클래스를 상속받아 만들어졌고,
torch.nn.Module 클래스의 attribute로 할당하면, 자동으로 parameter 리스트(model.parameters())에 추가된다. - 파라미터로 지정하고 싶은 텐서일때 사용
self.weights = nn.Parameter(torch.randn(in_features, out_features))
self.bias = nn.Parameter(torch.randn(out_features))
하지만 보통은 아래와 같이 하위 모듈을 추가하는 식으로 구현을 하기 때문에(-> 자동으로 파라미터가 설정됨), model.parameters()에 파라미터를 직접 추가할 일이 거의 없다.
class LinearRegression(torch.nn.Module):
def __init__(self, inputSize, outputSize):
super(LinearRegression, self).__init__()
self.linear = torch.nn.Linear(inputSize, outputSize)
def forward(self, x):
out = self.linear(x)
return out
gradient초기화 및 계산
# 입력 및 출력 차원 정의, 하이퍼 파라미터 정의
inputDim = 1
outputDim = 1
learningRate = 0.01
epochs = 100
model = LinearRegression(inputDim, outputDim)
# loss function 및 optimizer 정의
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learningRate)
for epoch in range(epochs):
# input과 label을 PyTorch Variable 객체로 변환
if torch.cuda.is_available():
inputs = Variable(torch.from_numpy(x_train).cuda())
labels = Variable(torch.from_numpy(y_train).cuda())
else:
inputs = Variable(torch.from_numpy(x_train))
labels = Variable(torch.from_numpy(y_train))
# 이전 기록된 gradient를 0으로 초기화
optimizer.zero_grad()
# model을 통해 input forward propagation 진행
outputs = model(inputs)
# loss 값 계산
loss = criterion(outputs, labels)
print(loss)
# 모든 파라미터에 대해 gradient 계산
loss.backward()
# 파라미터 업데이트
optimizer.step()
print('epoch {}, loss {}'.format(epoch, loss.item()))
'데이터 스터디 > DL' 카테고리의 다른 글
[논문 읽기] GPT-1 : Improving Language Understanding by Generative Pre-Training (OpenAI) (0) | 2023.11.21 |
---|---|
[Pytorch] 파이토치 Dataset, Dataloader (0) | 2023.11.17 |
[Pytorch] 파이토치 텐서(tensor) 기초함수, 연산 (0) | 2023.11.17 |
[논문 읽기] Attention IS All You Need (Transformer) (0) | 2023.11.15 |
[논문 읽기] Neural Machine Translation by Jointly Learning to Align and Translate (Attention) (0) | 2023.11.14 |