Pycharm은 Python IDE  중 상당한 유저를 보유하고 있는 IDE이다.

본인도 메인 PC를 윈도로 사용하면서 tensorflow를 공부할때 코드를 서버에서 실행시키고 있다. (윈도에서 tensorflow가 GPU를 지원하지 않기 때문...) 

매번 sftp같은 프로토콜로 업로드하고, 올리고, ssh로 커맨드를 입력하기는 까다로운 면이 있다. 

하지만 Pycharm pro버전에는 이를 도와주는 강력한 기능이 있다. 그것이 바로 Remote Interpreter 기능이다.

 


Pycharm에서 프로젝트를 생성할 때 이와 같은 화면을 볼 수 있다. 특히 윈도우를 사용하시는 분들은 프로젝트 이름만 변경하고 바로 Create버튼을 누르셨을 확률이 높다. 

Location 밑의 Interpreter라고 적힌 부분의 오른쪽 톱니모양의 설정버튼을 누른 후, 그 중 Add Remote 버튼을 눌러보자.



나타난 창에서 SSH Credentials 를 누르면 SSH를 설정하는 창이 나온다.

내용을 입력해 준 후 OK 버튼을 누르면 인터프리터가 목록에 추가된다.

이 후 Create 버튼을 눌러 프로젝트를 만들어 보자.


만들어지면 아래처럼 익숙한 화면이 보일것이다. 


여기서 우리는 Deployment 를 추가로 설정해 줄 것이다. (이 과정이 없으면 sftp로 일일히 업로드해야한다)

메뉴에서 Tools -> Deployment -> Configuration에 들어가 보자.

왼쪽 위의 초록색 + 버튼을 누르면 ftp, sftp 등을 추가할 수 있는 창이 나온다.



Name은 자신이 식별하기 편한 이름으로 해 주고, Type은 본인이 선호하는 프로토콜을 선택하면 된다. 

참고로 SSH만  설정해 놓으신 분들은 SFTP를 선택하면 서버에 따로 서비스를 설정할 필요 없이 연결이 된다.


이후 등장한 창에서 역시 필요한 내용들을 채워주면 된다.

더욱 중요한 것은 두번째 Mappings 탭에서 Deployment path on server 항목을 설정해 주는것이다. (밑에 사진의 가운데 입력창)



오른쪽 ...버튼을 누르면 서버 디렉터리를 탐색할 수 있다. 이 중 원하는 폴더를 선택하면 된다. 

다 설정했다면 OK버튼을 눌러 프로젝트 창으로 돌아가 보자.

추가적으로 Tools -> Deployment -> Options 에서 Upload changed files automatically to the default server 를 Always로 설정해 두면 자동을 업로드까지 해 준다.


이까지 설정을 했다면 일반적인 파이썬 코드는 문제없이 동작할 것이다. (로컬 컴퓨터의 프로젝트와 동일하게 Run을 할 수 있다.)



하지만 CUDA를 사용하려고 하면 라이브러리를 찾지 못하는 문제가 발생할 수 있다. 

이는 Pycharm이 .bashrc 파일을 적용시키지 않아서 발생하는 문제이다.

이를 위해 한가지 옵션을 더 설정해 주어야 한다. 


메뉴에서 Run -> Edit Configuration에 들어가면 Environment 에 Environment variables 라는 설정이 있다.

...버튼을 눌러 설정창에 들어간 후 Name에 LD_LIBRARY_PATH, Value에 cuda경로/lib64를 입력해 주면 된다.



이 설정까지 마치고 나면 문제없이 파이썬 코드를 원격에서 Run 할 수 있다.

당연히 AWS의 GPU 인스턴스에도 똑같이 적용할 수 있으므로 조금 더 편하게 코딩할 수 있기를 바란다.




부족한 글 읽어주셔서 감사합니다^^

오타, 오류, 질문등을 발견하시면 댓글 남겨주시면 감사하겠습니다 ㅎㅎ


'AI' 카테고리의 다른 글

Pycharm 원격 빌드 설정하기  (8) 2016.07.25
딥러닝과 행렬  (4) 2016.06.26
Windows 10 build 14332 에 TensorFlow 설치하기  (12) 2016.05.09
  1. 장현진 2016.07.27 11:21

    EC2를 스팟 인스턴스로 사용하다보니, 원격지 IP가 계속 변경되는데, 이럴 때 수정할 수 있는 방법이 있으면 알려주실 수 있을까요??

    • ghatdev 2016.07.27 16:45 신고

      인터프리터 설정에서 기존 인터프리터를 편집하시면 가능하십니다. 혹시 도메인을 가지고 계시다면 ddns를 이용해보세요 ㅎㅎ

  2. astriker 2016.08.22 08:10

    글 잘봤습니다.
    궁금한게 한가지 있는데, pycharm으로 tensorflow 코드 작성시 intelligence기능으로 인한 import관련 오류가 안나는지 궁금합니다. code실행은 서버에서 하더라도 local 소스파일 작성할때 import 오류 강조가 나타날 것 같아서 질문드립니다. windows 10 bash위에서 tensorflow를 깔고 pycharm으로 코드 작성시 import오류가 안보이는 지 궁금합니다.

    • ghatdev 2016.08.28 11:51 신고

      답글이 늦었네요ㅠ 죄송합니다
      파이참에서는 원격 인터프리터라는 기능을 지원해 import 구문에 오류가 나지 않습니다. intelligence 기능도 모두 동작하구요. 윈도우 배시에 같은방법으로 사용하셔도 오류는 없을것 같습니다

  3. Kwak Ji Won 2016.11.25 18:54

    안녕하세요 Tensorflow 사용자입니다.
    좋은 글 감사드립니다.
    그런데 그러자면 서버에 Tensorflow 와 Python 이 설치되어 있어야 합니까?
    피드백 부탁드립니다.

  4. 파이참 사용자 2017.01.20 13:55

    좋은글 감사합니다.
    원격 서버에서 정상적으로 잘 동작합니다. ^^

  5. jinho 2017.11.24 17:21

    도움 많이 되었습니다.

    좋은 글 정말 감사합니다.

저번 글에서 원의 세 원의 교점을 이용해 위치를 구할 수 있다는 것까지 알아보았다.

이번에는 실제로 원의 교점을 이용하여 위치를 구해보자.

우선 대표적인 방법으로 두 원이 겹칠​ 때 그 두 교점을 지나는 직선의 방정식을 유도하고, 이 직선의 방정식의 교점을 찾는 방법이 있다.



그림으로 표현하면 위와 같다.

이것을 식으로 유도하려면?

우선 원의 방정식을 생각해 보자. 직교좌표계에서 원의 방정식은 이러한 형태로 나타난다.

$$(x-a)^2+(y-b)^2=r_1^2$$

우리는 세 원이 한 평면에 있음으로 직교좌표계를 설정할 때 한 원은 중심이 원점에, 다른 하나의 원은 한 축 위에, 나머지 한 원은 임의의 한 점에 놓을 수 있다.


(굳이 이렇게 놓는 이유는 계산이 편해지기 때문이다.)

위의 그림처럼 놓고 세 원에 대한 방정식을 세워 보면

$$x^2+y^2=r_1^2$$

$$(x-a)^2+y^2=r_2^2$$

$$ (x-b)^2+(y-c)^2=r_3^2$$

각각의 원에 대해 위의 방정식 3개를 유도할 수 있다.


여기까지 잘 따라왔다면 이제 직선의 방정식을 구해야 한다. 이를 위해서 원의 방정식을 연립하여 교선을 찾아야 한다.

( \(xy\) 직교좌표계 상의 어떠한 원의 방정식을 전개하든 \(x^2\)과 \(y^2\)이 등장한다. 그러므로 원의방정식 두개를 연립하면 \(x^2\)과 \(y^2\)이 소거되어 \(x\)와 \(y\)만으로 이루어진 직선의 방정식만 남게된다)

우선 위의 식들을 전개하면 각각 다음과 같다.


$$x^2+y^2=r_1^2$$

$$x^2-2ax+a^2+y^2=r_2^2$$

$$x^2-2bx+b^2+y^2-2cx+c^2=r_3^2$$


첫번째와 두번째, 두번째와 세번째, 첫번째와 세번째 식을 각각 연립하면 3개의 직선의 방정식을 유도할 수 있다. 이를 유도하면 다음과 같다.


$$2ax-a^2=r_1^2-r_2^2$$

$$(2b-2a)x+2cy-c^2=r_2^2-r_3^2$$

$$2bx-b^2+2cy-c^2=r_1^2-r_3^2$$


첫번째 식을 정리하면 다음과 같이 \(x\)성분만 남는다.


$$x=\frac{r_1^2-r_2^2+a^2}{2a}$$


두 원의 중심이 한 축 위에 있음으로 이 두원의 교점으로 유도된 직선의 방정식은 무조건 그 축에 수직이기 때문이다. 덕분에 수월해진다.

이 후 이론상으로는 세 직선이 한 점에서만 만나기 때문에 두 직선의 교점만 구해도 위치를 구할 수 있다.


그러므로 \(x\)성분에 대해 정리된 식을 2번째 식에 대입하면 우리가 원하는 교점이 도출된다.

대입하면


$$\frac{(2b-2a)(r_1^2-r_2^2+a^2)}{2a}+2cy-c^2=r_2^2-r_3^2$$


이를  \(y\) 성분에 대해 정리하면


$$y=\frac{r_2^2-r_3^2+c^2}{2c}-\frac{(2b-2a)(r_1^2-r_2^2+a^2)}{4ac}$$


그러므로 결과적으로


$$x=\frac{r_1^2-r_2^2+a^2}{2a}$$

$$y=\frac{r_2^2-r_3^2+c^2}{2c}-\frac{(2b-2a)(r_1^2-r_2^2+a^2)}{4ac}$$


위 두 식을 계산하면 우리가 원하는 위치 (\(x\),\(y\))를 얻을 수 있다.

그러면 이 수식을 코드로 바꾸어 보자

이처럼 간단히 파이썬 코드로 바꾸어 구현할 수 있다.

하지만 이렇게 위치를 구해도 끝이 아닌것이 실제 상황에서는 오차가 발생하여 세 원이 한 점에서 만나지 않는 경우가 대부분이다.

다음에는 이 오차를 수학적으로 계산하고, 이를 고려한 위치를 출력하는 것을 해 볼 것이다.


부족한 글 읽어주셔서 감사합니다^^

오타나 오류가 있으면 지적 부탁드립니다ㅎㅎ

  1. 박성아 2016.08.02 12:37

    와..ㅠㅠㅠ 수학식 계산으로 들어가니 이해하기가 너무 어렵네요 ㅠㅠ

    • ghatdev 2016.08.02 13:23 신고

      언뜻 보면 복잡해보이지만 실상은 원의 방정식과 연립방정식이 전부입니다ㅎㅎ 한줄한줄 직접 유도해보시명 쉽게 금방 하실 수 있으세요

  2. Ha 2016.08.28 15:37

    감사합니다 좋은 정보 잘 읽고갑니다.

  3. 너무너무재밋네요 2016.08.29 10:33

    3편이 기대됩니다 ^^

  4. 취준생 2016.09.05 20:11

    글이 너무 좋네요 ~ 다름이 아니라 이번에 제가 졸업논문을 쓰는데 비콘 2개를 이용해서 두개의 신호의 강도에 따라 약한쪽에 어떤 액션을 취하고 또 양쪽을비교해서 약한쪽에 어떤 액션을 취하게 하고 싶은데 도저히 감이 잡히질 않습니다. 조금만 팁을 주시면 안될까요?

    • ghatdev 2016.09.05 21:23 신고

      잘 읽어주셔서 감사합니다ㅎㅎ
      비콘 2개를 이용할 때 어떤 조건인지를 조금더 자세히 설명해 주실 수 있으세요? 열린 공간인지, 장애물은 없는지 말이에요
      혹시 2개 비콘에서 등거리를 유지하며 직선으로 나아가는 액션을 취하시려는 건가요?

  5. kafka 2016.10.18 15:36

    실내 네비게이션을 구현해 보려다 여기 들어왔는데요.
    위의 공식으로 실제 비콘에서 송신된 데이터로 값을 알아내려니 필자님 말씀대로 제대로 한점에서 만나지 않는 것 같습니다. T.T
    3편은 언제쯤 올리실 생긱이신가요?

    혹시 3편에 올리실 내용을 미리 좀 알려주시면 안될런지요 ㅋㅋ

    • ghatdev 2016.12.12 14:07 신고

      늦어서 죄송합니다ㅠ 입시가 이제끝났네요. 빠른시일안에 3편 업로드하도록 하겠습니다!

  6. wskng 2017.02.15 07:56

    정말 좋은 내용이네요.
    혹시 다음 글은 언제 올리실 예정인지 궁금합니다.

  7. 장형민 2017.09.18 11:25

    좋은 글 감사드립니다.

    혹시 다음 편에서 진행 될 오차의 대한 수학적 계산이라는 것이 어떠한 원리로 되는지 간단하게 나마 알수 있을까요??

딥러닝을 공부하던 중 막상 코드로 짜보려니 햇갈리는 부분이 많아 결국 키보드 대신 펜을 잡기로 하였고, 펜으로 정리된 것을 이곳에 적어보려 한다.


딥러닝 관련 자료를 보면 많은 경우 이러한 그래프를 보게 된다. 


input layer는 입력 레이어, output layer는 최종 출력값을 내어주는 레이어다.

그런데 이를  식을 이용해서 코드로 구현하자니(손으로 써도 마찬가지..) 입력값만 봐도 8개이며 히든 레이어는 무려 9개씩 3층으로 이루어져 있다. 식도 길어질 대로 길어지고 나중에 알아보기도 힘들어진다.

이를 간단히 표현할 수 있는 방법이 바로 행렬이다. (비록 고등 교과과정에서 삭제되었지만....) 행렬을 간단히 소개하면 다음과 같은 개념이다.

일단, 행렬은 이와 같이 정의된다.

내용을 보면,  라는 행렬은 i개의 행과 j개의 열을 가지고 있다. 각 항은 i와 j값으로 표현된다.

프로그래밍 언어를 배웠다면 간단히 배열과 비슷한 형태라고 생각할 수 있다.


행렬과 행렬이 더해질 때는 i와 j 값이 같은 항끼리 더해진다. 

특이한 것은 행렬의 곱샘이다. 위키피디아의 정의는 다음과 같다.



예시는 다음과 같다.


따라서, 입력 레이어는 다음과 같이 행렬로 표현할 수 있겠다.



일단 입력 레이어는 행렬로 표현을 하였다. 그런데 우리가 원하는 식은  형태이다. 

여기서 행렬 연산의 특징이 이용된다. 위에서 소개한 행렬의 곱셈 연산 중 B*A 예시에 주목해 보자.

행렬의 정의에서 알 수 있듯이 앞에 행렬의 행이 1행이고, 뒤의 열이 1열일 때, 이를 곱하면 다항식이 도출된다.

다만, 곱할 때 앞 행렬의 행의 수와 뒷 행렬의 열의 수가 같지 않으면 (혹은 반대) 행렬의 곱샘은 정의될 수 없다.

이 점에만 주의하면 행렬로써 딥 러닝 그래프를 표현할 수 있다.



간단한 예제 코드를 살펴보며 행렬로 표현해 보자.



이 코드는 XOR을 학습하는 코드이며 tensorflow를 이용하였다.


XOR을 수행하기 위해서는 2가지의 값이 필요하다. train.txt 에는 해당되는 데이터가 저장되어 있다.


코드에서 6, 7번째 줄이 이 데이터들을 읽어와 x_data와 y_data에 저장해 주는 역할을 한다.


코드의 15번째 줄부터 22번째 줄까지를 보자. 


이부분이 weight값을 행렬로 생성하는 곳이다. tf.random_uniform 함수는 제일 처음 인자의 형태로 행렬을 만들고, 각 항들을 2번째 3번째 인자 사이의 값들 중 임의의 값으로 채운다.

즉, 15번째 줄은 2*5 행렬을 생성하고, 각 항들을 -1부터 +1 사이의 값들 중 임의의 값으로 채운다는 것을 의미한다


처음 2*5 행렬을 생성한 이유는 입력 레이어에서 입력받는 값이 2개임으로 1*2 행렬을 만들어 전달하기 때문이다.

행렬을곱할 때 앞 행렬의 행의 수와 뒷 행렬의 열의 수가 같지 않으면 (혹은 반대) 행렬의 곱샘은 정의될 수 없기 때문이다. 


이제 33번째 줄을 보자. 입력값인 X행렬과 w1행렬을 곱하고, 바이어스 값을 더한 후 이에 대해 relu 연산을 수행한다.

괄호 안쪽부터 차례대로 따라가보자.


우선 행렬의 곱을 수식으로 나타내면 다음과 같다.

이를 연산하면 다음과 같다.



결과적으로 열의 갯수가 5개인 행렬이 생성된다.


다음으로 바이어스 값을 더하게 된다. 바이어스 값은 24번째 줄에서 열의 갯수가 5개인 행렬로 정의되어 있다.

앞서 곱연산 후 나온 행렬의 크기가 1*5임으로 각각의 식에 바이어스 값을 더하려면 바이어스도 1*5 크기여야 한다.


결국 덧샘 연산까지 마친 후 도출되는 행렬은 열이 5개인 행렬이다. 즉 1*5인 행렬이다. 1*2 행렬과 2*5 행렬을 연산하여 1*5 행렬을 얻어낼 수 있게 되었다. 

더불어  형태의 식도 얻을 수 있게 되었다.(물론 연산중에는 실제 값들이기때문에 계산이 완료된 상수값이다)


34~40번째 줄은 각각 16~22 번째 줄과 25~31번째 줄의 weight 와 바이어스 값에 대해 비슷한 연산을 수행한다.

그렇게 출력 레이어 직전에는 100개의 계산결과가 나오게 된다. 그리고 마지막 출력 레이어에서 이를 곱연산을 통해 모든 항을 더한 값을 출력한다.


딥러닝에서는 위와 같이 상당히 많은 weight 와 바이어스 값들을 이용한다. 이때문에 1차식으로 일일히 이를 구현하는것은 노가다도 그런 노가다가 없으며, 나중에 코드를 다시 볼 때에도 상당히 불편해진다. 

어찌된 이유든 딥려닝에서는 행렬을 사용하여 코드를 구현하고, 결국 수학을 모르면 코드를 짜다가도 햇갈린다;;





혹여나 이글을 읽으시는 분들은 햇갈리실 일이 없길 바라며, 서술 중 잘못된 부분이 있으면 지적 부탁드립니다ㅎㅎ

'AI' 카테고리의 다른 글

Pycharm 원격 빌드 설정하기  (8) 2016.07.25
딥러닝과 행렬  (4) 2016.06.26
Windows 10 build 14332 에 TensorFlow 설치하기  (12) 2016.05.09
  1. 뚜비뚜밥 2016.07.21 17:54

    딥러닝에서 행렬이 왜 그렇게 중요한지 이해하는데 정말 한방에 이해가 되는 좋은 글인것 같습니다! 덕분에 공부하는데 많은 도움이 되었네요^^ 그런데 한가지 궁금한 점이 있습니다. 40번 라인까지의 계산 결과로는 1x5 행렬이 생성되고, 42, 43 라인을 통해 1x1의 cost 가 계산된 다음 이를 45, 46, 47번 라인에서 학습하는데, 이 때 출력 이전까지의 행렬 크기가 어떻게 100이 되는지가 궁금합니다. 그냥...학습하면 100개의 계산 결과값이 나오는 건가요 아님 출력 결과의 차원을 예측하기 위한 계산 식이 있는 것인지요? 본 글의 취지와는 살짝 어긋나긴 하지만 궁금해서 이렇게 여쭤봅니다 ㅎㅎ

    • ghatdev 2016.07.21 19:26 신고

      출력 직전의 레이어인 L8의 레이어를 보면 W가 10*10의 행렬로 정의되어 있습니다.(21번째 라인을 참고하세요) 또한 이전 레이어인 L7에서 넘어온 행렬의 크기도 10*10입니다. 행렬을 곱할때 크기가 같은 행렬을 곱하게 되면 도출되는 행렬도 같은 크기가 됩니다. 따라서 L8레이어 만 보면 100개의 w_i*x_i + b_i 식을 가지고 있습니다. 이를 10*1크기의 행렬과 곱을 하게 되면 행렬의 곱연산 이후 1*1 크기의 행렬이 도출되게 됩니다.
      원하시는 답이 되었나요?ㅎㅎ

    • 뚜비뚜밥 2016.07.21 19:33

      아! 수식을 위주로 보다보니 그부분이 떡 하니 있는데도 못봤네요ㅎㅎ 감사합니다!

    • ghatdev 2016.07.21 19:35 신고

      넵ㅎㅎ 부족한 글 읽어주셔서 감사합니다!

+ Recent posts