이번에는 Saliency Map Visualisation을 통해서 시각화를 하는 방법을 알아볼 것이다."Deep Inside Convolutional Networks: Visualizing Image Classification Models and Saliency Maps" 라는 논문이다. 논문 원문은 https://arxiv.org/abs/1312.6034 Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency MapsThis paper addresses the visualisation of image classification models, learnt using deep Convolutional N..
AI model들은 항상 black-box라는 문제를 가지고 있다. 이 문제로 인해 모델 안에서 어떤 일들이 벌어지고 있는지를 직접 시각화하고 알아내고자 하는 시도들이 많이 있었는데, Activation Maximization (Maximization by optimization) 도 그 시도들 중에 하나이다. 특히 Activation Maximization은 CNN에서 각 Feature Map들이 표현하는 시각적 특징이 무엇인지를 시각화하려는 시도이다. CNN의 구조 중 하나를 "target"으로 고정시켜놓고, 이를 최대로 활성화시키는 입력 이미지를 찾거나 생성하는 방법이다. (여기서는 생성하는 방식을 다루도록 하겠다)참조: - Olah, et al., "Feature Visualization", D..
보통 .pop()을 쓸 때, 리스트 이름 뒤에 .pop()을 붙여서 마지막 element를 빼냈던 것 같다. 그런데 어떤 변수에다가 stack.pop() 값을 할당해줄 수 있다. 코드를 보자. 여기 보면 기준점이 되는 index를 stack.pop()으로 할당해주었다. a = stack.pop()으로 할당해주면 마지막 element의 인덱스를 가져올 수 있다. 그리고 결과를 효율적으로 저장해주는 방법인데, 코드를 보면 result를 저장할 때에 result = [0] * len(prices)로, 단순히 빈 배열인 result = [] 를 하기보다애초에 0이 각 위치에 들어가있는 상태로 초기화를 시킨다. 이렇게 저장하면 따로 위치를 관리해줄 필요 없이 result 자체에 인덱스로 접근할 수 있다.re..
오늘은, 처음의 index값을 보존할 수 있는 방법을 알아보겠습니다. 처음 index값을 보존하려면, enumerate로 아예 인덱스값이 포함된 tuple로 만들어주면 됩니다. process = deque((i, order) for i, order in enumerate(priorities)) 이런 식으로 기존 priorities의 인덱스를 i로 보존하면서 새로운 큐인 process를 만들 수 있습니다.그리고 tuple의 element는 elem[0] 이런 식으로 접근하면 됩니다.
오늘은 while문의 조건의 순서에 대해서 알아보려고 한다. 알다시피 파이썬은 왼쪽에서 오른쪽으로 코드가 읽히는데, 여기서 and 로 동일 조건임을 명시해도 먼저 써야하는 조건이 있다. 주로 리스트나 큐와 같은 배열을 순회할 때, 옆에꺼 접근하고 이러다보면 항상 list index out of range 에러를 마주치게 된다. 항상 리스트 길이 조건이 충족되었는지 조건을 먼저 작성해줘야한다. (Rule of Thumb) 코드를 보면,
오늘은 sort()와 sorted() 차이가 뭔지 적어보려고 한다. 1. sort()는 원 배열을 수정한다.2. sorted()는 원 배열을 수정하지 않고 modify된 새 배열을 리턴한다. 그러므로 sorted()가 Space Complexity를 좀 더 잡아먹을 것이다.
이번에는 python의 조건이 있는 sort()에 대해서 알아보고, tuple이 쭉 있을 때 [ (1, a), (2, b) ] 앞에 숫자에 대해서 sort 한 번, 뒤의 글자에 대해서 sort 한 번 식의 다중 sort(),그리고 이걸 lambda로 구현, 하는 걸 다뤄보자. 결론부터 보면,.sort(key = lambda x: (-x[1], x[0])) 1. key = sort의 기준! 2. 익명 함수인 lambda x 를 사용해주었다. lambda x : x[0] 을 하면 x의 0th element를 기준으로 "오름차순" 으로 정렬해준다. 3. (-x[1], x[0]) 에서 -는 내림차순, 냅두면 오름차순이며, -x[1]을 먼저 써주는 이유는 이거를 기준으로 먼저 정렬하고, 그 상태에서 ..
element가 2개 있을 때, 하나를 씹어버리고 나머지 하나에 대해서만 sum 연산이라던지, 이를 조작할 수 있는 코드가 있어서 기억을 위해 포스팅하고자 한다. 프로그래머스의 Hash - 베스트앨범 문제이다. 우선 이전 포스팅으로 여러 tuple을 value로 가지고 있는 dict()를 생성해 주었고, 위처럼 생겼다. tuple의 2번째 element가 재생 횟수인데, 가장 재생이 많이 된 장르를 찾고자 한다. 이럴 때, value들을 for 문으로 순회해주는데, 원래는 element가 2개니까 for index, play in dict[genre]: ~~~ 이런 식으로 접근해야 한다. 하지만, sum(play for _, play in dict[genre])이렇게 _를 사용하고 ..
오늘도,, 저번 포스팅의 연장선인데, 딕셔너리에서 하나의 key에 여러 값 추가하기이다. 저번에는 하나의 key에 여러 value들을 리스트로 추가해줬다. key : [val1, val2, val3] 이런 식으로다. 그런데 이제는 하나의 key에 여러 value들을 tuple로도 추가해줄 수 있다는 사실을 깨달았다. 이번에 문제를 풀면서 도대체 index를 어떻게 같이 관리해야 하나 싶었는데, tuple로 인덱스값도 같이 저장해줄 수 있다. 처음에 추가할 때는 [(i, value)] 이렇게 추가해주고, 나중에는 .append([i, value2]) 이런 식이다. 결과는 이렇게 된다: key : [(0, val1), (1, val2), (2, val3)] 이렇게 하면 인덱스까지 관리가 된다. 문제와 ..
zip()을 쓰는 사람들이 멋있어 보이고 간편해 보였다. 찾아보니 zip()은 여러 리스트의 동일한 위치에 있는 애들을 묶어서 도는 것 같다. 어차피 아마 element들 만 빼내는 용도로 쓸 것 같다. 예시 코드를 그냥 한 번 쳐보자. list1 = [a, b, c]list2 = [1, 2, 3] for char, num in zip(list1, list2): -- 이런 식으로 a와 1, b와 2, --- -- 이런 요소들에 접근할 수 있다. ---