ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 환급챌린지 37일차 미션 (3월 8일) : 딥러닝·인공지능 Signature 초격차 패키지 Online. 강의 후기
    패스트캠퍼스 챌린지 2024. 3. 8. 17:56

     

    자, 오늘은 

     

    CH06-03. 인공신경망 학습하기

    &

    CH07-01. 구현을 위한 코드의 이해

     

     

     

    CH06-03. 인공신경망 학습하기

    지난 시간까지 인공신경망을 설계 까지 했다면 이제 본격적인 학습이 필요하다.

     

    # Model compile
    loss = nn.CrossEntropyLoss()
    # Optimize
    learning_rate = 1e-3
    optimizer = torch.optim.Adam(model.parameters(), lr = learning_rate)
     

     

    모델을 컴파일 한다는 것은 로스와 옵티마이저를 설정한다는 말이다.

     

    다중분류문제다. 아이리스는 3개의 카테고리, 이번엔 10개의 범주로 나누는 멀티클래시피케이션이다.

     

    그래서 로스를 크로스엔트로피로 설정하였다.

     

    옵티마이저로 일반적으로 많이 사용하는 아담으로 설정, LR = 0.001 설정이다.

     

    자, 그러면 모델을 정의해보자. 여기선 트레인 루프로 설정하였따.

    #Train_loop
    def train_loop(train_loader, model, loss_fn, optimizer):
      size = len(train_loader.dataset)

      for batch, (X, y) in enumerate(train_loader):
        X,y = X.to(device), y.to(device)                        ◀
        pred = model(X)                                               

        # 손실 계산
        loss = loss_fn(pred, y)                                       

        # 역전파
        optimizer.zero_grad()                                         ④
        loss.backward()
        optimizer.step()                                                 ⑤ 

        if batch%100 == 0:
          loss, current = loss.item(), batch*len(X)
          print(f'loss:{loss:>7f} [{current:>5d}]/{size:5d}')

     

    1.  x, y를 준비한다.

    2. 모델에 통과시킨다. 

    3. 로스를 준비한다.

    4. 역전파를 한다.

    5. 옵티마이저를 사용하여 파라미터를 최적화한다.

     

    #Set test loop
    def test_loop(test_loader, model, loss_fn):
      size = len(test_loader.dataset)
      num_batches = len(test_loader)
      test_loss, correct = 0, 0

      with torch.no_grad():
        for X, y in test_loader :
          X, y = X.to(device), y.to(device)
          pred = model(X)
          test_loss += loss_fn(pred, y).item()
          correct += (pred.argmax(1)==y).type(torch.float).sum().item()

      test_loss /= num_batches
      correct /= size
      print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:8f}\n")

     

    1. X, y는 테스트 셋이다.(테스트셋에서 가져왔다.)

    2. 모델에 넣는다.

    3. 와이와 로스를 비교한다.

     

    4. 로스가 얼만지 어큐러시는 얼만지 확인하는 코드다.

     

    자, epoches를 다돌리면 마지막 코딩에서 말한 것처럼 Done! 으로 마무리 되었다.

     

    이전까지는 모델을 만드는 것 까지 해보았는데, 이번엔 만드는것에서 조금 나아가 만든것을 배표해보도록 한다.

     

    #Save&load model
    # Parameter만 저장하고 불러오기

    torch.save(model.state_dict(), 'moel_weights.pth')

     

    우선 저장이다. torch.save 하면 그만이라고 한다.

     

    저장하는 방법은 2개.

     

    뼈대는 놔두고 웨이트 / 파라미터만 저장하는 방법이 있고,

    두번째는 구조가 어떻고, 구조와 구조간의 값이 어떤지를 저장하는게 있다.

     

    1. 파라미터만 저장한다.

    2. 값과 모델 전체를 저장한다.

     

    #Save&load model
    # Parameter만 저장하고 불러오기

     

    torch.save(model.state_dict(), 'moel_weights.pth')
     
    자 여기서 볼때, 상태의 딕셔너리값만 저장한다. 라는 뜻이다.
    그리고 이 값을 모델_weight.pth에 저장한다.
     
    저장 한 뒤 나중에 사용하고 싶을 땐, 

     

     

    우리가 앞에서 선언한 클래스를 다시 선언하고 모델2에다가 값을 얹어서 활용해야 한다.

     

     

    이 이미지에서 보이는 것처럼 뼈대(model2) 위에다가 model_weights.pth 를 얹는다는 것이다.

     

    뼈대에 웨이츠,파람을 넣기 전과 후. 

     

    이번엔 모델 전체를 저장하는 방법이다.

     

     

    짜란!

     

    동일한 파람, 웨이트를 썻기때문에 동일한 어큐러씨를 보임을 알 수있다.

     

     

    CH07-01. 구현을 위한 코드의 이해

    이번시간에는 컨볼류션 뉴럴 네트워크(CNN)을 만들어 보자. 

     

    이 네트워크는 AlexNet이고, 사용할 데이터는 CIFAR 다.

     

    # 실습 목표
    # CNN을 구성하는 주요 연산을 이해하고, 신경망을 설계
    # AlexNet을 사용하여 이미지를 학습하고 10개의 카테고리를 갖는 이미지를 분류하는 이미지 분류기 생성(데이터셋: CIFAR)
    # 이미지증강을 수행하여 모델의 성능을 높이는 방법 이해
    # Confusion Matrix를 생성하여 분류 정확도 확인

     

    뭔말인지 모르겠지만 일단 가보자

     

     

     

    AlexNet이란?

    누가누가 더 잘 판별하는지 천하제일 이미지분석대회에서 2012년 9월 30일에 1등한 모델이다.

     

    이전 대비 10.8% 성능 향상을 보여줬고, 처음으로 에러가 20% 미만으로 떨어졌다.

     

    처음으로 컨볼류젼 ㄹ이어를 사용했다고 한다.

     

    구조를 보자.

     

    Lenet을 좀더 개선한 모델이고, imput 을 224 224 3 채널을 이미지로 입력을 받고

    5개 ConV 중간 중간 pooling이 있네.

     

    그리고 11*11  / 5*5 / 3*3 /  

     

    그리고 어디서는 패딩, 어디서는 스트라이드도 사용했다.

     

    플래튼 이전이 피쳐 익스트랙터, 뒷부분이 클래시파이어다.

     

    클래시 파이어는 댄스 레이어 3개를 쌓았다. 

     

    아웃풋은 1000개의 카테고리를 맞춰보자 였음.

     

    # 주요 코드
    # nn.Conv2d()
    # in_channels
    # out_channels
    # kernel_size
    # stride = 1
    # padding = 0
    # ex) nn.Conv2d(3, 96, kernel_size = 11, stride = 4, padding = 5)

     

    자, 주요코드부터 살펴보자.

     

    nn.Conv2d() 

    말 그대로 2d 컨볼류션 연산을 수행할 수 있는 클래스이다.

     

    자주사용하는 인자들을 살펴보면, 

     

    input/output 채널 개수이고, (들어오는거랑 나가는 숫자)

     

    커널사이즈, 스트라이드, 패딩 다 알고 있고.

     

    샘플코드를 보면 인풋 채널 3 / 아웃풋 채널 96 / 커널사이즈 11(11*11 임) / 스트라이드는 몇칸 띄어서 가나 / 패딩은

    원본 이미지에 얼마만큼 0으로 감쌀 것인가.

     

    nn.MaxPool2d()

    # 주요 코드
    # nn.MaxPool2d()
    # kernel_size
    # stride=None
    # padding = 0
    # ex) nn.MaxPooling(kernel_size = 3, stride= 2, padding = 1)

     

    컨볼류션 연산 수행후 나온결과 피쳐맵(커널이 싹 돌고 난  특징 맵)이 있는데,

    이 피쳐맵의 데이터를 그대로 사용할 수 있겠지만,  맥스풀링을 하게 되면,

    데이터 량을 줄이기 위해 맥스풀링을 쓴다.

     

    커널 사이즈만큼 포함되어 있는 가장 큰 값을 하나 뽑아 대표값을 쓰고,

    다음 블락에서도 대표값에서 뽑아 대표값으로 할당 해서

    이런식으로 쓰는게 맥스 풀링이다.

     

    이 맥스풀링을 써서 데이터의 차원을 줄인다고 하였다.

     

     

     

    tensor.view는  넘파이로 따지면 리쉐입과 같은 역할이다.

     

    기존 배열이 1차열이라고 했을 때 2차원으로 바꿔주거나, 1차원으로 다시 바꿔주는, 배열의 구조를 바꿔주는게 리쉐입인데, 텐서의 경우 view 다.

     

    나머지는 내일 알아보자.

     

     

    37일차 끝.

     

     

     

    본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

    https://bit.ly/48sS29N

Designed by Tistory.