본문 바로가기
AI/딥러닝

[AI 부트캠프] DAY 87 - 트랙학습 CV 1

by HOHHOH 2023. 11. 23.

[오늘의 일지]

트랙학습 실시간 강의 - CV

[상세 내용]

CV

용어 설명

- 우선 CV라는 단어는 컴퓨터 비전이라는 단어의 약자입니다. 단어 그대로 CV는 시각적으로 보이는 데이터를 다루는 분야라고 간단하게 생각할 수 있습니다.

 

수업 전개 방식

- 수업의 진행은 실습 코드를 이용해서 기초적인 부분부터 시작해서 기능을 하나씩 추가해서 자세하게 더 복잡한 모델로 발전시키면서 원리를 제대로 알아가는 방식이었습니다. 오늘은 첫날이다 보니 기존에 딥러닝에서 많이 사용하는 기본 NN모델에 Convolutional 한 레이어를 추가해서 CNN 모델을 만들어 나가는 방법을 배웠습니다. 

 

학습 데이터

- 학습 데이터는 CV 분야에서 가장 기초적인 데이터라고 할 수 있는 MNIST 데이터를 이용했습니다. MNIST 데이터는 간략하게 설명하자면 숫자 이미지를 가지고 있으며 이 데이터를 활용해서 학습을 시킨 뒤에 이미지를 잘 맞출 수 있도록 모델을 학습시킨다고 할 수 있습니다. 또 MNIST 데이터에는 fashion이라고 해서 옷 이미지를 가지고 있는 데이터도 있는데 두 가지를 모두 실습에 활용했습니다. 데이터를 가져오는 코드를 보여드리겠습니다. 

# 공개 데이터셋에서 학습 데이터를 내려받습니다.
# training_data = datasets.FashionMNIST( 이걸 사용하면 fashion 데이터입니다.
training_data = datasets.MNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
)

# 공개 데이터셋에서 테스트 데이터를 내려받습니다.
# test_data = datasets.FashionMNIST(
test_data = datasets.MNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor(),
)

 

 

- 데이터를 불러오는 것은 데이터셋이 이터레이터 형식으로 되어 있어서 for문을 통해서 x, y를 따로 불러올 수 있습니다. 그리고 x는 [N, C, H, W] 이런 형태로 되어 있는데 아래와 같은 의미를 가지고 있습니다.

  • N: 배치 크기 (Batch Size)
  • C: 채널 수 (Channel)
  • H: 높이 (Height)
  • W: 너비 (Width)
batch_size = 64

# 데이터로더를 생성합니다.
train_dataloader = DataLoader(training_data, batch_size=batch_size)
test_dataloader = DataLoader(test_data, batch_size=batch_size)

for X, y in test_dataloader:
    print(f"Shape of X [N, C, H, W]: {X.shape}")
    print(f"Shape of y: {y.shape} {y.dtype}")
    break

 

모델 만들기

- 모델은 기존 NN모델에  nn.Conv2d를 추가해서 CNN 모델을 기본적인 형태로 만드는 방법을 사용했습니다. 여기서 Convolutional이라는 단어는 합성곱이라는 뜻인데 두 함수를 곱하고 합하는 연산을 추가한다는 의미입니다. 합성곱을 추가함으로써 이미지를 더 인식하고 학습하는데 중요한 역할을 할 것으로 보입니다. 

class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.conv_block = nn.Sequential(
            nn.Conv2d(1, 16, 3),
            nn.ReLU(),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(16, 32, 3),
            nn.ReLU()
        )
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(3872, 512),
            nn.ReLU(),
            nn.Linear(512, 256),
            nn.ReLU(),
            nn.Linear(256, 10) # output과 label 데이터
        )

    def forward(self, x):
        x = self.conv_block(x)
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits

 

- 여기서 중요한 부분은 forward 함수에 logits 결과 부분에 activation이 있으면 아래의 로스함수를 nn.NNL를 사용해야 하고 없으면 CrossEntropy를 사용해야 합니다. 그렇게 설정하지 않으면 loss 함수를 2번 사용하는 상황을 겪게 될지도 모릅니다. 또한 output이 regressor라면 mae나 다른 로스함수를 사용하면 됩니다.

loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

 

 

학습한 모델 저장하고 불러와서 사용

- 이번에 새롭게 알게 된 부분은 모델을 학습시키고 학습시킨 모델을 저장한 뒤 바로 불러와서 예측하는 것이 가능하다고 합니다. 잘 사용하면 시간을 단축시키기에 좋을 거 같습니다.

# 저장하기
torch.save(model.state_dict(), "model.pth")
print("Saved PyTorch Model State to model.pth")

# 불러오기
model = NeuralNetwork().to(device)
model.load_state_dict(torch.load("model.pth"))

 

[마무리]

 오늘은 트랙학습 수업에서 배운 내용을 정리해 보았습니다. 오늘은 첫날이라 딥러닝 이론 때 배웠던 부분들을 실습 코드를 이용해서 기초부터 하나하나 코드를 리뷰해 가면서 실습해 보는 과정을 가졌습니다. 천천히 하나하나 하니까 이해하는데 너무 수월하고 좋은 거 같았습니다. 아무래도 기초를 탄탄하게 하는 것이 중요하니 집중해서 수업을 듣고 복습해야겠습니다.

반응형

댓글