PyTorch를 사용하여 두 개의 입력을 가진 네트워크를 구성하는 방법
필수 라이브러리:
torch
torchvision
네트워크 정의
먼저, 두 개의 입력을 받아 하나의 출력을 생성하는 네트워크 클래스를 정의합니다. 예를 들어, 다음과 같은 코드를 사용할 수 있습니다.
import torch
class MyNet(torch.nn.Module):
def __init__(self):
super().__init__()
# 두 개의 입력을 위한 선형 레이어
self.fc1 = torch.nn.Linear(2, 10)
# 출력을 위한 선형 레이어
self.fc2 = torch.nn.Linear(10, 1)
def forward(self, x1, x2):
# 두 개의 입력을 결합합니다.
x = torch.cat((x1, x2), dim=1)
# 레이어를 통과시킵니다.
x = self.fc1(x)
x = torch.relu(x)
x = self.fc2(x)
# 출력을 반환합니다.
return x
데이터 준비
다음으로, 네트워크를 학습시키기 위한 데이터를 준비해야 합니다.
# 입력 데이터
x1 = torch.randn(10, 2)
x2 = torch.randn(10, 2)
# 출력 데이터
y = torch.randn(10, 1)
이제 네트워크를 학습시킬 수 있습니다.
# 손실 함수 정의
criterion = torch.nn.MSELoss()
# 옵티마이저 정의
optimizer = torch.optim.SGD(my_net.parameters(), lr=0.01)
# 학습 루프
for epoch in range(100):
# 순방향 전파
outputs = my_net(x1, x2)
# 손실 계산
loss = criterion(outputs, y)
# 역방향 전파
loss.backward()
# 옵티마이저 업데이트
optimizer.step()
# 손실 출력
print(f"Epoch {epoch + 1}: loss = {loss.item()}")
네트워크 학습이 완료되면 새로운 데이터에 대해 예측을 수행하는 데 사용할 수 있습니다.
# 새로운 입력 데이터
new_x1 = torch.randn(1, 2)
new_x2 = torch.randn(1, 2)
# 예측
outputs = my_net(new_x1, new_x2)
# 출력 확인
print(outputs)
예제 코드: PyTorch를 사용하여 두 개의 입력을 가진 네트워크를 구성하는 방법
import torch
class MyNet(torch.nn.Module):
def __init__(self):
super().__init__()
# 두 개의 입력을 위한 선형 레이어
self.fc1 = torch.nn.Linear(2, 10)
# 출력을 위한 선형 레이어
self.fc2 = torch.nn.Linear(10, 1)
def forward(self, x1, x2):
# 두 개의 입력을 결합합니다.
x = torch.cat((x1, x2), dim=1)
# 레이어를 통과시킵니다.
x = self.fc1(x)
x = torch.relu(x)
x = self.fc2(x)
# 출력을 반환합니다.
return x
# 입력 데이터
x1 = torch.randn(10, 2)
x2 = torch.randn(10, 2)
# 출력 데이터
y = torch.randn(10, 1)
# 네트워크 생성
my_net = MyNet()
# 손실 함수 정의
criterion = torch.nn.MSELoss()
# 옵티마이저 정의
optimizer = torch.optim.SGD(my_net.parameters(), lr=0.01)
# 학습 루프
for epoch in range(100):
# 순방향 전파
outputs = my_net(x1, x2)
# 손실 계산
loss = criterion(outputs, y)
# 역방향 전파
loss.backward()
# 옵티마이저 업데이트
optimizer.step()
# 손실 출력
print(f"Epoch {epoch + 1}: loss = {loss.item()}")
# 새로운 입력 데이터
new_x1 = torch.randn(1, 2)
new_x2 = torch.randn(1, 2)
# 예측
outputs = my_net(new_x1, new_x2)
# 출력 확인
print(outputs)
MyNet
클래스는 두 개의 입력 (x1
andx2
)을 받아 하나의 출력 (outputs
)을 생성하는 네트워크를 정의합니다.forward
메서드는 네트워크의 순방향 전파를 구현합니다.criterion
변수는 손실 함수를 정의합니다.optimizer
변수는 옵티마이저를 정의합니다.- 학습 루프는 네트워크를 학습시킵니다.
- 마지막으로, 새로운 데이터에 대한 예측을 수행합니다.
PyTorch를 사용하여 두 개의 입력을 가진 네트워크를 구성하는 대체 방법
import torch
def my_net(x1, x2):
# 두 개의 입력을 결합합니다.
x = torch.cat((x1, x2), dim=1)
# 선형 레이어를 통과시킵니다.
x = torch.nn.Linear(2, 10)(x)
x = torch.relu(x)
x = torch.nn.Linear(10, 1)(x)
# 출력을 반환합니다.
return x
# 입력 데이터
x1 = torch.randn(10, 2)
x2 = torch.randn(10, 2)
# 출력 데이터
y = torch.randn(10, 1)
# 네트워크 실행
outputs = my_net(x1, x2)
# 손실 계산 및 학습
...
nn.Sequential 사용:
import torch
class MyNet(torch.nn.Module):
def __init__(self):
super().__init__()
# 순차적 레이어 정의
self.layers = torch.nn.Sequential(
torch.nn.Linear(2, 10),
torch.nn.ReLU(),
torch.nn.Linear(10, 1)
)
def forward(self, x1, x2):
# 두 개의 입력을 결합합니다.
x = torch.cat((x1, x2), dim=1)
# 레이어를 통과시킵니다.
x = self.layers(x)
# 출력을 반환합니다.
return x
# ...
# 네트워크 생성
my_net = MyNet()
# ...
# 학습 및 사용
...
nn.ModuleDict 사용:
import torch
class MyNet(torch.nn.Module):
def __init__(self):
super().__init__()
# 레이어 딕셔너리 정의
self.layers = torch.nn.ModuleDict({
"fc1": torch.nn.Linear(2, 10),
"relu": torch.nn.ReLU(),
"fc2": torch.nn.Linear(10, 1)
})
def forward(self, x1, x2):
# 두 개의 입력을 결합합니다.
x = torch.cat((x1, x2), dim=1)
# 레이어를 통과시킵니다.
for name, layer in self.layers.items():
x = layer(x)
# 출력을 반환합니다.
return x
# ...
# 네트워크 생성
my_net = MyNet()
# ...
# 학습 및 사용
...
다른 프레임워크 사용:
- TensorFlow
- Keras
- Jax
python machine-learning neural-network