koodev

Rank

Math

Rank is the number of linearly independent rows or columns in a matrix. Following matrix is a 2-rank matrix(not 3) as 3rd row can be made by composition of 1st and 2nd row.

Reference: https://blog.naver.com/dhkdwnddml/220313237499

'Math' 카테고리의 다른 글

Manifold  (0) 2019.12.24
미분 Chain Rule  (0) 2019.07.31
미분 곱의 법칙 (Product rule)  (0) 2019.07.22
미분 관련 수학 기호  (1) 2019.06.07
Right Coset  (0) 2017.06.27

ML 프레임워크 GPU 연산 지원 확인하기

Programming

매 번 다시 검색해서 알아내는 것이라 여기에 정리해둔다.

Tensorflow (버전 2.2와 1.14에서 확인)

import tensorflow as tf
tf.test.is_gpu_available(
    cuda_only=False, min_cuda_compute_capability=None
)

PyTorch (버전 1.6에서 확인)

import torch
torch.cuda.is_available()

참고:

iPad Sidecar USB로 연결

Computer

Mac PC에 무선네크워크가 연결되어 있지 않을 경우 iPad와 Sidecar 연결이 되지 않는 문제가 있었다. 해결 방법은 Mac에서 iPad를 '신뢰'(Trust)하도록 설정하는 것이다. 정확한 방법을 아래에 적어놓는다. 

  1. iPad를 Mac PC와 USB로 연결한다.
  2. Finder를 띄우고 왼쪽 사이드바에서 연결된 iPad를 클릭한다.
  3. iPad에서 Mac을 신뢰하겠냐는 팝업이 뜨는데 신뢰버튼을 누르고, Mac에서도 마찬가지로 iPad를 신뢰하도록 한다.
  4. 이제 Sidecar를 무선네트워크 연결 없이도 사용할 수 있다.

참고: apple.stackexchange.com/questions/365787/force-sidecar-to-use-usb-connection

mkvirtualenv 실행시 ailed to find interpreter for Builtin discover of python_spec 에러

Programming

Ubuntu 18.04 를 새로 설치한 PC에 파이썬 가상환경을 만들기 위해 virtualenv와 virtualenvwrapper 패키지를 설치하였다. 그런데 가상환경을 만드려 하니 (mkvirtualenv) 아래와 같은 에러메시지가 뜨면서 생성이 되질 않았다.

RuntimeError: failed to find interpreter for Builtin discover of python_spec='python3'

'python3' 라고 나온걸 보고 python2 버전의 가상환경를 만들어 보니 이번에는 잘 생성이 되었다.

원인은 python3-dev 패키지가 설치가 되지 않아서인데, sudo apt install python3-dev 를 실행하고 가상환경을 만들면 문제 없이 실행된다.

참고: blog.cloudsys.co.kr/ubuntu-18-04-python3-venv-setup/

공용 .gitignore 를 건드리지 않고 .gitignore 설정하기

Programming

git을 사용하면서 .gitignore 를 편집해야 할 일이 생기는데, 리모트의 공용 .gitignore를 건드리기에는 부담스러운 상황이 있다. 그럴 경우 .git/info/exclude 파일을 .gitignore 와 같은 방식으로 사용하면 된다.

참고: stackoverflow.com/questions/1753070/how-do-i-configure-git-to-ignore-some-files-locally

Ubuntu 16.04 apt 'E: Unmet dependencies' 에러

Computer

다른 사람이 사용하던 Ubuntu PC를 사용하게 되었는데, 패키지 매니저(apt)가 심하게 꼬여 있었다. 패키지 설치가 되지 않으며, `sudo apt-get -f install` 로 fix를 시도해 보아도 아래와 같은 메시지가 나오면서 안 되었다.

E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

시도해 보고 실패한 방법들은 아래와 같다.

  • sudo apt-get -f install
  • sudo apt-get autoremove (sudo apt-get -f autoremove)
  • sudo apt-get --purge remove 문제가 있는 패키지
  • sudo apt --fix-broken install
  • sudo dpkg --configure -a
  • /var/cache/apt/archives/lock, /var/lib/apt/lists/lock 파일 삭제

그리고 마침내 아래 명령어를 사용하였더니 고쳐졌다!

sudo apt-get -o Dpkg::Options::="--force-overwrite" install --fix-broken

참고: https://askubuntu.com/questions/1044817/failed-installation-of-package-breaks-apt-get

Python 업그레이드 후 virtualenv 문제

Programming

최근에 Python 버전을 3.6에서 3.7로 업그레이드를 하였는데, Python3 버전을 사용하는 virtualenv가 꼬였는지 Python을 실행할 수 없게 되었다. 그래서 해당 virtualenv를 지우고 다시 생성해 보았는데 아래와 같은 메시지가 나오면서 생성이 되지 않았다.

$ rmvirtualenv myenv3
$ mkvirtualenv -p python3 myenv3
-bash: /usr/local/bin/virtualenv: /usr/local/opt/python/bin/python3.6: bad interpreter: No such file or directory

결국 virtualenv 자체를 지웠다가 다시 설치해야 했다.

$ sudo pip uninstall virtualenv
$ sudo pip uninstall virtualenvwrapper
$ sudo pip install virtualenv
$ sudo pip install virtualenvwrapper

참고: https://discourse.brew.sh/t/virtualenv-broken-after-python-3-7-update/2586/5

macOS 윈도우 스크린캡쳐 알파 그림자 없애기

Computer

macOS에서 윈도우를 선택해서 스크린 캡쳐를 할 때 (CMD+SHIFT+4 한다음에 SPACE) 윈도우 주변의 알파 그림자까지 캡쳐가 되서 캡쳐파일 용량도 커지고 불필요한 마진이 생겨서 불편했는데, 이 알파 그림자를 제외하고 캡쳐하는 방법이 있었다.

CMD+SHIFT+4 한다음에 SPACE 누르고 윈도우를 선택해서 마우스 클릭을 할 때, OPTION 키를 누른 상태에서 마우스 클릭을 하면 윈도우 주변 알파 그림자를 제외하고 캡쳐가 된다.

참고:  How do I take a screenshot without the shadow behind it?

macOS 앱에서 dylib 이 로드되지 않는 문제

Programming

Xcode로 macOS 앱을 만들다가 외부 라이브러리를 사용할 일이 있어서 dylib을 링크하려 했는데, 해당 dylib을 로드할 수 없다는 런타임 에러메시지가 나왔다. 그 프로젝트는 이미 a 파일을 링크해서 쓰고 있었고, a 파일 때와 같은 방법으로 dylib을 셋팅하고 있었다.

생각해보니 dylib은 추가적으로 해 주어야 하는 일이 있었다. a 파일은 심볼이 타겟 바이너리에 복사되어 들어가기 때문에 그냥 쓰면 되는 것이었고, dylib은 so 같은것이기 때문에 타겟 머신(macOS 컴퓨터)에 dylib을 설치하거나(/usr/lib 같은데다), 아니면 번들로 앱 패키지에 심어 넣어야 하는 것이다.

설치를 하는 것은 번거로우니까 스킵하고, 번들로 심는 방법을 적어본다. Xcode의 Navigator 에서 프로젝트 파일을 누른 다음, General - Frameworks, Libraries, and Embedded Content 항목을 살펴보자. 안에 테이블에서 해당하는 dylib 파일의 Embed 속성에서 'Embed & Sign' 옵션을 선택하면 끝.

참고로 설치하는 방법은 install_name_tool 이라는 명령어를 사용한다. 다음 링크 참조: Embedding .dylib libraries in your application bundle.

참고

Manifold

Math

최근에 'Manifold' 라는 단어와 마주치게 되었다. 처음에는 도대체 무얼 말하는지 이해가 되질 않다가 최근에 조금씩 이해되기 시작하여 정리해 두기로 했다. 가장 결정적인 도움이 된 아티클은 http://bjlkeng.github.io/posts/manifolds/ 인데, 이 글에서 Tangent Space의 기저 변환을 다루고 있는 후반부(정확히는 Jacobian 행렬부터)는 이해하지 못했다. 여기에서는 기본 개념만 정리한다. Manifold는 한글로 '다양체'라고 불리는데, 별로 와닿지가 않아 그냥 Manifold라고 썼다.

Manifold는 정의부터 들어가면 이해하기 어려울 것 같고, 예제를 먼저 나열해 보자. 여러 아티클 및 서적에서 1D Manifold의 예로 원(Circle)을, 2D Manifold의 예로 구체(Sphere)를 예로 들고 있다. 그 밖에 도넛(torus)이나 Klein Bottle 같은 이상한 도형들도 있는데, 이런 예들 중에 가장 최고는 '지도책(atlas)' 이라고 생각한다. 나는 지도책을 떠올리면서 Manifold의 개념을 직관적으로 이해할 수 있었다.

'지도책(atlas)'은 우선 '지도(map)'와는 조금 다른 개념이다. 지도책은 여러 장의 지도를 모아 놓은 것이다. Manifold를 쉽게 이해하기 위해 지도책을 "여러 장의 '연관된' 지도를 모아 놓은 것"이라고 해 두자. 좀 더 구체적인 예를 들어서 우리나라(대한민국)와 우리나라 전국 도로 교통 지도책을 떠올려보자. 여기서 A를 대한민국의 지형, B를 지도책이라고 하자.

첫 번째로 생각해야 하는 Manifold의 개념은 차원 이동이다. 대한민국의 지형은 3D이다. 3D 지형을 쉽게 풀어서 교통 및 지역정보를 제공하기 위해서 3D개념을 2D로 옮기고 복잡하고 구체적인 이미지를 단순하고 직관적인 이미지로 추상화시켜서 만든게 지도이다. 즉, A에서 B로 가면서(매핑되면서) 3D공간이 2D공간으로 바뀌는 것이다.

두 번째로 생각해야 하는 것은 A가 B로 가면서 한 번에 표현되는 것이 아니라 여러 개의 subset 들이 모여서 B를 이룬다는 것이다. 대한민국을 한 장의 지도로 표현하기에는 종이도 커야 하고, 만들기도 힘들기 때문에 여러 장으로 나누어서 지도'책'을 만드는 것이다. Manifold의 제약사항에 의해서 B는 반드시 두 개 이상의 부분집합으로 표현되어야 한다. 관련된 제약사항 하나가 더 있는데, 반드시 낙장이 없어야 한다. 대한민국 지도책이라면 빠진 곳 하나 없이 대한민국의 모든 지역이 지도책에 의해 다 커버되어야 한다. 예를 들어 작은 지역이라고 독도나 작은 섬 등이 빠져서는 Manifold라고 할 수 없다!

지금까지 대한민국(A)과 지도책(B)에 대해서 이야기를 했는데, 그럼 Manifold는 무엇인가? 여기서는 대한민국이 Manifold이고 지도책은 Atlas라고 부르고(그게 그거 아닌가..), 지도책을 이루는 각 지역의 지도를 Coordinates 또는 Local Coordinates 라고 하며, 대한민국의 한 지역에서 지도 한 장으로 가는 각각의 매핑을 Chart 라고 한다. 위에서 예를 든 사항을 만족하는 A를 Manifold 라고 부르는 것이다.

그러면 이제 Manifold의 진짜 정의에 대해서 알아보자.

N차원의 Topological Manifold M은 N차원의 Topological Hausdorff 공간으로서 유한 갯수의 기저를 가지며 "지역적으로" ℝn(N차원 실수공간)에 준동형사상(Homeomorphic) 된다. 이는 M에 속하는 모든 점 p는 열린 집합 형태를 갖는 이웃점들의 집합인 U를 가지며, 각각의 U는 준동형사상(Hoemomorphic)인 φ:U → V 을 가진다. 여기서 V ⊂ n 이다. 추가적으로 아래 내용도 알아두자.

  • U에서 V로 가는 φ:U → V 이 매핑을 'Chart' 혹은 'Coordinate System'이라고 부른다.
  • U집합을 해당하는 Chart에 대한 '도메인(Domain)' 혹은 'Local Coordinates Neighborhood'라고 부른다.
  • U에 속하는 점 p(p ∈ U)의 매핑된 이미지를 φ(p) ∈ ℝ으로 표기하고, 해당하는 Chart에 대한 p의 'Coordinates' 혹은 'Local Coordinates' 라고 부른다.
  • 이런 Chart 들의 모음을 { φα | α ∈ ℕ } 라고 하자. Uα 가 도메인이라고 하고, 모든 도메인의 합집합이 M이 될 경우 Chart의 모음인 { φα | α ∈ ℕ } 를 'Atlas' 라고 한다.

위에서 'Hausdorff 공간'이라는 개념이 나오는데 크게 중요하지 않다고 한다. 그럼 좀 더 이해를 돕기 위해 아래 다이어그램을 살펴보자.

Figure 4: Two intersecting patches (green and purple with cyan/teal as the intersection) on a manifold with different charts (continuous 1-1 mappings) to   ℝn Euclidean space. Notice that the intersection of the patches have a smooth 1-1 mapping in ℝn Euclidean space, making it a differential manifold (source: Wikipedia).

위 다이어그램에서 Manifold는 X이다. 이 X는 n+k 차원의 개체이다. 그리고 X에서 서로 다른 두 개의 조각(또는 도메인 혹은 Local Coordinate Neighborhoods) Uα(초록)와 Uβ(보라)를 정의했다. X는 Manifold이기 때문에 X안의 모든 점은 각자가 지역적으로(Locally) 낮은 차원의 유클리드 공간(ℝn)으로의 매핑 φ(Chart 혹은 Coordinate System)을 각각 갖는다. 만일 우리가 Manifold X의 도메인 중 하나에서 점 p를 하나 고른다음 낮은 차원의 유클리드 공간으로 매핑을 한다면(φ를 통해서), 이렇게 매핑된 점을 해당 Chart(φ)에서 점 p에 대한 Coordinate 혹은 Local Coordinate 라고 부른다. 그리고 이러한 Chart가 여럿 있고 이들의 도메인이 전체 Manifold X를 커버한다면, 이들 Chart들을 Atlas라고 부르는 것이다.

Figure 4 다이어그램을 조금 더 살펴보면 Uα(초록)와 Uβ(보라)에서 교집합 부분(하늘색)에서 각각의 Chart에 의해 매핑된 저차원의 공간에서 또 다른 매핑이 존재한다. 즉, 두 매핑 φαβ = φβ ∘ φα-1φβα = φα ∘ φβ-1 이고, 이들의 도메인은 각각 φα(Uα ∩ Uβ)와 φβ(Uα ∩ Uβ) 로 제한되며, 이들 매핑을 'Transition Map'이라고 부른다. 이 Transition 매핑을 궂이 언급한 이유가 있다. 이들 Transition 매핑이 미분가능(differentialble)하면 Differentiable Manifold라는 클래스로 정의된다. Differentiable Manifold는 Ck로 표기하고 k는 k번 미분 가능하다는 뜻이다. 특히 이들 Transition 매핑이 무한 번 미분 가능하다면(Infinitely Differentiable, C) 이것을 'Smooth Manifold'라고 부른다.

참고로 무한 번 미분 가능하다는 것은 말 그대로 (해당 구간에서) 고계도 미분을 끝도 없이 할 수 있다는 의미이다. 다항함수(Polynomial)는 무한 번 미분 가능하기 때문에 모든 함수가 무한 번 미분 가능해 보인다. 하지만 y=|x|⋅x 같은 경우 한 번 미분은 가능하지만(2⋅|x|) 두 번째 부터는 x=0 지점에서 미분이 불가능하여 모든 실수 구간에서 Infinitely Differentiable 하지 않다.

Smooth Manifold가 중요한 이유는 미적분같은 기법들을 적용하여 Manifold를 분석할 수 있기 때문이다. Chart를 통해 변환된 저차원의 유클리드 공간에서는 원본 Manifold에서보다 훨씬 쉽게 분석 기법들을 적용할 수 있게 된다(전국도로교통 지도책을 생각해보자).

참고

'Math' 카테고리의 다른 글

Rank  (0) 2020.10.13
미분 Chain Rule  (0) 2019.07.31
미분 곱의 법칙 (Product rule)  (0) 2019.07.22
미분 관련 수학 기호  (1) 2019.06.07
Right Coset  (0) 2017.06.27