[AIFFEL] 22.Jan.10 - Class, making_n_dimensional_dice

Deok Jong Moon·2022년 1월 10일
0
post-thumbnail

오늘의 학습 리스트

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.
  • 보니까 클래스 및 그것을 구현하는 함수를 모듈(?)로 만들 때 큰 그림의 구현 코드는

    1. 클래스를 정의하는 함수
    2. 클래스를 위해 실행되어야 하는 함수
    3. 그것들이 한데 어우러진 main 함수
    4. 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 탄생 및 이점

    • smooth out함
  • 알고리즘이 굉장히 단순하지만, 그래도 여러 군데 첫시도로서 적용할만하다(그만큼 알고리즘의 핵심이 범용적임)

  • 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 파일의 코드를 어떻게 읽을 것이냐이다.
    : 예를 들어 모듈로 불러와서 뭔가 테스트를 해야 할 상황이 있을 수 있단다.
profile
'어떻게든 자야겠어'라는 저 아이를 닮고 싶습니다

0개의 댓글