CNN 실습

적어야 머리에 남는다! ·2021년 12월 24일
0

Data Science

목록 보기
11/12

문제정의

  • 자료 : Mnist 손글씨 분석
  • 입력 : 숫자 손 글씨 이미지
  • 출력 : 추정되는 숫자 값
  • 모델 : CNN

모델 학습

Library Import

  • pytorch 로 진행
  • torch : pytorch 라이브러리
  • torchvision : mnist img 셋 가져오는 용도
  • torch.nn.functional : 딥러닝을 위한 torch 함수- 수학함수
  • torchvision : 이미지 변환 함수

모델 정의

  • 전체 클래스 개수(구분 라벨링)을 입력값으로 받음
  • ConVet 클래스로 선언
  • 내부에 forward 메서드 지정

  • 내부에 각 레이어에 대한 정의를 해준다.

1번째 레이어

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.Conv2d
    • in_channel : 입력 채널수 =3(RGB), =1(흑백)
    • out_channel : 콘볼루션 레이어 통과하고 나올 때 가지고 있을 채널
    • kernel_size : convolution filter 크기 , 3 → 3x3
    • stride
    • padding
  • nn.ReLU : 활성함수로 ReLU사용
  • nn.MaxPool2d
    • kernel_size : maxpool size → 2 = 2*2 형태로 풀링이 됌
    • stride

2번째 레이어

  • 1번쨰 레이어의 out_channel만큼 in_channel로 받는다.
  • out_chaneel은 in_channel의 두 배

output 층 fc (linear)

  • fully connected layer 구현
  • nn.linear = 결과로 나온 값을 선형 형태로 출력
    • in_features : 입력 데이터 개수
    • out_channel : 출력 데이터 개수 클래스 개수와 동일해야 함- 각각에 대한 확률값 표현 위해서

  • 각 레이어를 거치는 연산을 진행한다.
  • 최종 나온 값을 flatten을 진행한다. - 하나의 벡터 형태로 만들어주기 위해
  • flatten된 값을 fc를 통과하여 선형형태로 만들어준다.
  • softmax를 통해서 각 벡터값에 대한 확률값을 출력한다.

하이퍼 파라미터 지정

  • num_epochs : 네트워크가 전체 데이터를 몇 번 반복할지
  • num_classes : class 개수 ( 숫자 구분 0-9 10개)
  • batch_size : 네트워크가 한 번 학습에 사용하는 데이터의 개수
  • learning_rate : 1.0미만의 적당한 값

train test data 지정

  • root : 데이터 경로

  • train : 트레인 데이터셋인지 아닌지

  • transfrom : 이미지 행렬 -> pytorch 텐서

  • download : 데이터 다운로드 여부

  • dataset : 데이터셋 지정

  • batch_size : 한 번 학습할 떄 사용할 크기 (하이퍼파라미터이용)

  • shuffle : 데이터 셋 섞기 (해주어야 -학습 잘됌)

  • 모델 인스턴스 생성 -> 클래스 적용
  • criterion - crossEntrophy 사용
  • optimizerSGD(stocastic gradient descendent) 사용
  • model.parameters() : 모델 학습 파라미터

  • 외부 for 문 전체 데이터셋
  • 내부 for 문 : batch
  • optimizer.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 시각화를 위해 import
  • batch_size =1 로 지정 : 테스트 목적
  • model.load_state_dict: 저장한 모델 불러오기
profile
기록을 통해 한 걸음씩 성장ing!

0개의 댓글

관련 채용 정보