
pytorch 로 진행 torch : pytorch 라이브러리torchvision : mnist img 셋 가져오는 용도 torch.nn.functional : 딥러닝을 위한 torch 함수- 수학함수torchvision : 이미지 변환 함수
전체 클래스 개수(구분 라벨링)을 입력값으로 받음ConVet 클래스로 선언 forward 메서드 지정 
각 레이어에 대한 정의를 해준다.self.layer1 = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=16,
kernel_size=5, stride=1, padding=2),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2))
nn.sequential : pytorch neural network 하나의 멤버 변수로 묶어주는 역할
nn.Conv2dnn.ReLU : 활성함수로 ReLU사용nn.MaxPool2d out_channel만큼 in_channel로 받는다. fully connected layer 구현nn.linear = 결과로 나온 값을 선형 형태로 출력in_features : 입력 데이터 개수out_channel : 출력 데이터 개수 클래스 개수와 동일해야 함- 각각에 대한 확률값 표현 위해서
각 레이어를 거치는 연산을 진행한다.flatten을 진행한다. - 하나의 벡터 형태로 만들어주기 위해fc를 통과하여 선형형태로 만들어준다.softmax를 통해서 각 벡터값에 대한 확률값을 출력한다.
num_epochs : 네트워크가 전체 데이터를 몇 번 반복할지 num_classes : class 개수 ( 숫자 구분 0-9 10개)batch_size : 네트워크가 한 번 학습에 사용하는 데이터의 개수learning_rate : 1.0미만의 적당한 값root : 데이터 경로
train : 트레인 데이터셋인지 아닌지
transfrom : 이미지 행렬 -> pytorch 텐서
download : 데이터 다운로드 여부
dataset : 데이터셋 지정
batch_size : 한 번 학습할 떄 사용할 크기 (하이퍼파라미터이용)
shuffle : 데이터 셋 섞기 (해주어야 -학습 잘됌)

인스턴스 생성 -> 클래스 적용criterion - crossEntrophy 사용optimizer 는 SGD(stocastic gradient descendent) 사용model.parameters() : 모델 학습 파라미터
외부 for 문 전체 데이터셋내부 for 문 : batchoptimizer.zero_grad() : batch 마다 grad값 초기화loss.backward : 역전파(backpropagation) 적용optimizer.step() : 계산된 gradient값 이용하여 모델 내 변수 업데이트-, prediceted : 정확도 산출torch.max : 텐서에서 가장 높은 값의 index(=label)를 출력
correct : 예측과 라벨일 일치한 것의 갯수 세기 (.item() - 숫자만 추출)
batch 돌때마다 결과 출력
model.eval() : 모델을 평가하는 모드로 고정 - 모델 변수 고정with torch_no_grad() : 테스트 과정에서 gradient 계산을 배제torch.save(model,state_dict(), 'cnn.pt') : 모델 파라미터 딕셔너리 형태로 저장
matplotlib 시각화를 위해 importbatch_size =1 로 지정 : 테스트 목적model.load_state_dict: 저장한 모델 불러오기