오늘의 학습 리스트
LMS
- id가 같은 객체끼리도 각각 method를 사용해서 변환이 되면 각각 새로운 객체를 만드는 것 같다.
myword = 'cat'
myword is 'cat'
>>> True
myword.upper() is 'cat'.upper()
>>> False
print(id(myword))
print(id('cat'))
print(id(myword.upper()))
print(id('cat'.upper()))
>>>
140055382365616
140055382365616
140055266492016
140055266732272
- 얕은 복사, 깊은 복사
- 위의
'cat'
은 constant인데, list
는 다른 것 같다.(list
는 할당되어서 바뀔 수 있는 다른 객체가 필요해지는 순간 id를 새로 만드는 듯 하다)
mylist = [1,2,3]
var = mylist
print('mylist :', id(mylist), 'var :', id(var), '[1,2,3] :', id([1,2,3]))
>>>
mylist : 140055266667328 var : 140055266667328 [1,2,3] : 140055266664608
-
헷갈리면 역시나 documentation...
-
The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects)
-
Class
에서 method 만들 때 인자로 self 안 넣고 만든 다음, 그 method를 사용하면 아래와 같은 에러가 뜬다.(self는 메소드 만들 때 꼭 넣어야 하나 보다)
TypeError: drive() takes 0 positional arguments but 1 was given
-
클래스 내 att를 self.att로 하지 않고 그냥 변수명만 쓰면 딱 그 안에서만 작동하고, 혹시나 그 뒤에 self.변수명으로 해놓아도 그 라인은 에러가 난다.
class Test2:
def run1(self, a):
self.a = float(a) * 10
print(self.a)
def run2(self, b):
b = float(b) + 10
print(b)
print(self.b)
t = Test2()
t.run2(4)
>>>
14.0
<ipython-input-57-e29e8885edfd> in run2(self, b)
7 b = float(b) + 10
8 print(b)
----> 9 print(self.b)
10
11 t = Test2()
AttributeError: 'Test2' object has no attribute 'b'
-
매직메소드 관련 좋은 블로그(https://rszalski.github.io/magicmethods/)
-
if, else하고 오류나면 raise
라는 것으로 내가 원하는 Error Type 및 문구를 출력하게 해줄 수 있나 보다.
- The raise keyword is used to raise an exception.
- You can define what kind of error to raise, and the text to print to the user.
-
보니까 클래스 및 그것을 구현하는 함수를 모듈(?)로 만들 때 큰 그림의 구현 코드는
- 클래스를 정의하는 함수
- 클래스를 위해 실행되어야 하는 함수
- 그것들이 한데 어우러진 main 함수
if __name__ == __main__: main()
맞나...?
DeepML
-
image classification : primary part of CV
-
Semantic gap
- algorithms should be robbust to all sorts of transformations in the pixel data caused by such things as illumination, deformation, occlusion
- 예를 들어, 같은 고양이 사진이어도 빛의 밝기나 사물이 살짝 가려진 것이나 등등으로 인해 robust하게 못 가면 안된다. 이런 sematic gap을 줄여줘야 한다.(그래서 각각의 상황에 대처할 수 있는 simple한 판별기를 계속 만들기보다 데이터 왕창 넣어서 각각 클래스로 분류해주는 모델이 생기게 됨)
-
분류 문제를 풀 건데, 분류하는데 비교거리로 쓸 기준으로 삼아야 할까..?
- simple 한 건, L1 distance(맨해튼거리)로 array 끼리의 값 차이 및 절대값씌우기 + sum()하기
-
Nearest Neighbor는 backward한 방법이다.(약간 시대 역행적)
- training은 그냥 외우면 돼서 빠른데, test는 N개의 샘플 만큼 for loop을 돌리는 거라 시간이 더 걸린다.
-
K-nearest Neighbors 탄생 및 이점
-
알고리즘이 굉장히 단순하지만, 그래도 여러 군데 첫시도로서 적용할만하다(그만큼 알고리즘의 핵심이 범용적임)
-
L1, L2 distance metrics
- 내가 기대하는 geometry or topology에 따라 더 적합한 distance metric이 다르다
-
하이퍼파라미터
- 기계가 학습할 수 없는 것. 그래서 사람이 정해주는데, 이것에 따라 또 모델의 성능이 달라짐
- 베스트를 찾으려 할 때 accuracy를 기준으로 두지 마라.(training에는 100%일 수 있으나, test에는 부적합일 수 있음. 예: k=1일 때 nearest neighbour)
- 찾는 방법으로 또 train, test로만 나누지 말 것(진짜 unseen data가 test가 아닐 수도 있음)
- 그래서 train, val, test로 나눠서 하는 게 그나마 제일 좋음
- 데이터가 적을 때는 이걸 더 여러번 하는 cross-validation-process
- 데이터 적으면 w를 쉽게 찾아서 overfitting 되기 쉬운데 그것도 방지해줌
- 사실 테스트 데이터가 정말 실제 unseen 데이터를 반영하지 못할 수 있음
- 그러나 이렇게 하는 뒷받침 가설은 trian, test, real data가 같은 분포에서 왔다는 것!
-
L1, L2는 이미지에서는 안 좋음
- Distance metrics on pixels are not informative
-
K-nearest neighbors의 단점
- curse of dimensionality
: 데이터가 공간에 densely하게 있어야 이미지를 잘 분류하는데(아니면 저 멀리 있어도 비슷하다고 할 수 있음)
- L1, L2 not good for detecting perceptual differences
-
Linear classification
- train해서 나온 함수(가중치 w가 학습된)만 있으면 predict 할 수 있기 때문에 K-nearest neighbors보다 더 효율적이다(K-nearest neighbors는 데이터셋을 다 메모리에 저장함)
- bias의 뜻을 이제야 알았다...
- 데이터 학습에 영향을 주지 않으면서, 수식을 옮겨서 결국 어떤 클래스에 더 적합하게, 즉 편향되게끔 만들어주기 때문이다...
- 여기서는 결국 하나의 클래스로 귀결 될 수 있게 수식적 template을 만들어주는 것이다.
- 근데 그러다보니 그 template(가중치 w가 포함된)을 visualise하면 약간 짬뽕이다(각각 클래스마다 하나의 visualisation만 나와서... 예 : 말 클래스의 템플릿은 초록 밑 부분과 갈색 몸통 + 머리 같은 게 양쪽에 달려 있는...?)
- 만약 데이터(numpy array)를 고차원 공간에 분포한 점이라고 봤을 때, linear classifier가 하는 건 뭔가 이들 간의 클래스에 따른 boundary를 설정하려는 것이다.
- linear classifier가 잘 이루어지지 않는 것은 2차원 좌표 평면에서 데이터 분포가 약간 symetrical 하게 있을 때(?)이다.(즉 하나의 선으로 데이터들을 나누기 어려울 때)
-
모르는 거
- 첫번째 시도의 알고리즘은 왜 다른 종류에는 적용하기 힘든걸까?
-> 알겠다.. 첫번째 시도의 알고리즘은 그냥 클래스마다의 함수를 만들고 트레이닝해야 한다는 것이다.
- distance metrics에서 L1과 L2이 각각 적합한 시기
: L1은 벡터에서 각 요소들이 가지는 의미가 각각 좀 클 때(?) 그 데이터에 더 적합할 수 있단다.(왜냐하면 좌표계에 영향을 많이 받는 거여서)
: 하지만 둘 다 해보고 더 좋은 걸 찾으란다.
- L1, L2에서 좌표계(coordinate system)을 rotate하면 L1은 달라지고, L2는 안 달라진다는 건 뭘까?
더 공부할 것
__main__
과 같은 함수들의 의미는 무엇일까...?
if __name__ == __main__:
은 무슨 의미일까...?
: 핵심 포인트는 이것을 인터프리터에서 직접 실행할지 or 모듈로 불러와서 실행할지에 따라 이 모듈.py 파일의 코드를 어떻게 읽을 것이냐이다.
: 예를 들어 모듈로 불러와서 뭔가 테스트를 해야 할 상황이 있을 수 있단다.