[Day32] Semantic Segmentation

 

 

 

중요

1x1 convolutions

import torch
import torch.nn as nn

# 1x1 convolutions
nn.Conv2d(in_channel,out_channel, kernel_size=1)

1x1 convolutions는 kernel_size=1이다. 이때 input의 channel size를 out_channel로 압축하는 효과를 낸다.

 

 

Upsampling

torch.nn.Upsample(scale_factor=16, mode='bilinear', align_corners=False)

Upsmapling layer는 위와 같이 설정할 수 있다. 이때 scale_factor로 현재의 해상도를 몇배로 크게 키울지를 설정하게 된다.

 

기본적인 개념(Tensor)

패키지의 중심에는 torch.Tensor클래스가 있다. 만약 .reqiures_grad속성을 True로 설정하면, 그 Tensor에서 이뤄진 모든 연산들을 추적(track)하기 시작한다. 계산이 완료된 후 .backward()를 호출하여 모든 변화도(gradient)를 자동으로 계산할 수 있다. 이 Tensor의 변화도는 .grad속성에 누적된다.

 

Tensor가 기록을 추적하는 것을 중단하게 하려면, .detach()를 호출하여 연산 기록으로부터 분리(detach)하여 이후 연산들이 추적되는 것을 방지할 수 있다.

 

기록을 추적하는 것, 메모리를 사용하는 것을 방지하기 위해 코드 블록을 with torch.no_grad():로 감쌀 수 있다. 이는 특히 변화도(gradient)는 필요없지만, requires_grad=True가 설정되어 학습 가능한 매개변수를 갖는 모델을 평가(evaluate)할 때 유용하다.

 

Tensor의 도함수를 계산하기 위해서는 .backward()를 호출하면 된다.

import torch
import torch.nn as nn

A=torch.ones(2,2)

print(A)
>>> tensor([[1., 1.],
        	[1., 1.]])

# requires_grad 속성 지정
A.requires_grad_(True)
>>> tensor([[1., 1.],
        	[1., 1.]], requires_grad=True)

 

 

Tensor 복사

  1. y=x.detach()

    • 이렇게 하면 원래 Tensor에서 gradient를 계산하지 않는 새로운 Tensor가 생성된다.

    • 여기서 x.clone().detach().requires_grad_(True)로 수정하여 requires_grad옵션을 나타낼 수 있다.

       

  2. y=x.data

    • 변수에서 Tensor를 가져오는데 x.data가 사용된다.

    • detach()가 더 나은 방법이다. 왜냐하면 .data메서드로 복사된 Tensor는 update동안에 잘못된 gradient를 사용할 수 있다.

       

  3. y=torch.empty_like(x).copy_(x)

    • 이렇게 하면 원래 Tensor와 동일한 콘텐츠를 가진 새로운 Tensor가 생성된다.

       

  4. y = torch.tensor(x)

     

  5. y = tensor.new_tensor(x)

    • 이 방법으로 require_grad옵션을 나타낼 수 있다.
>>> tensor = torch.ones((2,), dtype=torch.int8)
>>> data = [[0, 1], [2, 3]]
>>> tensor.new_tensor(data)
tensor([[ 0,  1],
        [ 2,  3]], dtype=torch.int8)

 

 

Weight 할당

  1. layer_.weight = torch.nn.Parameter(tensor_)

  2. layer_.wiehgt = torch.Tensor(tensor_)

    • 이 메서드는 초기화 동안에 사용할 수 있다.

 

 

 

피어세션

  • 백준 4811번: 알약 문제를 풀고 토론을 진행하였다.

다이나믹프로그래밍의 전형적인 문제로 먼저 행을 H가 나온 횟수, 열을 W가 나온 횟수로 두고 해당 값은 가능한 문자열의 경우의 수이다.

import sys
# dp['H']['W']
dp=[[0 for j in range(31)] for i in range(31)]
for j in range(31):
    dp[0][j]=1
for i in range(1,31):
    for j in range(i,31):
        dp[i][j]=dp[i-1][j]+dp[i][j-1]

while True:
    N=int(sys.stdin.readline())
    if N==0:
        break
    else:
        print(dp[N][N])

 

+ Recent posts