CV 경기-거리 풍경 문자 인식-task 4 모델 훈련 및 검증

7234 단어 연습 하 다.
4 모델 훈련 및 검증
이 를 위해 본 장 에 서 는 검증 집 구축,모델 훈련 과 검증,모델 저장 과 로드,모델 참조 몇 가지 부분 에서 설명 하고,일부 소절 에 서 는 Pytorch 코드 와 결합 하여 설명 한다.
4.1 학습 목표
  • 검증 집의 역할 을 이해 하고 훈련 집 과 검증 집 을 이용 하여 훈련 을 완성 한다
  • Pytorch 환경 에서 의 모델 을 사용 하여 읽 고 불 러 오 는 것 을 배우 고 조 참 절차
  • 를 이해 합 니 다.
    4.2 구조 검증 집합
    기계 학습 모델(특히 깊이 학습 모델)의 훈련 과정 에서 모델 은 매우 적합 하기 쉽다.딥 러 닝 모델 은 끊 임 없 는 훈련 과정 에서 훈련 오차 가 점점 줄 어 들 지만 테스트 오차 의 추 세 는 일정 하지 않다.
    모델 의 훈련 과정 에서 모델 은 훈련 데 이 터 를 이용 하여 훈련 할 수 있 을 뿐 모델 은 테스트 집의 견본 에 접촉 할 수 없다.따라서 모델 이 훈련 집 학 을 너무 잘 하면 모델 은 훈련 견본 의 세부 사항 을 기억 하여 모델 이 테스트 집에 서 의 일반화 효과 가 비교적 떨어진다.이런 현상 을 과 의합(Overfitting)이 라 고 한다.과 의합 에 대응 하 는 것 은 미 의합(Underfitting),즉 모델 이 훈련 집에 서 의 의합 효과 가 비교적 떨어진다.
     
    그림 에서 보 듯 이 모델 의 복잡 도와 모델 훈련 라운드 수가 증가 함 에 따라 CNN 모델 은 훈련 집에 서 의 오차 가 낮 아 지지 만 테스트 집에 서 의 오차 가 점점 낮 아 지고 점점 높 아 지 는 반면 우 리 는 모델 이 테스트 집에 서 의 정밀도 가 높 을 수록 좋다 는 것 을 추구 하고 있다.
    모델 이 너무 적합 한 상황 을 초래 하 는 데 는 여러 가지 원인 이 있다.그 중에서 가장 흔히 볼 수 있 는 상황 은 모델 의 복잡 도(Model Complexity)가 너무 높 아서 모델 은 훈련 데이터 의 여러 가지 측면 에서 지엽 적 인 규칙 을 배 웠 다.
    상기 문 제 를 해결 하 는 가장 좋 은 해결 방법:테스트 집합 과 가능 한 한 일치 하 는 샘플 집합(검증 집합 이 라 고 할 수 있 음)을 구축 하고 훈련 과정 에서 모델 이 검증 집합 에서 의 정 도 를 계속 검증 하 며 이 를 통 해 모델 의 훈련 을 제어 한다.
    경기 문 제 를 정 한 후에 경기 문 제 는 훈련 집 과 테스트 집 두 부분의 데 이 터 를 정 할 것 이다.참가 자 들 은 훈련 집 위 에 모델 을 구축 하고 테스트 집 위 에서 모델 의 일반화 능력 을 검증 해 야 한다.따라서 참가 자 들 은 모델 이 테스트 집합 에 대한 예측 결 과 를 제출 함으로써 자신의 모델 의 일반화 능력 을 검증 할 수 있다.참가 자 들 도 제출 횟수 제한 을 일부 제한 해 출전 선수 들 의'채점'을 피한다.
    일반적인 상황 에서 참가 선수 들 도 현지에서 하나의 검증 집 을 나 누 어 현지 검증 을 할 수 있다.훈련 집,검증 집,테스트 집 은 각각 다른 역할 을 한다.
  • 훈련 집(Train Set):모델 은 모델 매개 변 수 를 훈련 하고 조정 하 는 데 사용 된다.
  • 검증 집합(Validation Set):모델 의 정밀 도 를 검증 하고 모델 의 초 파 라미 터 를 조정 하 는 데 사용한다.
  • 테스트 집합(Test Set):모델 의 일반화 능력 을 검증 합 니 다.

  • 훈련 집 과 검증 집 이 분리 되 어 있 기 때문에 모델 은 검증 집 위의 정밀도 가 어느 정도 모델 의 일반화 능력 을 나 타 낼 수 있다.검증 집 을 구분 할 때 검증 집의 분 포 는 테스트 집 과 최대한 일치 해 야 한다.그렇지 않 으 면 모델 이 검증 집에 서 의 정밀도 가 지도 적 의 미 를 잃 게 된다.
    검증 집 이 이렇게 중요 한 이상 로 컬 검증 집 을 어떻게 구분 합 니까?일부 경기 에서 경기 문 제 는 검증 집 을 정한다.만약 시합 문제 측 이 검증 집 을 정 하지 않 았 다 면,시합 참가 자 들 은 훈련 집에 서 일부분 을 나 누 어 검증 집 을 받 아야 한다.검증 집의 구분 은 다음 과 같은 몇 가지 방식 이 있다.
     
  • 잔류 법(Hold-Out)
  • 직접 훈련 집 을 두 부분 으로 나 누 어 새로운 훈련 집 과 검증 집 으로 나 누 었 다.이런 구분 방식 의 장점 은 가장 직접적 이 고 간단 하 다 는 것 이다.단점 은 검증 집합 하나만 받 았 을 뿐 모델 이 검증 집합 에 적합 하지 않 을 수도 있다 는 것 이다.유출 법 응용 장면 은 데이터 양 이 비교적 많은 상황 이다.
  • 교차 검증 법(Cross Validation,CV)
  • 훈련 집 을 K 부 로 나 눠 이 중 K-1 부 를 훈련 집 으로,나머지 1 부 는 검증 집 으로 K 를 순환 하 며 훈련한다.이런 구분 방식 은 모든 훈련 집 이 검증 집 이 고 최종 모델 검증 정밀 도 는 K 부 평균 으로 얻어 진다.이런 방식 의 장점 은 검증 집의 정밀도 가 비교적 믿 을 만하 고 K 회 를 훈련 하면 K 개의 다양성 차이 가 있 는 모델 을 얻 을 수 있다 는 것 이다.CV 검증 은 K 회 훈련 이 필요 해 데이터 양 이 많은 경우 에는 적합 하지 않다 는 단점 이 있다.
  • 셀 프 샘플링(BootStrap)
  • 재 방 된 샘플링 방식 으로 새로운 훈련 집 과 검증 집 을 얻 으 면 매번 훈련 집 과 검증 집 은 차이 가 있다.이런 구분 방식 은 일반적으로 데이터 양 이 비교적 적은 상황 에 적용 된다.
    이번 대회 에 서 는 이미 검증 집 으로 나 뉘 어 져 있 기 때문에 선수 들 은 직접 훈련 집 을 이용 해 훈련 을 하고 검증 집 을 이용 해 정밀 도 를 검증 할 수 있다(물론 훈련 집 과 검증 집 을 합 쳐 자체 적 으로 검증 집 을 나 눌 수도 있다).
    물론 이런 구분 방법 은 데이터 구분 방식 의 측면 에서 볼 때 기 존의 데이터 경기 에서 일반적으로 사용 하 는 구분 방법 은 유출 법 과 교차 검증 법 이다.만약 데이터 의 양 이 비교적 많다 면,남 겨 두 는 방법 이 비교적 적합 하 다.물론 모든 검증 집의 구분 이 얻 은 검증 집 은 훈련 집-검증 집-테스트 집의 분포 가 일치 하도록 확보 해 야 하기 때문에 어떤 구분 방식 을 구분 하 든 주의해 야 한다.
    여기 의 분 포 는 일반적으로 라벨 과 관련 된 통계 분 포 를 말한다.예 를 들 어 분류 임무 에서'분포'는 라벨 의 유형 분 포 를 말 하 는데 훈련 집-검증 집-테스트 집의 유형 분포 상황 은 대체적으로 일치 해 야 한다.태그 가 순차 정 보 를 가지 고 있다 면 인증 집합 과 테스트 집합 은 시간 간격 이 일치 해 야 합 니 다.
    4.3 모델 훈련 과 검증
    이 절 에서 우 리 는 Pytorch 를 사용 하여 CNN 의 훈련 과 검증 과정 을 완성 하 는 것 을 목표 로 하 며 CNN 네트워크 구 조 는 이전 장과 일치한다.우리 가 완성 해 야 할 논리 구 조 는 다음 과 같다.
  • 구조 훈련 집 과 검증 집;
  • 매 라운드 훈련 과 검증 을 하고 최 적 화 된 검증 집합 정밀도 에 따라 모델 을 보존 합 니 다.
  • train_loader = torch.utils.data.DataLoader(
        train_dataset,
        batch_size=10, 
        shuffle=True, 
        num_workers=10, 
    )
        
    val_loader = torch.utils.data.DataLoader(
        val_dataset,
        batch_size=10, 
        shuffle=False, 
        num_workers=10, 
    )
    
    model = SVHN_Model1()
    criterion = nn.CrossEntropyLoss (size_average=False)
    optimizer = torch.optim.Adam(model.parameters(), 0.001)
    best_loss = 1000.0
    for epoch in range(20):
        print('Epoch: ', epoch)
    
        train(train_loader, model, criterion, optimizer, epoch)
        val_loss = validate(val_loader, model, criterion)
        
        #         
        if val_loss < best_loss:
            best_loss = val_loss
            torch.save(model.state_dict(), './model.pt')

    그 중에서 각 Epoch 의 훈련 코드 는 다음 과 같다.
    def train(train_loader, model, criterion, optimizer, epoch):
        #          
        model.train()
    
        for i, (input, target) in enumerate(train_loader):
            c0, c1, c2, c3, c4, c5 = model(data[0])
            loss = criterion(c0, data[1][:, 0]) + \
                    criterion(c1, data[1][:, 1]) + \
                    criterion(c2, data[1][:, 2]) + \
                    criterion(c3, data[1][:, 3]) + \
                    criterion(c4, data[1][:, 4]) + \
                    criterion(c5, data[1][:, 5])
            loss /= 6
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

    각 Epoch 의 인증 코드 는 다음 과 같 습 니 다.
    def validate(val_loader, model, criterion):
        #          
        model.eval()
        val_loss = []
    
        #          
        with torch.no_grad():
            for i, (input, target) in enumerate(val_loader):
                c0, c1, c2, c3, c4, c5 = model(data[0])
                loss = criterion(c0, data[1][:, 0]) + \
                        criterion(c1, data[1][:, 1]) + \
                        criterion(c2, data[1][:, 2]) + \
                        criterion(c3, data[1][:, 3]) + \
                        criterion(c4, data[1][:, 4]) + \
                        criterion(c5, data[1][:, 5])
                loss /= 6
                val_loss.append(loss.item())
        return np.mean(val_loss)

    4.4 모델 저장 및 불 러 오기
    Pytorch 에서 모델 의 저장 과 로드 는 매우 간단 합 니 다.흔히 볼 수 있 는 방법 은 모델 매개 변 수 를 저장 하고 로드 하 는 것 입 니 다.torch.save(model_object.state_dict(), 'model.pt')model.load_state_dict(torch.load(' model.pt'))4.5 모델 조 참 절차
    깊이 있 는 학습 원 리 는 적 지만 실천 성 이 매우 강하 기 때문에 기본적으로 많은 모델 의 검증 은 훈련 을 통 해 만 이 루어 질 수 있다.또한 깊이 있 는 학습 은 네트워크 구조 와 초 매개 변수 가 많 기 때문에 반복 적 으로 시도 해 야 한다.딥 러 닝 모델 을 훈련 하려 면 GPU 의 하드웨어 지원 이 필요 하고 훈련 시간 도 많이 필요 하 며 딥 러 닝 모델 을 어떻게 효과적으로 훈련 하 느 냐 가 학문 이 되 었 다.
    깊이 있 는 학습 은 많은 훈련 기교 가 있 는데 비교적 추천 하 는 읽 기 링크 는 다음 과 같다.
  • http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html
  • http://karpathy.github.io/2019/04/25/recipe/

  • 이 절 은 흔히 볼 수 있 는 기 교 를 골 라 설명 하고 이번 경기 문 제 를 구체 적 으로 분석 했다.전통 적 인 기계 학습 모델 과 달리 깊이 학습 모델 의 정밀도 와 모델 의 복잡 도,데이터 양,정규 화,데이터 확대 등 요소 와 직접적인 관 계 를 가진다.그래서 깊이 있 는 학습 모델 이 서로 다른 단계(부적 합,과 의합 과 완벽 의합)에 있 는 상황 에서 여러분 은 어떤 각도 에서 모델 을 계속 최적화 할 수 있 는 지 알 수 있 습 니 다.
    이번 경기 에 참가 하 는 과정 에서 저 는 여러분 에 게 다음 과 같은 논리 로 완성 할 것 을 건의 합 니 다.
  • 1.간단 한 CNN 모델 을 초보 적 으로 구축 하고 특별히 복잡 하지 않 고 훈련,검증 과 예측 의 절 차 를 거 친다.
  • 2.간단 한 CNN 모델 의 손실 이 비교적 클 수 있 으 므 로 모델 의 복잡 도 를 높이 고 검증 집의 정 도 를 관찰 하려 고 한다.
  • 3.모델 의 복잡 도 를 증가 하 는 동시에 데이터 확대 방법 을 증가 하여 검증 집합 정밀도 가 변 하지 않 을 때 까지 한다.

  •  
    4.6 이 장의 소절
    본 장 은 깊이 있 는 학습 모델 의 훈련 과 검증 을 바탕 으로 검증 집합 구분 방법,모델 훈련 과 검증,모델 보존 과 로드 와 모델 참조 절 차 를 설명 했다.
    주의해 야 할 것 은 모델 의 복잡 도가 상대 적 인 것 이지 반드시 모델 이 복잡 할 수록 좋 은 것 은 아니다.제 한 된 설비 와 제 한 된 시간 에 빠 른 교체 훈련 을 할 수 있 는 모델 을 선택해 야 한다.

    좋은 웹페이지 즐겨찾기