torch.no_grad()에 대해서..(+ valid와 test에 관하여)

aarchiiive·2022년 8월 11일
0

DeepLearning

목록 보기
2/2

보통 training을 할 때 prediction이 필요하고 validation을 할 때에도 prediction을 하는 과정이 필요하다.
차이점은 gradient를 기록하거나 하지 않거나인데, validation에서는 메모리 상의 문제도 있고 gradient 계산 혹은 저장이 불필요하기 때문에 코드 상에서

with torch.no_grad():
	# something here...

다음과 같이 쓸 수 있다.

+ 잘 모르기도 했고 정신없을 때 썼던 글...
+ 덧붙이자면...

- valid vs test 차이점에 대하여

요즘 연구 때문에 Pytorch 라이브러리 소스코드를 뜯어보거나 documents, 잘 쓰인 코드들을 찾아서 볼때가 많았다. 그러다보니 사실 model.eval()만 써주면 코드가 크게 다르지 않다는 걸 알게 되었다. 역전파가 일어나는 것도 아니고 학습에 영향을 주지 않는 건 똑같다. valid dataset을 training에서 쓰는 이유는 학습이 잘 되고 있는지, 다시 말하자면 각 epoch마다 overfitting이 일어나고 있는지를 확인하는 용도로 쓰인다. 살짝 다른 점을 추가하자면 loss를 구해서 이를 보조 지표로 활용하는 정도라고 생각한다. test로는 confusion matrix를 구해보고... 여기서 나오는 여러가지 지표들(sensitivity, F1 score 등)도 구해보고 valid와 비교해서 정확도가 큰 차이가 난다면 모델이 robust하지 않음을 알 수 있고.... 종합하자면 test 단계는 학습을 마치고 "새로운 데이터셋에 잘 대응하는가?"에 대한 결과 도출이라고 생각한다.

- 간단한 결론

학습을 진행하기 전에 데이터셋을 train : val : test = 7 : 2 : 1 나누는 것처럼 어떤 비율로 나누던지 valid와 test dataset을 바꿔도 상관 없다고 생각한다. 실제로 yolov4에서도 보면 .data 파일에서 train과 test 경로만 적도록 되있다. 여기서 test는 사실 valid phase에서 사용되는 데이터셋인데 용어 자체를 혼동해서 써도 크게 의미가 없다는 걸 보여주는 것 같았다. 예전에 잘 모르고 학습하고 매뉴얼대로 할 때는 몰랐지만 왜 그랬는지 이제는 알 것 같다. valid와 test 단계가 각각 필요한 건 맞다. 하지만 코드나 구조적으로 봤을 때 다른 점이 없고 용도만 다를 뿐이다.

데이터는 재산이다... 많을 수록 좋음
(무한 overfitting에 빠져드는.........)
profile
Post Anything

0개의 댓글