파이토치 CNN 튜토리얼: 파이썬에서 합성곱 신경망 구축 및 훈련하기

합성곱 신경망(CNN)은 현대 컴퓨터 비전의 초석으로, 이미지 인식, 얼굴 인식 및 자율주행차와 같은 애플리케이션을 가능하게 합니다. 이러한 네트워크는 이미지를 통해 패턴과 특징을 자동으로 추출하도록 설계되어, 시각적 작업을 위한 전통적인 기계 학습 기술보다 더 강력합니다.

이번 튜토리얼에서는 연구 및 생산 애플리케이션을 위해 사용자 친화적이며 매우 효율적인 딥 러닝 프레임워크인 PyTorch를 사용하여 CNN을 구현할 것입니다.

전제 조건: 딥 러닝 및 PyTorch

CNN의 세부 사항에 들어가기 전에, 환경 설정 중에 사용할 Python 라이브러리와 딥 러닝 분야에 익숙해야 합니다.

딥 러닝은 기계 학습의 하위 집합으로, 기본 모델 구조는 입력, 은닉층 및 출력으로 구성된 네트워크입니다. 이러한 네트워크는 하나 이상의 은닉층을 가질 수 있습니다. 딥 러닝의 원래 직관은 인간의 뇌가 배우는 방식을 본떠 모델을 만드는 것이었습니다: 뉴런이라고 불리는 상호 연결된 세포를 통해 배우는 것입니다. 그렇기 때문에 우리는 딥 러닝 모델을 “신경” 네트워크라고 계속 부릅니다. 이러한 층화된 모델 구조는 비구조적 데이터에서 패턴을 도출하기 위해 다른 감독 학습 모델보다 훨씬 많은 데이터를 필요로 합니다. 우리는 일반적으로 최소 수십만 개의 데이터 포인트에 대해 이야기합니다.

여러 딥 러닝 알고리즘을 구현하기 위한 프레임워크와 패키지가 많이 있지만, 우리는 가장 인기 있고 잘 유지 관리되는 프레임워크 중 하나인 PyTorch에 집중할 것입니다. 산업의 딥 러닝 엔지니어들에 의해 사용되는 것 외에도, PyTorch는 연구자들 사이에서 선호되는 도구입니다. 많은 딥 러닝 논문이 PyTorch를 사용하여 발표됩니다. PyTorch는 직관적이고 사용자 친화적으로 설계되었으며, Python 라이브러리인 NumPy와 많은 공통점을 공유합니다.

이 개념에 대한 기본 지식이 필요하다면 오늘 PyTorch로 배우는 딥 러닝 과정에 등록해 보세요.

합성곱 신경망(CNN)이란 무엇인가요?

합성곱 신경망, 일반적으로 CNN 또는 ConvNet이라고 불리는 것은 컴퓨터 비전 작업에 잘 적합한 특정 종류의 딥 신경망입니다. CNN의 발명은 1980년대로 거슬러 올라갑니다. 그러나 CNN은 그래픽 처리 장치(GPU)의 구현으로 인한 컴퓨팅 혁신 덕분에 2010년대에 주류가 되었습니다. 실제로 CNN의 빠른 대중화는 신경망 분야의 재부각을 도왔고, 우리가 여전히 살고 있는 이른바 “세 번째 신경망 물결”로 이어졌습니다.

CNN은 생물학적 시각 피질에서 영감을 받았습니다. 피질에는 시각적 영역의 특정 부분에 민감한 작은 세포 영역이 있습니다. 이 아이디어는 1962년 Hubel과 Wiesel의 매혹적인 실험에 의해 확장되었습니다.

CNN은 다른 작업별로 만들어진 복잡한 신경망으로 특징을 복제하려고 노력합니다. CNN은 정보가 모델을 통과하여 흐르는 “피드 포워드”라고 불립니다. 모델의 출력이 자체로 다시 피드백되는 피드백 연결이 없습니다. 다른 backpropagation 기법을 사용하는 모델과 비교했을 때.

특히, CNN은 일반적으로 다음과 같은 계층으로 구성됩니다:

합성곱 계층

이것은 CNN의 첫 번째 구성 요소입니다. 이름에서 알 수 있듯이, 수행되는 주요 수학적 작업은 합성곱이라고 불리며, 이는 이미지를 나타내는 픽셀 행렬에 슬라이딩 윈도우 함수를 적용하는 것입니다. 행렬에 적용된 슬라이딩 함수를 커널 또는 필터라고 합니다. 합성곱 계층에서는 동일한 크기의 여러 필터가 적용되며, 각 필터는 이미지에서 특정 패턴을 인식하는 데 사용됩니다. 예를 들어 숫자의 구부러진 형태, 가장자리, 숫자의 전체 모양 등을 인식합니다. 

활성화 함수

일반적으로, 각 합성곱 작업 후 ReLU 활성화 함수가 적용됩니다. 이 함수는 네트워크가 이미지의 특징 사이의 비선형 관계를 학습하도록 도와주며, 서로 다른 패턴을 식별하기 위해 네트워크를 더 견고하게 만듭니다. 또한 gradient 소실 문제를 완화하는 데 도움이 됩니다. 

풀링 계층

풀링 레이어의 목표는 복잡한 행렬에서 가장 중요한 특징을 추출하는 것입니다. 이는 집계 연산을 적용하여 특징 맵(복잡한 행렬)의 차원을 줄임으로써 이루어지며, 이를 통해 네트워크 훈련 시 사용되는 메모리를 줄입니다. 풀링은 과적합을 완화하는 데에도 중요합니다.

완전 연결 레이어

이 레이어는 합성곱 신경망의 마지막 레이어에 위치하며, 입력은 마지막 풀링 레이어에서 생성된 평탄화된 일차원 행렬에 해당합니다. 비선형성을 위해 ReLU 활성화 함수가 적용됩니다.

합성곱 신경망 아키텍처. 출처: DataCamp

CNN의 수학적 원리에 대한 더 자세한 설명은 우리의 튜토리얼인 Python에서의 합성곱 신경망에서 읽을 수 있습니다.

이미지 분류에 CNN을 사용하는 이유는 무엇인가요?

컨볼루션 신경망은 컴퓨터 비전 분야에서 가장 영향력 있는 혁신 중 하나였습니다. 이들은 SVMs의사 결정 트리와 같은 전통적인 기계 학습 모델보다 훨씬 뛰어난 성능을 발휘했으며 최첨단 결과를 도출했습니다. 

게다가, 컨볼루션 계층은 CNN에 변환 불변 특성을 부여하여 위치, 방향, 크기 또는 변환의 변화에 관계없이 데이터에서 패턴과 특징을 식별하고 추출할 수 있도록 합니다.


CNN은 많은 다양한 실제 사례 연구 및 응용 분야에서 성공을 거뒀으며 다음과 같은 분야에 적용되었습니다:

  • 이미지 분류, 물체 감지, 세분화, 얼굴 인식;
  • CNN 기반 시각 시스템을 활용하는 자율 주행 자동차;
  • 컨볼루션 신경망을 사용한 결정 구조 분류;
  • 보안 카메라 시스템.

이미지 분류 작업 이상으로, CNN은 다양한 영역에 적용할 수 있는 유연성을 갖추고 있으며 자연어 처리, 시계열 분석 및 음성 인식과 같은 분야에 적용할 수 있습니다.

PyTorch로 CNN 구현

이제 CNN 이론에 익숙해졌으므로 손을 더럽힐 준비가 되었습니다. 이 섹션에서는 PyTorch로 간단한 CNN을 구축하고 훈련할 것입니다. 우리의 목표는 이미지에서 숫자를 분류하는 모델을 구축하는 것입니다. 우리 모델을 훈련하고 테스트하기 위해 유명한 MNIST 데이터셋을 사용할 것입니다. 이 데이터셋은 손으로 쓴 숫자가 포함된 70,000개의 회색조 28×28 이미지 모음입니다.

1. 필요한 라이브러리 가져오기

이 자습서에서 사용할 라이브러리는 아래에 나와 있습니다. 기본적으로 PyTorch를 활용하여 CNN을 만들고, PyTorch의 컴퓨터 비전 모듈 torchvision을 사용하여 MNIST 데이터셋을 다운로드하고 로드할 것입니다. 마지막으로 우리 모델의 성능을 평가하기 위해 torchmetrics도 사용할 것입니다.

import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch from torch import optim from torch import nn from torch.utils.data import DataLoader from tqdm import tqdm # !pip install torchvision import torchvision import torch.nn.functional as F import torchvision.datasets as datasets import torchvision.transforms as transforms # !pip install torchmetrics import torchmetrics

2. 데이터셋 로드 및 전처리

PyTorch에는 컴퓨터 비전을 위한 모듈인 torchvision을 비롯한 다양한 도구와 확장이 포함되어 있습니다. Torchvision에는 신경망을 훈련하고 테스트하는 데 사용할 수 있는 여러 이미지 데이터셋이 포함되어 있습니다. 이 자습서에서는 MNIST 데이터셋을 사용할 것입니다.

먼저 MNIST 데이터셋을 다운로드하고 텐서로 변환할 것입니다. 텐서는 PyTorch의 핵심 데이터 구조로, NumPy 배열과 유사하지만 GPU 가속 기능을 가지고 있습니다.

그럼, 훈련 및 테스트 데이터셋을 모두 배치 처리하고 셔플링하기 위해 DataLoader를 사용할 것입니다. PyTorch DataLoader는 데이터셋으로부터 생성되어 데이터를 로드하고 배치로 나누며, 원하는 경우 데이터에 변환을 수행할 수 있습니다. 그런 다음, 훈련에 사용할 준비가 된 데이터 샘플을 생성합니다. 아래 코드에서는 데이터를 로드하고 60장의 이미지를 포함하는 배치 크기로 DataLoaders에 저장합니다.

batch_size = 60 train_dataset = datasets.MNIST(root="dataset/", download=True, train=True, transform=transforms.ToTensor()) train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True) test_dataset = datasets.MNIST(root="dataset/", download=True, train=False, transform=transforms.ToTensor()) test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=True)

선택적으로, 훈련 데이터셋은 훈련 및 검증 두 파티션으로 추가로 분할될 수 있습니다. 검증은 딥러닝에서 모델 성능을 평가하는 기술로, 모델의 오버피팅과 언더피팅을 감지하는 데 도움이 되며, 하이퍼파라미터를 최적화하는 데 특히 유용합니다. 그러나 간단함을 위해 이 튜토리얼에서는 검증을 사용하지 않을 것입니다. 검증에 대해 더 알고 싶다면, PyTorch를 활용한 딥러닝 입문 코스에서 자세한 설명을 확인할 수 있습니다.

이제 데이터가 준비되었으니, 임의의 숫자 배치가 어떻게 보이는지 살펴봅시다:

def imshow(img): npimg = img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0))) plt.show() # 일부 임의의 훈련 이미지 가져오기 dataiter = iter(dataloader_train) images, labels = next(dataiter) labels # 이미지 표시 imshow(torchvision.utils.make_grid(images))

3. CNN 아키텍처 정의

분류 문제를 해결하기 위해 우리는 nn.Module 클래스를 활용할 것입니다. 이 클래스는 PyTorch의 직관적으로 복잡한 신경망 아키텍처를 만드는 데 사용되는 기본 구성 요소입니다.

아래 코드에서는 CNN이라는 클래스를 생성합니다. 이 클래스는 nn.Module 클래스의 속성을 상속합니다. CNN 클래스는 두 개의 합성곱 레이어를 가지고 완전히 연결된 레이어가 뒤따르는 CNN의 청사진이 될 것입니다. 

PyTorch에서 합성곱 레이어를 정의하기 위해 nn.Conv2d를 사용합니다. 입력 및 출력 피처 맵의 수를 전달합니다. 또한 커널 또는 필터 크기 및 패딩을 포함하여 합성곱 레이어의 작동에 필요한 일부 매개변수를 설정합니다. 

다음으로, nn.MaxPool2d를 사용하여 맥스 풀링 레이어를 추가합니다. 여기서 이전 합성곱 레이어의 출력 위를 비교적 중첩되지 않는 창을 슬라이드합니다. 각 위치에서 창에서 최댓값을 선택하여 전달합니다. 이 작업은 피처 맵의 공간 차원을 줄이고 네트워크 내의 매개변수 및 계산 복잡성 수를 줄입니다. 마지막으로 완전히 연결된 선형 레이어를 추가합니다. 

forward() 함수는 서로 다른 레이어가 어떻게 연결되는지를 정의하며 각 합성곱 레이어 뒤에 여러 ReLU 활성화 함수를 추가합니다.

class CNN(nn.Module): def __init__(self, in_channels, num_classes): """ Building blocks of convolutional neural network. Parameters: * in_channels: Number of channels in the input image (for grayscale images, 1) * num_classes: Number of classes to predict. In our problem, 10 (i.e digits from 0 to 9). """ super(CNN, self).__init__() # 1번째 합성곱층 self.conv1 = nn.Conv2d(in_channels=in_channels, out_channels=8, kernel_size=3, padding=1) # 최대 풀링층 self.pool = nn.MaxPool2d(kernel_size=2, stride=2) # 2번째 합성곱층 self.conv2 = nn.Conv2d(in_channels=8, out_channels=16, kernel_size=3, padding=1) # 완전 연결층 self.fc1 = nn.Linear(16 * 7 * 7, num_classes) def forward(self, x): """ Define the forward pass of the neural network. Parameters: x: Input tensor. Returns: torch.Tensor The output tensor after passing through the network. """ x = F.relu(self.conv1(x)) # 첫 번째 합성곱 및 ReLU 활성화 적용 x = self.pool(x) # 최대 풀링 적용 x = F.relu(self.conv2(x)) # 두 번째 합성곱 및 ReLU 활성화 적용 x = self.pool(x) # 최대 풀링 적용 x = x.reshape(x.shape[0], -1) # 텐서 평탄화 x = self.fc1(x) # 완전 연결층 적용 return x x = x.reshape(x.shape[0], -1) # 텐서 평탄화 x = self.fc1(x) # 완전 연결층 적용 return x

우리가 CNN 클래스를 정의한 후에는 모델을 생성하고 학습 및 실행될 장치로 이동할 수 있습니다.

GPU에서 실행되는 신경망은 CNN을 포함하여 더 나은 성능을 보여줍니다만, 사용 중인 컴퓨터의 경우에 그렇지 않을 수도 있습니다. 따라서 가능한 경우 모델을 GPU에서 실행하고, 그렇지 않은 경우에는 일반 CPU를 사용할 것입니다.

device = "cuda" if torch.cuda.is_available() else "cpu" model = CNN(in_channels=1, num_classes=10).to(device) print(model) >>> CNN( (conv1): Conv2d(1, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (fc1): Linear(in_features=784, out_features=10, bias=True) )

4. CNN 모델 학습

이제 모델을 갖게 되었으니, 훈련할 시간입니다. 모델의 성능을 측정하는 방법을 먼저 결정해야 합니다. 다중 클래스 분류 문제를 다루고 있기 때문에, PyTorch에서 nn.CrossEntropyLoss로 사용 가능한 크로스 엔트로피 손실 함수를 사용할 것입니다. 또한, 가장 인기 있는 최적화 알고리즘 중 하나인 Adam 옵티마이저를 사용할 것입니다. 

# 손실 함수 정의 criterion = nn.CrossEntropyLoss() # 옵티마이저 정의 optimizer = optim.Adam(model.parameters(), lr=0.001)

모델을 훈련하기 위해 열 번의 epoch와 훈련 배치를 반복하고, 각 배치에 대해 일반적인 단계를 수행할 것입니다. 아래에서 보여주는 대로입니다.

num_epochs=10 for epoch in range(num_epochs): # 훈련 배치 반복 print(f"Epoch [{epoch + 1}/{num_epochs}]") for batch_index, (data, targets) in enumerate(tqdm(dataloader_train)): data = data.to(device) targets = targets.to(device) scores = model(data) loss = criterion(scores, targets) optimizer.zero_grad() loss.backward() optimizer.step()
Epoch [1/10] 100%|██████████| 1000/1000 [00:13<00:00, 72.94it/s] Epoch [2/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.27it/s] Epoch [3/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.16it/s] Epoch [4/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.00it/s] Epoch [5/10] 100%|██████████| 1000/1000 [00:13<00:00, 75.69it/s] Epoch [6/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.24it/s] Epoch [7/10] 100%|██████████| 1000/1000 [00:12<00:00, 78.23it/s] Epoch [8/10] 100%|██████████| 1000/1000 [00:12<00:00, 78.16it/s] Epoch [9/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.96it/s] Epoch [10/10] 100%|██████████| 1000/1000 [00:12<00:00, 77.93it/s]

5. 모델 평가

모델이 훈련된 후, 테스트 데이터셋에서의 성능을 평가할 수 있습니다. 분류 문제에서 인기 있는 지표인 정확도를 사용할 것입니다. 정확도는 데이터셋의 객체 중 올바르게 분류된 경우의 비율을 측정합니다. 모델이 만든 전체 예측 수로 나누어 정확도를 계산합니다.

먼저, 우리는 torchmetrics에서 정확도 지표를 설정합니다. 다음으로, 모델의 .eval 메서드를 사용하여 모델을 평가 모드로 설정합니다. 왜냐하면 PyTorch 모델의 일부 레이어는 훈련과 테스트 단계에서 다르게 작동하기 때문입니다. 또한 torch.no_grad를 사용하여 그레이디언트 계산을 수행하지 않음을 나타내는 Python 컨텍스트를 추가합니다.

그런 다음 그레이디언트 계산 없이 테스트 예제를 반복합니다. 각 테스트 배치마다 모델 출력을 가져와 가장 가능성 있는 클래스를 취하고 레이블과 함께 정확도 함수에 전달합니다. 마지막으로 메트릭을 계산하고 결과를 출력합니다. 우리는 0.98 정확도 점수를 얻었는데, 이는 우리 모델이 숫자의 98%를 올바르게 분류했다는 것을 의미합니다. 꽤 좋네요!

# 다중 클래스 정확도 지표 설정 acc = Accuracy(task="multiclass",num_classes=10) # 데이터셋 배치를 반복 model.eval() with torch.no_grad(): for images, labels in dataloader_test: # 테스트 데이터 배치에 대한 예측 확률 가져오기 outputs = model(images) _, preds = torch.max(outputs, 1) acc(preds, labels) precision(preds, labels) recall(preds, labels) # 총 테스트 정확도 계산 test_accuracy = acc.compute() print(f"Test accuracy: {test_accuracy}") >>> Test accuracy: 0.9857000112533569

또한, 리콜과 프리시전을 포함한 다른 인기 있는 분류 메트릭을 사용할 수 있습니다. 이러한 메트릭에 대한 실전 예제를 함께 설명하는 것은 PyTorch를 활용한 중급 딥러닝 과정에서 모두 알려드립니다.

모델 성능 향상

CNN 모델이 강력한 성능을 달성하긴 했지만, 정확도, 견고성 및 새로운 데이터에 대한 일반화를 더 향상시킬 수 있는 여러 전략이 있습니다.

이 섹션에서는 데이터 증강, 하이퍼파라미터 튜닝, 전이 학습과 같은 주요 기술을 탐구하여 모델의 성능을 최적화할 것입니다.

데이터 증강 기술

데이터 증강은 새로운 훈련 데이터를 무작위로 생성하여 모델의 정확도를 향상시키는 기술입니다. 예를 들어, 로딩 중에 훈련 이미지에 대해 크기 조정, 수평 또는 수직 뒤집기, 무작위 회전 등의 변형을 적용할 수 있습니다. 이렇게 함으로써 증강된 이미지를 생성하고 원본 이미지와 동일한 레이블을 할당하여 훈련 세트의 크기를 증가시킬 수 있습니다.

원본 이미지에 무작위 변형을 추가함으로써 데이터를 더 많이 생성하고 훈련 세트의 크기와 다양성을 증가시킬 수 있습니다. 이는 모델이 실제 세계 이미지에서 흔히 발견되는 변이와 왜곡에 더 견고해지고, 모델이 무작위 변형을 무시하도록 학습함으로써 과적합을 줄입니다.

그러나 데이터 증강에 대해 주의해야 합니다. 때로는 훈련 프로세스에 해를 끼칠 수도 있습니다. 예를 들어, 문제에서 숫자 “6”에 수직 뒤집을 적용하면 숫자 “9”처럼 보일 수 있습니다. 이를 “6”으로 레이블링된 상태로 모델에 전달하면 모델을 혼란스럽게 만들어 훈련을 방해할 수 있습니다. 이러한 예시는 때로 특정 증강이 레이블에 영향을 줄 수 있다는 것을 보여줍니다.

하이퍼파라미터 튜닝

우리 모델의 성능을 향상시키는 또 다른 전략은 모델의 다른 레이어에 관여하는 하이퍼파라미터 값들을 변경함으로써 이룰 수 있습니다. 하이퍼파라미터 튜닝은 신경망 뒤에 있는 수학에 대한 심층적인 이해와 다양한 하이퍼파라미터의 중요성을 요구합니다.

예를 들어, CNN 레이어를 조정하면 필터의 크기를 변경하거나 패딩을 증가시킴으로써 조정할 수 있습니다. 또한 뉴런의 초기 가중치에 대해 다른 값을 설정할 수도 있습니다.

우리는 하이퍼파라미터의 최적값을 미리 알 수 없기 때문에 일정 수준의 시행착오가 필요합니다. 일반적으로 이는 그리드 서치라는 기술을 통해 수행되며, 이를 통해 모델을 매개변수 값 그리드 전체에서 체계적으로 평가할 수 있습니다.

그러나 이 기술을 사용할 때 주의해야 합니다. 특히 복잡한 신경망과 대규모 훈련 데이터셋을 다룰 때는 계산 비용이 많이 들 수 있습니다.

또한, 더 많은 합성곱 및 선형 레이어를 추가하여 모델의 복잡성을 증가시킬 수 있습니다. 그러나 새로운 레이어를 추가할 때 주의해야 합니다. 뉴런의 수가 급격히 증가하여 훈련 시간이 더 오래 걸리고 잠재적으로 오버피팅될 수 있습니다.

하이퍼파라미터 튜닝에 대해 더 알아보려면 우리의 PyTorch 코스에서 딥 러닝 소개를 확인하실 수 있습니다.

사전 훈련된 모델 사용하기

딥 러닝 모델을 처음부터 훈련하는 것은 오랜 시간이 걸리고 지루한 과정입니다. 일반적으로 많은 양의 훈련 데이터가 필요합니다. 대신, 우리는 종종 사전 훈련된 모델을 사용할 수 있습니다. 즉, 이미 어떤 작업에 대해 훈련된 모델입니다.

가끔은 이미 우리가 관심을 가지는 작업을 해결할 수 있는 경우 사전 훈련된 모델을 직접 재사용할 수 있습니다. 다른 경우에는 새로운 작업에 맞게 사전 훈련된 모델을 조정해야 할 수도 있습니다. 이를 전이 학습(transfer learning)이라고 합니다.

PyTorch에서 사전 훈련된 모델을 사용하는 것은 상당히 쉽습니다. Torchvision은 다양한 이미지 관련 작업을 위한 사전 훈련된 모델 모음을 제공합니다. 이러한 모델은 대규모 이미지 데이터셋에서 사전 훈련되었으며 쉽게 사용할 수 있습니다. 이들에 대해 알아야 할 모든 것을 배우려면 Deep Learning for Images with PyTorch Course를 확인하세요.

CNN 모델 배포

PyTorch에서 매우 정확한 분류 모델을 훈련했다면, 모델과 그 사전 훈련된 가중치를 저장하여 나중에 사용하고 팀원과 공유할 수 있습니다. 이를 통해 그들이 원활하게 불러올 수 있도록 합니다.

모델을 저장하기 위해 torch.save를 사용할 수 있습니다. torch 모델의 일반적인 파일 확장자는 pt 또는 pth입니다. 모델의 가중치를 저장하려면 model.state_dicttorch.save에 전달하여 출력 파일 이름을 제공하면 됩니다. 예를 들어 MulticlassCNN.pth와 같이 할 수 있습니다.

저장된 모델을 로드하기 위해 동일한 아키텍처로 새 모델을 초기화합니다. 그런 다음 load state dict 메서드와 torch.load를 사용하여 새 모델로 매개변수를 로드합니다.

# 모델 저장 torch.save(model.state_dict(), 'MulticlassCNN.pth') # 새 모델 생성 loaded_model = CNN(in_channels=1, num_classes=10) # 저장된 모델 로드 loaded_model.load_state_dict(torch.load('MulticlassCNN.pth')) print(loaded_model) CNN( (conv1): Conv2d(1, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(8, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (fc1): Linear(in_features=784, out_features=10, bias=True) )

결론

CNN의 전체 개요를 다루었으며, CNN 아키텍처의 각 레이어에 대한 세부 정보를 제공했습니다. 더 나아가 PyTorch에서 CNN을 구현하는 방법에 대한 안내를 제공했으며, 데이터 로딩부터 모델 설계, 모델 훈련 및 평가까지 주요 단계를 다루었습니다. 마지막으로 모델 성능을 향상시키는 여러 전략을 분석했습니다. 이러한 기술 세트를 다중 클래스 분류 작업과 관련된 실제 시나리오에 적용했습니다.

딥 러닝에 대해 배울 점이 많으며, 아마도 AI 분야에서 가장 흥미롭고 요구되는 분야 중 하나일 것입니다. 다행히 DataCamp가 여러분을 돕고 있습니다. 전용 자료와 강좌를 확인하고 신경망 전문가가 되어보세요:

Source:
https://www.datacamp.com/tutorial/pytorch-cnn-tutorial