본문 바로가기
PROGRAMING📚/BigData📑

PyTorch를 사용하여 DNN(Deep Neural Network)을 구축하고, MNIST 데이터셋을 이용해 학습 및 평가

Ta이니 2024. 9. 29.
728x90
반응형

이 코드는 PyTorch를 사용하여 DNN(Deep Neural Network)을 구축하고, MNIST 데이터셋을 이용해 학습 및 평가하는 과정을 포함하고 있습니다. 주요 단계와 코드 설명은 다음과 같습니다.

인공 신경망 생성 및 순방향 계산

hello = torch.nn.Linear(5,3)
data = torch.randn(2,5)
print(data)
print(hello(data))
  • torch.nn.Linear(5,3): 입력 뉴런 5개, 출력 뉴런 3개로 구성된 선형 레이어를 정의합니다. 이 레이어는 입력에 가중치(weight)와 편향(bias)를 곱해 선형 변환을 적용합니다.
  • torch.randn(2,5): 2x5의 임의의 값을 가진 입력 데이터를 생성합니다. 이는 2개의 5차원 벡터로 이루어진 배치입니다.
  • hello(data): data를 선형 레이어를 통과시키는 순방향 연산을 수행합니다.

MNIST 데이터셋 불러오기

rules = transforms.Compose([transforms.ToTensor()])
train_loader = DataLoader(MNIST('mnist', train=True, download=True, transform=rules), batch_size=500, shuffle=True)
test_loader = DataLoader(MNIST('mnist', train=False, download=True, transform=rules), batch_size=500, shuffle=False)
  • transforms.Compose([transforms.ToTensor()]): MNIST 데이터는 이미지로 구성되어 있으며, 이를 PyTorch에서 처리할 수 있는 텐서로 변환합니다.
  • DataLoader: MNIST 데이터를 로드하고 배치 크기(여기선 500)로 나누어 학습에 사용합니다. shuffle=True는 데이터를 무작위로 섞어 학습의 편향을 줄입니다.

DNN 모델 구성

model = nn.Sequential(
  nn.Flatten(),
  nn.Linear(784, 128),
  nn.ReLU(),
  nn.Dropout(p=0.2),
  nn.Linear(128, 10),
  nn.Softmax(dim=1)
)
  • nn.Sequential: 여러 레이어를 순차적으로 적용하는 간단한 신경망입니다.
    1. nn.Flatten(): 28x28 크기의 2차원 MNIST 이미지를 784(28*28)의 1차원 벡터로 변환합니다.
    2. nn.Linear(784, 128): 입력층에 784개의 뉴런을 받고, 128개의 뉴런으로 축소하는 선형 변환을 수행합니다.
    3. nn.ReLU(): 활성화 함수로 ReLU를 사용하여 음수 값을 0으로 만듭니다.
    4. nn.Dropout(p=0.2): 과적합을 방지하기 위해 뉴런의 20%를 무작위로 0으로 만듭니다.
    5. nn.Linear(128, 10): 128개의 뉴런을 10개의 출력 뉴런으로 변환합니다. MNIST 데이터셋은 0~9까지의 숫자를 분류하므로 출력 차원이 10입니다.
    6. nn.Softmax(dim=1): 출력값을 확률로 변환하여, 각 클래스에 속할 확률을 나타냅니다.

모델 구조 출력

summary(model, (1,28,28))
  • summary(model, (1,28,28)): 모델 구조와 각 레이어의 파라미터 수를 요약하여 출력합니다. 입력 이미지 크기가 28x28이므로 (1,28,28)의 형태로 입력 크기를 지정합니다.

최적화 및 손실 함수 설정

optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
  • torch.optim.Adam: Adam 알고리즘을 사용한 최적화 함수입니다. 학습률(lr)은 0.01로 설정되었습니다.
  • nn.CrossEntropyLoss(): 손실 함수로 교차 엔트로피를 사용하여 출력과 실제 레이블 간의 차이를 계산합니다.

인공신경망 학습 과정

for epoch in range(5):
  for data in train_loader:
    inputs, labels = data
    outputs = model(inputs)

    loss = criterion(outputs, labels)
    model.zero_grad()
    loss.backward()
    optimizer.step()

  print('Epoch : {}, Loss : {:.3f}'.format(epoch, loss.item()))
  • for epoch in range(5): 5번의 학습(epoch)을 진행합니다.
  • train_loader에서 inputslabels: 각 배치에서 입력 데이터와 레이블(정답)을 가져옵니다.
  • outputs = model(inputs): 입력 데이터를 모델에 통과시켜 출력값을 계산합니다.
  • loss = criterion(outputs, labels): 출력값과 실제 레이블 간의 손실을 계산합니다.
  • loss.backward(): 역전파를 통해 가중치의 기울기를 계산합니다.
  • optimizer.step(): 계산된 기울기를 바탕으로 모델의 가중치를 업데이트합니다.
  • print: 각 에포크에서 손실 값을 출력합니다.

모델 평가

correct = 0
for images, labels in test_loader:
  with torch.no_grad():
    pred = model(images)
  pred = torch.argmax(pred, dim=1)

  for i in range(500):
    if(pred[i] == labels[i]):
      correct += 1

print('정확도: ', correct/10000)
  • torch.no_grad(): 평가 단계에서는 기울기를 계산하지 않으므로 이를 비활성화합니다.
  • pred = model(images): 테스트 데이터를 모델에 입력하여 예측값을 얻습니다.
  • torch.argmax(pred, dim=1): 10개의 출력값 중 가장 높은 값을 가진 인덱스를 예측한 클래스로 선택합니다.
  • correct += 1: 예측이 실제 레이블과 같으면 correct 값을 1씩 증가시킵니다.
  • print('정확도: ', correct/10000): 총 10,000개의 테스트 데이터 중 올바르게 예측한 비율을 출력하여 정확도를 계산합니다.

최종 결과

  • 이 코드는 간단한 인공 신경망을 정의하고 MNIST 데이터셋을 학습하여 정확도를 출력하는 기본적인 딥러닝 모델입니다.
728x90
반응형

댓글