자꾸 까먹는다..


http://bcho.tistory.com/1010

'나이브'인 이유는 각 데이터의 발생 확률을 독립으로 본다는 가정이 있기 때문이다.

확률값이 너무 작은 경우를 방지하기위해, Log를 이용해서 구하는 방법도 사용 가능.


'이론 > 공부 자료들' 카테고리의 다른 글

code 공부  (0) 2019.01.08
활성화함수  (0) 2018.12.27
여러가지 convolutional layer  (0) 2018.11.16
optimizers  (0) 2018.10.21
Loss Functions  (0) 2018.10.21

fine-grained : 세밀한, 한 과정을 나누어 처리

    <-> coarse-grained : 세분화되지 않고 한꺼번에 처리되는 형태


activation map : feature map과 동일한 개념 (layer의 activation function까지 거쳐서 나온 행렬 데이터)


sparse : 희박한, activation된 값이 드물거나, 대부분 0으로 차있는 형태

           sparsity가 높다고도 말함. 

           l1 norm을 사용하면 weight의 sparsity를 높일 수 있음 (weight 값 자체를 낮추도록 학습하므로)

     <-> dense


'이론 > 메모' 카테고리의 다른 글

log softmax vs softmax  (0) 2019.03.06
모델링, 학습, 테스트  (0) 2019.02.20
Object Detector  (0) 2018.11.07
데이터 전처리  (0) 2018.10.21
작은 네트워크  (0) 2018.09.23

https://zzsza.github.io/data/2018/02/23/introduction-convolution/

'이론 > 공부 자료들' 카테고리의 다른 글

활성화함수  (0) 2018.12.27
나이브 베이지안 분류 (Naive Bayesian Classification)  (0) 2018.12.21
optimizers  (0) 2018.10.21
Loss Functions  (0) 2018.10.21
L1, L2 loss 해석을 통한 비교  (0) 2018.10.21

학습을 끝내고 성능 테스트 때 괜찮은 성능을 보였다.

그런 모델을 저장하고, 다른 코드에서 load_state_dict 으로 불러들여서 사용하려한다.


근데 모델을 저장하기 전 성능이 나오질 않는다.


이럴 땐 일부 레이어를 list 안에 넣어놨는 지 의심해야한다.

model 클래스는 다 nn.Module을 상속해서 정의하는데,

self의 속성으로 레이어를 직접 정의하지 않고,

self.layers = [nn.Linear, nn.Conv2D 등..] 식으로 저장하고 사용했다면

위와 같은 문제가 발생한다.


그 이유는 list로 저장해두면 모델 저장 시, 이 레이어들이 인식되지 않는다.

그래서 list안의 레이어들만 빼놓고 나머지 layer들의 weight만 저장된다.


이에 따라 다른 코드에서 load_state_dict 시, list 안의 layer는 학습되지 않은 날 레이어들이 된다.


이 문제는 nn.ModuleList로 해결 가능하다.

위의 self.layers를

self.layer_module = nn.ModuleList(self.layers)

과 같이 선언하고

self.layer_module을 list처럼 쓰면 말끔히 해결한다. (리스트 처럼 인덱싱 가능, +로 이어 붙이기도 가능)


이걸 몰라서 정말 많은 고생을 했다....

'실습 > pytorch' 카테고리의 다른 글

Pytorch eval 성능 문제  (0) 2018.11.08
PyTorch GPU check  (1) 2018.08.29
pytorch 메모  (0) 2018.03.11

eval 모드로 학습한 네트워크를 실험해보면

성능이 엄청나게 낮아지는 현상을 발견했다.


처음엔 그냥 학습이 안되서 그런건 줄 알았는데,

진짜 일주일 동안 별짓 다하다가 pytorch의 버그라는걸 알게됬다.


검색해보니 이미 유명한 버그다.

문제는 batchnorm 얘 때문이다.

eval 할 때 momentum 값이 제대로 초기화되지 않아서 발생하는 것 같다.

pytorch 1.0이 새로 나왔던데, 해결했는지는 모르겠다.

그 전의 최신버전은 0.4.1 버전도 이 문제를 갖고있다.

화남


그리고 이번에 여러 네트워크를 동시에 사용하려 했는데,

여러 네트워크를 정의해도 위처럼 성능이 저하되는 문제를 발견했다.

진짜 이건 이유를 모르겠다. 해결법도 모르겠어서 분석중이다..


'실습 > pytorch' 카테고리의 다른 글

load_state_dict 성능 문제, [nn.ModuleList]  (2) 2018.11.08
PyTorch GPU check  (1) 2018.08.29
pytorch 메모  (0) 2018.03.11

YOLOv3, SSD, FPN, RetinaNet 개념들 정리

https://medium.com/@jonathan_hui/what-do-we-learn-from-single-shot-object-detectors-ssd-yolo-fpn-focal-loss-3888677c5f4d



'이론 > 메모' 카테고리의 다른 글

모델링, 학습, 테스트  (0) 2019.02.20
용어 정리  (0) 2018.11.22
데이터 전처리  (0) 2018.10.21
작은 네트워크  (0) 2018.09.23
데이터 전처리  (0) 2018.09.22

Ubuntu 설치 시 nouveau 오류를 볼 수 있는데,

이는 nvidia와 충돌되어 나타나는 오류라고한다.


그리고 우분투 설치 후, 부팅 시 보라색 화면만 뜨고,

아무것도 뜨지 않는 현상이 발생하는데

이는 내가 생각했을 때, 메인보드 세팅의 문제이다.



1. nouveau 오류

우분투 설치 시 install 메뉴에서

'e'를 누른다.

그러면 텍스트 창이 뜰텐데,

quiet splash 라고 쓰인 부분 뒤에 nomodeset 을 입력한다.

--- 가 있으면 이는 지우고 입력.

quiet splash --- => quiet splash nomodeset

그리고 F10을 눌러 설치를 진행한다.

그러면 noueau 오류는 사라져있다.


2. noueau 오류를 해결했는데, 부팅 시 빈 화면만 나오는 경우

시모스세팅창에서 boot 부분을 보면

fast boot라는 부분이 있을텐데, 이 부분을 비활성화한다.

그리고 windows UEFI 라고 적힌 부분이 있을 것이다.

이부분을 기타 OS로 변경한다.

그리고 부팅하면 선택창이 뜨는데, 이 때 그냥 우분투 실행하지 말고, e를 누르고

1번처럼 splash 부분을 찾아서 그 뒤에 nomodeset을 입력한다.

F10을 눌러 진행하면 정상적으로 부팅된 모습을 볼 수 있다.


3. nvidia 드라이버 설치

그냥 팁인데,

nvidia 사이트에서 직접 드라이버 파일을 받는 것보다

설정 - 소프트웨어/업데이트 을 눌러서

additional ??? 탭에 들어간다

그러면 아래 항목중에 nvidia 384.XXX 등으로 숫자가 써져있는 것들이 있을 것이다. [사전 인터넷 연결은 필수]

그걸 눌러서 change하고 재부팅하라고 뜨면 재부팅하면 된다.

매우 간편!


'실습 > Ubuntu' 카테고리의 다른 글

terminal에서 google drive 파일 받기  (0) 2019.12.02
requirements.txt 생성  (0) 2019.02.05
우분투에서 폴더 삭제하기  (0) 2018.07.10
ppa 추가 및 제거  (0) 2018.05.10
sh 파일에 권한 부여하기 (Permission denied error)  (0) 2018.03.05

http://shuuki4.github.io/deep%20learning/2016/05/20/Gradient-Descent-Algorithm-Overview.html

'이론 > 공부 자료들' 카테고리의 다른 글

나이브 베이지안 분류 (Naive Bayesian Classification)  (0) 2018.12.21
여러가지 convolutional layer  (0) 2018.11.16
Loss Functions  (0) 2018.10.21
L1, L2 loss 해석을 통한 비교  (0) 2018.10.21
Distance 개념 및 WGAN  (0) 2018.08.17

https://isaacchanghau.github.io/post/loss_functions/


CE : https://icim.nims.re.kr/post/easyMath/550

'이론 > 공부 자료들' 카테고리의 다른 글

여러가지 convolutional layer  (0) 2018.11.16
optimizers  (0) 2018.10.21
L1, L2 loss 해석을 통한 비교  (0) 2018.10.21
Distance 개념 및 WGAN  (0) 2018.08.17
최적화  (0) 2018.07.30

계속 수정 예정.



Outlier 제거 : https://tariat.tistory.com/29

'이론 > 메모' 카테고리의 다른 글

용어 정리  (0) 2018.11.22
Object Detector  (0) 2018.11.07
작은 네트워크  (0) 2018.09.23
데이터 전처리  (0) 2018.09.22
음수 Regression Model  (0) 2018.09.22

http://www.chioka.in/differences-between-l1-and-l2-as-loss-function-and-regularization/


L2는 outlier 값(극단치 or 이상치)이 있을 때 L1보다 상당히 민감하다

'이론 > 공부 자료들' 카테고리의 다른 글

optimizers  (0) 2018.10.21
Loss Functions  (0) 2018.10.21
Distance 개념 및 WGAN  (0) 2018.08.17
최적화  (0) 2018.07.30
HSV를 통한 색상 분류  (0) 2018.07.25

cygwin를 통해 vim 등의 명령어 사용 가능


위키 설명

https://ko.wikipedia.org/wiki/%EC%8B%9C%EA%B7%B8%EC%9C%88


시그윈 사이트

http://www.cygwin.com/

VS Code와 Anaconda 환경이 설치되어있어야함.


Ctrl + Shift + P 로 커맨드 열기.

사용하고 싶은 Anaconda 환경 선택.


잘 됬는지 확인하고 싶으면, VS code내 터미널에서 확인하면됨

학교 과제할 때

한글(HWP) 파일 등으로 코드를 복사할 일이 많은데,

컨CV하면 형식도 안맞고, 모양도 별로인 경우가 많다.


이때 HTML로 복사하는 기능을 알면 상당히 깔끔하게 복사할 수 있다.


pycharm 뿐만 아니라 여러 에디터에서 이 기능을 지원하니, 잘 찾아보자

pycharm의 경우는

File - export to html 이라는 기능을 통해 할 수 있다.

저 버튼을 누르고, 옵션 확인후 export하면

html 파일이 만들어진다.


그리고 html 파일을 들어가서 복사한 뒤 한글에 붙여넣으면 된다.

매우 쉬움.

사실 pycharm가 번거로운 경우이고, 다른 에디터들은 바로 html 형식으로 클립보드에 복사할 수 있다.


아 그리고 한글에 붙여넣을 때는 '원본 형식 유지'로 붙여넣어야한다.

https://winterj.me/pyinstaller/

http://winmerge.org/downloads/


매우 쉽고 편리함

네트워크(신경망) 크기가 작을 수록

내부 구조에 대한 영향을 많이 받음.


그래서 더 다양한 시도를 해볼 필요가 있음.

optimizer

dropout

batchnormal

l1 norm, l2 norm

등등

'이론 > 메모' 카테고리의 다른 글

Object Detector  (0) 2018.11.07
데이터 전처리  (0) 2018.10.21
데이터 전처리  (0) 2018.09.22
음수 Regression Model  (0) 2018.09.22
딥러닝은 도구일뿐  (0) 2018.07.25

입력되는 데이터의 종류가 달라도

크기 차이가 심하면 (ex 하나는 그냥 양수, 하나는 0~1 실수)

학습이 잘 안된다.


입력되는 모든 데이터들의 값 범위는 비슷해야함.

범위만 조정해줘도 성능이 훨씬 좋아진다.

'이론 > 메모' 카테고리의 다른 글

Object Detector  (0) 2018.11.07
데이터 전처리  (0) 2018.10.21
작은 네트워크  (0) 2018.09.23
음수 Regression Model  (0) 2018.09.22
딥러닝은 도구일뿐  (0) 2018.07.25

output에 음수가 포함될 경우에

중간 layer들의 activation func으로 relu를 쓰면 성능이 낮다.


이 때는 relu 대신 tanh를 쓰면 성능이 좋아지는 것을 확인함.

'이론 > 메모' 카테고리의 다른 글

Object Detector  (0) 2018.11.07
데이터 전처리  (0) 2018.10.21
작은 네트워크  (0) 2018.09.23
데이터 전처리  (0) 2018.09.22
딥러닝은 도구일뿐  (0) 2018.07.25

loss.backward() 시에 메모리 오류가났다

그래서 이에 관련하여 많은 정보들을 구글링함.

나한테 맞는 해결책은 1도 없었다..

결국 원인을 추적해서 해결함


구글링한 지식들이 아까워서 정리해보았다.

아래는 오류가 나는 상황들과 해결책이다.


1. for문 구조에 의한 data 중복

  python 기본 구조로 for문 사용 시, 이전 타임의 데이터를 가지고 있다고함

  그래서 어쩔수 없이 data = Data(input) 하면

  Data(input) 리턴 값에 해당하는 메모리가 순간적으로 2배가 사용된다는 의미임 (이전에 data 삽입된 값이 남아있어서)

  - 해결책 -

  del data

  코드를 넣어주면 이러한 현상을 막을 수 있음


2. output을 이용한 연산

  만약 loss += network.get_loss() 등과 같이, 이전에 텐서 연산 결과를 계속 이용하면

  loss 메모리가 계속 쌓이게됨

  - 해결책 -

  loss += network.get_loss().data[0] # or network.get_loss().data.cpu().numpy()[0]

  이러면 해결됨


3. test or validation 시 메모리 오류

  train 시에는 괜찮은데, test 시에 오류가 나는 경우

  test 시에는 기울기를 계산하지 않겠다는 선언을 해줘야함

  - 해결책 -

  Variable을 선언할 때 인자로 volatile=True를 넣어주면 됨

  ex) train code:      Variable(im_data.cuda())

       evaluate code: Variable(im_data.cuda(), volatile=True)


4. 나한테 발생했던 오류

 

class RoIPool(Module):
def __init__(self, pooled_height, pooled_width, spatial_scale):
super(RoIPool, self).__init__()

self.pooled_width = int(pooled_width)
self.pooled_height = int(pooled_height)
self.spatial_scale = float(spatial_scale)

def forward(self, features, rois):
return RoIPoolFunction(self.pooled_height, self.pooled_width, self.spatial_scale)(features, rois)

class RoIPool(Module):
def __init__(self, pooled_height, pooled_width, spatial_scale):
super(RoIPool, self).__init__()

self.pooled_width = int(pooled_width)
self.pooled_height = int(pooled_height)
self.spatial_scale = float(spatial_scale)
self.module = RoIPoolFunction(self.pooled_height, self.pooled_width, self.spatial_scale) ##

def forward(self, features, rois):
return self.module(features, rois)

로 수정함

내부적으로 forward하면서 class를 계속 생성하고 있었음.



그리고 이러한 증상을 발견할 수 있는 tip.

memory 오류 날때까지 기다리지 말고

명령창 하나 더 띄워서 nvidia-smi -l 1 입력

그러면 memory 오류 시, iter 마다 메모리 사용량이 증가하는 것을 볼 수 있음

어디서 메모리 증가가 일어나는지 보려면

중간에 return 넣어주면된다.

그럼 return 전까지 괜찮은지, 문제가 있는지 볼 수 있음

+ Recent posts