이 코드는 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
: 여러 레이어를 순차적으로 적용하는 간단한 신경망입니다.nn.Flatten()
: 28x28 크기의 2차원 MNIST 이미지를 784(28*28)의 1차원 벡터로 변환합니다.nn.Linear(784, 128)
: 입력층에 784개의 뉴런을 받고, 128개의 뉴런으로 축소하는 선형 변환을 수행합니다.nn.ReLU()
: 활성화 함수로 ReLU를 사용하여 음수 값을 0으로 만듭니다.nn.Dropout(p=0.2)
: 과적합을 방지하기 위해 뉴런의 20%를 무작위로 0으로 만듭니다.nn.Linear(128, 10)
: 128개의 뉴런을 10개의 출력 뉴런으로 변환합니다. MNIST 데이터셋은 0~9까지의 숫자를 분류하므로 출력 차원이 10입니다.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
에서inputs
와labels
: 각 배치에서 입력 데이터와 레이블(정답)을 가져옵니다.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 데이터셋을 학습하여 정확도를 출력하는 기본적인 딥러닝 모델입니다.