본문 바로가기
Study/머신러닝

[PyTorch] PyTorch로 CNN 레이어 쌓기

by 투말치 2021. 1. 17.

목차

    반응형

    레이어 이해하기

    1. Convolution

    - in_channels: 받게 될 channel의 갯수
    - out_channels: 보내고 싶은 channel의 갯수  
    - kernel_size: 만들고 싶은 kernel(weights)의 사이즈

    layer = nn.Conv2d(1, 20, 5, 1).to(torch.device('cpu'))

     

    - 해당 레이어에 이미지 넣은 output 결과를 시각화하기 위한 작업

    output_data = layer(image)
    output = output_data.data.cpu().numpy()

     

    2. Pooling

    - input을 먼저 앞에 넣고, 뒤에 kernel 사이즈와 stride를 순서대로 넣음

    pool = F.max_pool2d(image, 2,2)
    
    #MaxPool Layer는 weight가 없기 때문에 바로 numpy()가 가능
    pool_arr = pool.numpy()

     

    3. Linear

    - nn.Linear는 2d가 아닌 1d만 들어가기 때문에 .view() 1D로 펼쳐줘야함

    flatten = image.view(1, 28 * 28 )
    lin = nn.Linear(784, 10)(flatten)
    
    #시각화할때 lin에는 weight가 있기 때문에 detach해줘야 에러가 발생하지 않음
    plt.imshow(lin.detach().numpy(), 'jet') 

     

    4. Softmax

    - 결과를 numpy로 꺼내기 위해선 weight가 담긴 Linear에 weight를 꺼줘야함

    with torch.no_grad():
      flatten = image.view(1, 28 * 28)
      lin = nn.Linear(784, 10)(flatten)
      softmax = F.softmax(lin, dim=1)

     

     

    Optimization

    1. 모델 설정

    model = Net().to(device)

    2. optimizer 설정

    optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.5)

    3. 파라미터 확인

    params = list(model.parameters())

    4. train 하기 전에 모델을 train mode로 변환한다

    model.train()

    5. 모델에 넣을 데이터를 추출한다

    data, target = next(iter(train_loader))

    6. 추출한 데이터를 device에 compile한다

    data, target = data.to(device), target.to(device)

    7. optimizer를 설정하기 전에 gradients를 clear하는 과정이 필요하다

    optimizer.zero_grad()

    8. 준비한 데이터를 모델에 넣어서 얻은 결과를 loss function에 넣음

    loss = F.nll_loss(output, target)

    9. loss의 기울기를 계산하고 결과를 파라미터에 업데이트한다.

    loss.backward()
    optimizer.step()

     

    이 과정을 반복하는 것이 학습

     

    모델 평가

    1. 모델을 평가 모드로 전환

    model.eval()

    2. backpropagatin이나 gradient 계산 등을 꺼서 속도를 높여준다.

    3. 모델에 테스트 데이터를 넣어서 예측 결과를 확인한다.

     

     

     

    반응형