통계 및 머신 러닝 문제에서 많은 경우는 어떠한 확률 분포 p의 기댓값 (expected value)을 구하는 것(샘플들을 추출해, 그 샘플에 대한 실험을 하고 실험한 결과를 평균을 낸다.)과 밀접한 연관이 있다. Importance sampling은 효율적으로 기댓값을 추정하기 위해 고안되었으며, 확률 밀도 추정 및 강화 학습 등의 다양한 활용에 이용되고 있다. Importance sampling의 목적은 기댓값을 계산하고자 하는 확률 분포 p(x)의 확률 밀도 함수 (probability density function, PDF)를 알고는 있지만 p에서 샘플을 생성하기가 어려울 때, 비교적 샘플을 생성하기가 쉬운 q(x)에서 샘플을 생성하여 p의 기댓값을 계산하는 것이다. 우리는 [식 1]과 같이 q에서 생성된 샘플을 이용하여 p의 기댓값을 계산할 수 있다.
[식 1]에서 p(x)/q(x)를 likelihood ratio라고 하며, p를 nominal distribution, q를 importance distribution이라고 한다. Importance sampling에서는 p의 기댓값 Ex∼p[f(x)]를 [식 2]와 같이 추정한다.
- 파이썬에서 모든 것은 객체이다. 객체는 유일하고 ID는 변하지 않는다. 그 ID가 C처럼 실제 메모리 주소는 아니다.
- 변수는 그 객체를 가리키는 역할만 한다.
- 깊은 복사 : copy of value 얕은 복사 : copy of reference
mutable에서는 값이 변하면 객체 그냥 새로 만들어 버린다.
immutable에서는 단순복사 : copy of reference 얕은 복사 : copy of value + reference 깊은 복사 : copy of value
list, set, dict 객체들
객체가 만들어진 메모리 공간에 다가가 그 객체 값 수정 가능(mutble)
b=a연산자를 통한 복사로, 같은 객체를 가리킨다. 객체가 수정가능하니 b를 위한 새로운 객체를 만들지 않는다.
int, float, complex, bool, string, tuple, frozen set 객체들
객체가 만들어진 메모리 공간에 다가가 그 객체 값 수정 불가능(immutble)
b=a연산자를 통한 복사로, 같은 객체를 가리킨다. 하지만 객체가 수정 불가능하니 b를 위한 새로운 객체를 만든다.
정수(int)
- 변수는 객체를 가리킬 뿐이다. 변수에 사칙연산을 하면, 사칙연산 결과의 객체가 새로 생기고, 그 객체를 변수가 가리킨다.
- 변수가 가리키고 있는 ‘객체’의 값을 비교하고 싶다면 ==연산자를 사용해야 한다.
- ‘객체의 값’이 같더리도 (같은 값을 가지는, 다른 메모리에 위치하는, 2개의 객체) Id가 다를 수 있다.
- 0~255의 값을 가지는 객체는 모두 같은 메모리에 위치한다. 이를 제외한 나머지는 모두 바로 위 조건을 따른다.
실수(float)
- ‘객체의 값’이 같더리도 (같은 값을 가지는, 다른 메모리에 위치하는, 2개의 객체) Id가 다를 수 있다.
-a ~ z, A ~ Z, 0~9, _를 문자열의 요소로 가지는 객체는 모두 같은 메모리에 위치한다. 이를 제외한 나머지는 모두 바로 위 조건을 따른다. (하지만 input으로 받은 문자열은 어떤 값이든 다 다른 메모리에 위치한다.)
리스트(list)
- immutable객체 이므로 위 표의 조건을 따른다.
- immutable객체의 경우, 얕은 복사(shallow copy)와 깊은 복사(deep copy)간에 차이가 없다. 앝은 복사(copy.copy(Object)), 깊은 복사(copy.deepcopy(Object))으로 생성한 각각의 객체들은, == 연산자로 true이지만, Id를 확인하면 모두 다른 id이다.
- 하지만 2차원 이상 list는 얕은 복사와 깊은 복사가 다르다. 얕은 복사를 하면 이 2차원 list([ [], [] ])에서 ** 는 참조복사 된다.
- 2차원 이상의 list도 깊은 복사를 하고 싶으면, list 깊은 복사(deepcopy)를 해줘야 한다.
튜플(tuple)
- 튜플은 값 수정이 불가능하다. 하지만 같은 값을 가지는 객체 더라도 서로 id가 다르다.
- 튜플 내부의 원소가 mutable이면, 그 원소는 수정 가능하다. a = ([1, 2, 3]) » a[0].append(4) 가능!
항상 mutable한 객체가 문제이다.
immutable한 객체는 거의 문제가 되지 않는다. 값이 변하면 ‘바로 그냥 새로운 메모리 할당!’이라고 생각하자
10. 블로그 읽을 때, 마우스 잡지 말기!! -> 집중해서 또박또박 읽기. Just Do It
11. 클래스 변수는 전역변수이고, 생성자 맴버 변수는 지역변수 이다.
12. 클래스 변수는 전역변수이고, 생성자 맴버 변수는 지역변수 이다.
만약 2개의 변수를 return하는 iter에 대해서, for x in dataloader_iter : 를 사용하면 x에 len=2짜리 list로써 변수가 들어간다. for x,y in dataloader_iter : 를 사용하면 x와 y에 iter가 주는 변수를 나눠가진다.
0부터 N까지 먼저 채워놓고, N부터 차근차근 하나씩 앞으로 나가면서 해당 자리에 오는데 걸리는 최단시간을 찾는다.
deffineMaxTime(N,K):MaxTime=K-Ni=2while(1):dist=K-N*iifMaxTime<=abs(dist):max_num_list=N*(i)ifN!=0elseK+10# 0문제 해결
returnMaxTime,max_num_listi+=1deffindtime(N,K):ifN>=K:return(N-K)Maxtime,max_num_list=fineMaxTime(N,K)lst=[Maxtime+1]*(max_num_list+1)# complex case
foriinrange(N+1):lst[N-i]=iforiinrange(N+1,max_num_list+1):ifi%2==1:lst[i]=lst[i-1]+1else:iflst[i-1]+1>lst[i//2]:# /연산을 해서 나오는 것의 자료형은 무조건 float
lst[i]=lst[i//2]forjinrange(1,100000):# 뒤를 보고 숫자가 너무 크면 줄여준다.
iflst[i-j]>lst[i-j+1]+1:lst[i-j]=lst[i-j+1]+1else:breakelse:lst[i]=lst[i-1]+1returnlst[K]if__name__=="__main__":N,K=map(int,input().split())print(findtime(N,K))
문제 풀이 - deque
que알고리즘을 사용한다
dist에 그 위치에 가는데 걸리는 시간을 계산한다.
원래 큐는 오른쪽에서 들어가서 오른쪽에서 나온다.(first input first output)
- RPN(region proposal network)에서 RRoi(rotation region of interest)를 찾아낸다.
- ROI pooling layer에서 diagonal ROI pooling layer도 추가했다.
* 더 좋게 보정된 regression할 rocation을 찾아낸다.
- 선박 검출 문제에서 좋은 검출 결과를 얻었다.
- 항공 사진(원격 탐사 이미지) 객체 검출에 중요한 성과를 얻었다.
1.Introduction
- 원격 탐사 이미지(remote sensing technology) 사용의 중요성이 증가하고 있다. 이 사진은 항구 관리, 해군 전시 상황에서 많이 사용될 수 있지만, 복잡한 backgorund처리와 밀집된 배들을 처리하기에 어려움을 격고 있었다.
- 요즘 핫한 CNN을 사용하고, Faster RCNN을 사용할 것이다.
- 일반적인 BBox는 배경까지 포함하는 수직 직사각형이므로 정확한 분석이 어렵다. 도한 거기에 NMS을 시행한다면 잡아야할 객체를 잡지 못하는 문제가 발생하기도 한다.
(NMS : 객체 중복 검출을 막기위해 겹치는 영역의 BBox들 중에 신뢰도가 가장 높은 Box만 남겨놓는 방법.)
(IoU : 즉 a영역을 객체라고 분류를 했다면, 그 영역을 ground truth영역과 비교해서 iou가 0.5이상이면, a영역과 ground truth영역에 대한 regression 학습을 시키는 방법. 당연히 분류(클래스)에 대한 학습도 한다. 만약 객체라고 분류한 a영역의 IOU가 0.5이하 이면 그것으로 BBox regression 학습시키지 않는다.)
- 따라서 이러한 문제를 해결하기 위해 rotated BBox를 사용 해보고자 했다. 또 diagonal region-of-interest pooling layer 내용도 제안할 예정이다.
2.Related Work(최근에 시행된 관련 연구들)
3.Methodology(방법론)
- Faster R-CNN with rotation anchors
- RBox and DRoI pooling llayer
3.1 Rotated Dounding Box Anchor
\1. RBox 는 (x,y (center-point), h(짧은 모서리), w(긴 모서리), theta(시계 반대방향으로 돌아간 정도)) 5가지 원소를 가지는 튜플이다. theta는 [-pi/2,pi/2]의 범위를 가진다.
\2. RBox regression(loss) 는 오른쪽 그림과 같다. 여기서 smooth loss는 Fast-RCNN에서 정의된 내용이다.
Faster rcnn 유투브 강의자료 참조
3.2 RoI and DRoI pooling layer
- 그냥 pooling layer를 사용하는것이 아니고, rotated RoI pooling layer를 사용한다.
- rotated RoI pooling layer : Box를 수평한 방향으로 다시 회전시킨 후에, Rescale처리를 하는 방법.
(a) : 원래 이미지를 RBox로 예측한 모습
(b) : 회전 후 max pooling적용 -> crop한것 처럼 보임
(c) : diagnal RoI Pooing을 적용. (b)만을 이용한다면, 선박 위의 작은 물체들이 사라지거나 너무 안보이는 현상이 일어난다. 따라서 있는 그대로의 물체를 바라보기 위해 diagnal RoI를 적용한다.
를 통해서 어디에서 작업하고 있고 어디에서 수정했는지 확인이 가능하다, (HEAD가 가리키는 방향)
branch 삭제하는 방법.(local repo에서만 삭제 된다.)
$ git branch -d $ git branch -D junhaB # junhaB에서 수정된 내용이 있더라도 commit을 안했더라도 강제 삭제
remote repo의 branch도 삭제하기
$ git push origin –delete
merge
$ git checkout master # master branch에 먼저가서 $ git merge # 이것과 융합한다. (합친다) 두개를 같게 만든다. $ git merge --no-f # git log graph를 그렸을때 branch에 대한 정보가 추가 된다.
2. Branch사이의 충돌 처리
2개의 branch에서 서로 다른 파일을 수정했다면, merge할 때, conflict(충돌)이 발생하지 않는다.
하지만 같은 파일을 수정했었더라면, merge할 때 충돌이 발생한다.
다음과 같이 같은 파일을 변경하고 Master로 돌아가서 merge를 시행하면, 어느 파일에 충돌이 발생한지 나온다.
충돌한 파일에 들어가면 «« 부터 »» 가 충돌한 부분이고,
master의 상태로 놔두고 싶다면, 초록색 박스를 남기고 빨간색 부분을 다 지우고
NewBracnh의 상태로 놔두고 싶다면, 파란색 박스를 남기고 빨간색 부분을 다 지우면 된다.
그리고 다음과 같이 그냥 다시 merge하면 안된다. add와 commit과정을 다시 하고 merge를 해야한다.
그리고 변경한 내용을 전부 remote repository에 올리려면 다음의 명령어
$ git push -f
3. Remote Repository 관리하기
$ git remote
해당 local repo에서 remote와 관련된 것이 무엇인지 보여준다.
기본적으로 origin을 보여준다.
origin에 대한 자세한 정보를 보고 싶다면,
$ git remote show origin
을 사용한다.
일반적으로 하나의 local repo와 하나의 remote repo를 연동시켜 놓는다.
하지만 하나의 local repo와 여러개의 remote repo를 연동 시켜 놓는것도 가능하다.
이때 사용가능한 명령어들은 다음과 같다.
$ git remote add test # 새로운 remote repo와 연결 $ git remote rename test temp # remote repo이름 바꿈 $ git remote -v # 전체 연결된 remote repo들을 확인해본다. $ git log origin/master # 특정 remote repo의 특정 branch에 대한 log를 확인하는 방법 $ git log temp/junhaB # 특정 remote repo의 특정 branch에 대한 log를 확인하는 방법
하지만 위에서 말했듯이 일반적인 경우에 local repo와 remote repo를 하나씩 연동하기 때문에
이 명령어들은 필요할때 찾아봐서 이용하면 된다. 즉 몰라도 된다.ㅎㅎ
4. Log 다루기
기본 적으로 다음의 명령어로 log를 확인할 수 있다.
$ git log $ git log –stat # 어떤 코드에 얼마나 많은 양의 수정을 했는지 그려준다
-p 옵션
$ git log -p
정확히 어떤 변경을 했는지, 코드 내부의 내용까지 보여주면서 log정보를 보여준다.
pretty옵션
$ git log –pretty=oneline 출력 결과 1a19ea5a514a2525815ec23b87bb6f2cd8b4781b (HEAD -> master, origin/master) commend ad875c560f0f6ce50e791efe6d1c2a9b51c73b45 commend 3793893ad7f56190be06b916ed3b1cc67443108a add line of aa 42b8cb2c1a42b8c12bf4d4f47e67c5ba6236ac0e add junha.py. 수정 readme 1916e39cf972406de7f89407ab35587e450342d0 first commit[readme.md]