[Day32] Semantic Segmentation
Image classification II
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 복사
y=x.detach()
이렇게 하면 원래 Tensor에서 gradient를 계산하지 않는 새로운 Tensor가 생성된다.
여기서
x.clone().detach().requires_grad_(True)
로 수정하여 requires_grad옵션을 나타낼 수 있다.
y=x.data
변수에서 Tensor를 가져오는데
x.data
가 사용된다.detach()
가 더 나은 방법이다. 왜냐하면.data
메서드로 복사된 Tensor는 update동안에 잘못된 gradient를 사용할 수 있다.
y=torch.empty_like(x).copy_(x)
이렇게 하면 원래 Tensor와 동일한 콘텐츠를 가진 새로운 Tensor가 생성된다.
y = torch.tensor(x)
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 할당
layer_.weight = torch.nn.Parameter(tensor_)
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])
'AI > 부스트 캠프 AI tech' 카테고리의 다른 글
[Day37] 시간복잡도 & entropy (0) | 2021.03.16 |
---|---|
[Day35] Muti-modal & 3D understanding (0) | 2021.03.12 |
[Day34] Instance/Panoptic segmentation & Conditional generative model (0) | 2021.03.11 |
[Day33] Object Detection & CNN Visualization (0) | 2021.03.10 |
[Day31] Image Classification I & data Augmentation (0) | 2021.03.08 |
[Day30] AI + ML과 Quant Trading & AI Ethics (0) | 2021.03.05 |
[Day29] NLP를 위한 언어 모델의 학습, 평가 & AI와 저작권법 (0) | 2021.03.04 |
[Day28] 캐글 경진대회 노하우 & Full Stack ML Engineer (0) | 2021.03.03 |