무효 클릭 IP 추적 중...
머신러닝,딥러닝/딥러닝

[pytorch] nn.Dropout inplace 역할은 무엇일까?

꼬예 2022. 12. 23.

[ic]nn.Dropout(p=0.2)[/ic]

확률을 의미하는 p인자는 익숙한 사람이 많다.

하지만 [ic]nn.Dropuout(p=0.2, inplace=True)[/ic]와 같이 [ic]inplace[/ic]가 붙어 있는걸 보는 순간 불편하다.

 

이번 포스팅에서는 [ic]inplace= True[/ic]일때와 [ic]False[/ic]일때 어떤 차이가 있는지 알아보자.

 

 

이 글과 읽으면 좋은글

 

1) [ic]inplace=False[/ic] 인경우

import torch
import torch.nn as nn

torch.manual_seed(42)
x = torch.randn(5, 3)
print('x :\n',x)
dropout = nn.Dropout(0.2, inplace=True)
y = dropout(x)

print('x :\n',x)
print('y :\n',y)

#output
'''
x :
 tensor([[ 0.3367,  0.1288,  0.2345],
        [ 0.2303, -1.1229, -0.1863],
        [ 2.2082, -0.6380,  0.4617],
        [ 0.2674,  0.5349,  0.8094],
        [ 1.1103, -1.6898, -0.9890]])
x :
 tensor([[ 0.4209,  0.1610,  0.2931],
        [ 0.0000, -1.4036, -0.2329],  
        [ 2.7603, -0.0000,  0.5771],
        [ 0.3342,  0.6686,  1.0117],
        [ 1.3879, -2.1122, -1.2362]])
y :
 tensor([[ 0.4209,  0.1610,  0.2931],
        [ 0.0000, -1.4036, -0.2329],
        [ 2.7603, -0.0000,  0.5771],
        [ 0.3342,  0.6686,  1.0117],
        [ 1.3879, -2.1122, -1.2362]])
'''

[ic]dropout()[/ic]을 한 후 return값에 집중해보자.

dropout 적용된값

y를 보면 랜덤하게 dropout이 적용된걸 알 수 있다.

 

특별한 건 없어보인다.

 

 

2) [ic]inplace=True[/ic] 인경우

import torch
import torch.nn as nn

torch.manual_seed(42)
x = torch.randn(5, 3)
print('x :\n',x)
dropout = nn.Dropout(0.2, inplace=False)
y = dropout(x)

print('x :\n',x)
print('y :\n',y)

#ouptut
'''
x :
 tensor([[ 0.3367,  0.1288,  0.2345],
        [ 0.2303, -1.1229, -0.1863],
        [ 2.2082, -0.6380,  0.4617],
        [ 0.2674,  0.5349,  0.8094],
        [ 1.1103, -1.6898, -0.9890]])
x :
 tensor([[ 0.3367,  0.1288,  0.2345],
        [ 0.2303, -1.1229, -0.1863],
        [ 2.2082, -0.6380,  0.4617],
        [ 0.2674,  0.5349,  0.8094],
        [ 1.1103, -1.6898, -0.9890]])
y :
 tensor([[ 0.4209,  0.1610,  0.2931],
        [ 0.0000, -1.4036, -0.2329],
        [ 2.7603, -0.0000,  0.5771],
        [ 0.3342,  0.6686,  1.0117],
        [ 1.3879, -2.1122, -1.2362]])
'''

 

다른점이 보이는가?

inplace=True 할경우 다른점

 

input인 x 값이 변경되었다.

바뀐부분

 

이게 차이다.

[ic]inplace[/ic]는 기존 input값 까지 바꿔버린다.

 

그렇다면 왜 굳이 [ic]inplace=True[/ic] 설정을 할까?

 

바로 메모리 효율성 때문이다.

기존 input값 데이터를 메모리에 가지고 있을 필요가 없으니 퍼포먼스적으로 유리하다.

 

하지만 debug할땐 [ic]inplace=False[/ic]가 유리할 수 있다.

 

여러분 상황에 맞게 적절하게 쓰기 바란다.

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글