relu 함수를 구현한 코드이다.
def naive_relu(x):
assert len(x.shape) == 2
x = x.copy()
for i in range(x.shape[0]):
for j in range(x.shape[1]):
x[i,j] = max(x[i,j],0)
return x
우선 relu 연산을 하기 위해서는 2차원의 넘파이 배열이 입력값으로 들어와야 한다.
이러한 조건을 생각해봤을 때 assert문이 있는 줄은 그러한 relue 연산의 조건을 의미한다는 것을 알 수 있다.
assert : 가정 설정문
assert 뒤의 조건이 True 가 아닌 경우 AssertError를 발생시킨다
쓰는 이유
함수의 성능을 높이기 위해서는 반드시 특정 자료형만을 입력받아야 하는 경우가 있을 것이다.
relu 예시의 경우 반드시 2차원 넘파이 배열이 들어와야 한다. 따라서 해당 함수를 실행할 때 입력값으로 원하는 형태의 데이터가 들어오는지 확인할 필요가 있다.
이를 위해 if문을 쓰거나 예외처리를 할 수 있지만 지금과 같이 가정 설정문을 사용할 수도 있다.
실제로 1차원 배열을 함수의 인자로 넣으니 AssertionError가 뜬 것을 볼 수 있다.
사용해보니 assert는 프로그래밍 과정에서 에러를 찾기 보다는 원하는 값을 확실히 하기 위해서 사용됨을 알 수 있다.
예를 들어 함수의 입력 값이 어떤 조건의 참임을 보증하기 위해 사용할 수 있고 함수의 반환 값이 어떤 조건에 만족하도록 만들 수 있다. 혹은 변수 값이 변하는 과정에서 특정 부분은 반드시 어떤 영역에 속하는 것을 보증하기 위해 가정 설정문을 통해 확인 할 수도 있다.
이처럼 실수를 가정해 값을 보증하는 방식으로 코딩 하기 때문에 이를 '방어적 프로그래밍'이라 부른다.
++추가 , assert 조건, '메세지' 형태로도 지정할 수 있음
'🏷️CS > Python' 카테고리의 다른 글
[for 와 else 를 같이 사용] (0) | 2023.07.31 |
---|---|
[정규표현식] re 모듈 (0) | 2023.07.14 |
[다차원 배열 초기화 방법의 차이점] (1) | 2023.05.13 |
[anaconda 가상환경] (0) | 2023.01.07 |
[NLP] 정규표현식 (Regular Expression) (0) | 2023.01.07 |