백엔드

딥러닝에 대하여 2 - 파이썬 설치 및 기초 활용

CyberI 2017. 4. 3. 18:09

 

딥러닝에 대하여 2 - 파이썬 설치 및 기초 활용

 

 

 

 저번 딥러닝 포스트에서 다음화는 활성화 함수에 대해 쓸 것이라고 했는데, 대신 파이썬 설치 및 기초 활용에 대해 쓰려고 합니다. 앞으로 해 볼 예제들이 파이썬 코드이기 때문에 우선 파이썬을 설치하고 기초적 활용은 알아야할 시간이 필요하다고 생각했기 때문입니다. 파이썬을 설치하고 코드를 작성해보기 전에 파이썬이라는 언어에 대한 이야기를 잠깐 해보려합니다.

 

 

 

- 파이썬(Python)에 대한 배경 지식

 

파이썬은 오픈 소스로 배우기 쉬우며 컴파일 과정이 없어 편리하고 빠른 것을 장점으로 내세우고 있습니다. 파이썬은 네덜란드인인 'Guido Van Rossum' 이란 프로그래머가 만든 언어로, Python 1.0이 1994년 1월에 릴리즈되었으니 벌써 20년이 훌쩍 넘었습니다. 놀라운 점은 파이썬은 창시자의 취미 활동에 의해 탄생한 언어입니다...(!) 그 분은 크리스마스가 가까워 진 주에 '취미'로 할 프로그래밍 프로젝트를 찾다가 새로운 스크립트 언어를 위한 인터프리터를 작성하기로 결정하고, 그 프로젝트 이름을 'Python'로 정했다고 합니다.

 

파이썬은 범용적인 목적을 가지고 만들어진 언어로, 다양한 분야에서 사용되고 있습니다. 사용 분야는 크게 웹 애플리케이션 제작, 과학적 계산 및 수치 계산, 소프트웨어 프로토 타입 제작, 프로그래밍 입문자의 교육 분야가 있습니다. 과학 분야 및 수치 계산 분야에서 파이썬이 널리 쓰이는 이유 중에 하나는 이 분야를 위한 수많은 라이브러리입니다. 범용적 목적의 계산을 위한 라이브러리(SciPy, NumPy)를 비롯해 지구 과학 및 천문학 등 특정 목적을 위한 라이브러리도 있습니다. 특히 머신 러닝, 데이터 마이닝 및 딥러닝에서 파이썬이 많이 사용됩니다.

 

 

 

- 파이썬 설치

 

 파이썬은 https://www.python.org/downloads/에서 다운받을 수 있습니다. 주의할 점은 2.X 버전과 3.X 버전이 호환되지 않는다고 합니다. 하위 호환성이 없기 때문에 사용할 버전을 잘 알아보고 다운로드 받아야 합니다.

 

 

  <python.org의 downloads 화면>

 

 

 

 저는 제가 보고있는 책에서 설치하라고 권장하고 있는 '아나콘다 배포판'을 설치해보려고 합니다.  아나콘다 배포판은 파이썬을 이용한 오픈 데이터 과학 플랫폼입니다. 아나콘다의 오픈 소스 버전은 파이썬과 R의 고성능 배포판으로 데이터 과학을 위한 파이썬, R,스칼라 패키지를 포함하고 있습니다. 이 배포판은 https://www.continuum.io/downloads에서 다운로드 받을 수 있습니다.

 

  

<아나콘다 배포판 사이트>

 

 

 

 

다운로드 받은 설치파일을 실행시킵니다. 저는 파이썬 3.6 버전을 사용하는 아나콘다 4.3.1 윈도우용을 설치하였습니다.

 

 

 

 - 파이썬 버전 확인 및 코드 실행

 

 

설치가 끝나면 커맨드창에 'python --version'을 입력합니다. 파이썬 3.6.0 버전이 잘 설치되었습니다.

 

 

이어서 커맨드창에 'python'이라고 입력하면 파이썬 코드를 입력할 수 있는 파이썬 인터프리터가 실행됩니다. num1과 num2 이라는 변수를 선언하여 더한 값을 출력하는 코드를 입력해보았습니다. 아주 간단해 보이지만 여기서 알 수 있는 파이썬의 몇 가지 특징이 있습니다.

 

  • 파이썬에서는  '#'로 시작하는 모든 라인을 주석으로 인식한다.

  • 변수를 선언할 때 별도로 자료형을 입력하지 않는다.

  • 대부분의 언어에서 선언의 끝에 세미콜론을 사용하는데, 파이썬에서는 세미콜론을 생략하는 것을 권장한다.

 

 

 

 

 

 

 

커맨드창 외에도 파이썬을 설치하면 기본적으로 함께 설치되는 idle.exe라는 툴을 통해서도 코드를 입력하고 실행해볼 수 있습니다.  ${윈도우 계정 사용자 폴더}\Anaconda3\Scripts 에 idle.exe를 실행하면 됩니다. 그러면 위와 같은 창이 뜨고, 코드를 입력할 수 있습니다.  File-Save(Ctrl+S)를 누르면 .py 파일로 저장을 할 수 있습니다.

 

 

 

- 파이썬 기초 문법

 

파이썬 사이트에 들어가면 기초 문법에 대해 잘 설명이 되어있습니다. 아주 간단하니 설명을 안읽어도 한 번씩만 따라서 쳐보면 어떤 것을 설명하려는지 잘 알 수 있으실 것 같습니다. 

 

1. 변수 선언

 

  1. >>> a = 5
  2. >>> b= 3.2
  3. >>> c = "python"
  4. >>> x, y, z = 5, 3.2, "python"
  5. >>> print(a, b, c)
  6. 5 3.2 python
  7. >>> print(x, y, z)
  8. 5 3.2 python
  9. >>> x = y = z = "same"
  10. >>> print(x, y, z)
  11. same same same

 

파이썬에서는 변수를 선언할 때 자료형을 따로 선언하지 않습니다. 변수에 값을 할당하고, 할당한 값에 맞는 자료형에 따라 내부적으로 처리가 된다고 합니다.

 

2. 데이터 타입(Number, List, Tuple, String, Set, Dictionary, bool)

 

  1. >>> #Number(int)
  2. >>> a = 1
  3. >>> print(type(a))
  4. <class 'int'>
  5. >>>
  6. >>> #Number(float)
  7. >>> b = 3.11
  8. >>> print(type(b))
  9. <class 'float'>
  10. >>>
  11. >>> #Number(complex)
  12. >>> c = 1 + 2j
  13. >>> print(isinstance(c, complex))
  14. True
  15. >>>
  16. >>> #String
  17. >>> s = "python"
  18. >>> print(type(s))
  19. <class 'str'>
  20. >>>
  21. >>> #List
  22. >>> l = [1,2,'a',3,10.1, 'b']
  23. >>> print(type(l))
  24. <class 'list'>
  25. >>>
  26. >>> #Tuple
  27. >>> t = (1,2,'a',3,5)
  28. >>> print(type(t))
  29. <class 'tuple'>
  30. >>>
  31. >>> #Set
  32. >>> se = {1,2,3,4,4,4,4,4}
  33. >>> se
  34. {1, 2, 3, 4}
  35. >>> print(type(se))
  36. <class 'set'>
  37. >>>
  38. >>> #Dictionary
  39. >>> d = {1:'key', 'value':2}
  40. >>> print(type(d))
  41. <class 'dict'>
  42. >>>
  43. >>> #bool
  44. >>> a1 = True
  45. >>> print(type(a1))
  46. <class 'bool'>
  47. >>> b1 = False
  48. >>> print(type(b1))
  49. <class 'bool'>
  50. >>> a1 = true
  51. Traceback (most recent call last):
  52.   File "<pyshell#17>", line 1, in <module>
  53.     a1 = true
  54. NameError: name 'true' is not defined

 

 파이썬의 데이터 타입은 Number(int, float, complex), List, Tuple, String, Set, Dictionary, bool로 나뉩니다. 데이터 타입을 확인할 때는 type() 혹은 isinstance() 메소드를 사용합니다. 프로그래밍 언어는 Java와 Javascript만 다뤄본 저에게는 파이썬 데이터 타입에서 조금 특이한 점이 보입니다. 첫번째는 파이썬에 complex라는 데이터 타입이 있다는 점입니다. j 이외에 다른 알파벳을 넣어보니 syntax 에러가 났습니다. 아직은 모르겠지만 필요한 경우가 있겠지요..?

 

그리고 List에 서로 다른 데이터 타입을 섞어서 쓸 수 있다는 점도 눈에 띕니다. 자료형에 엄격한 언어는 아닌 것 같습니다. Tuple은 데이터베이스 공부할 때 들어봤던 용어인데, 파이썬에서 Tuple은 List와 유사한 자료형입니다. 차이점이 있다면 List와 달리 Tuple은 변경이 불가하다는 점입니다. 예를 들어, l[0] = 100 이라고 하면, l이라는 리스트의 0번째의 값을 100으로 변경할 수 있지만, t[0] = 100 이라고 하면 'TypeError: 'tuple' object does not support item assignment' 와 같은 에러가 발생합니다.

 

마지막으로 bool 자료형을 선언할 때 "True", "False" 와 같이 첫글자를 대문자로 해야합니다. "true" 라고 입력하면 Name 에러가 발생합니다.

 

3. if문

 

  1. >>> num = 3
  2. >>> if num > 0:
  3.         print("positive number")
  4. elif num == 0:
  5.         print("it's zero")
  6. else :
  7.         print("negative number")
  8.  
  9.  
  10. positive number

 

파이썬에서 분기문은 if-elif-else 키워드로 작성합니다. 조건 끝에는 콜론(:)을 써야하며, if-elif-else 키워드의 indentation을 꼭 지켜주어야 합니다. 파이썬에서는 세미콜론과 블레이스 { } 을 생략하고 개행과 인덴테이션으로 블럭을 구분하기 때문입니다.  조건 끝에 콜론(:)을 생략하면 syntax error가 발생합니다.

 

  1. >>> if(num > 0):
  2.         {print(num," is positive")}
  3. elif(num == 0):
  4.         {print(num, " is zero")}
  5. else :
  6.         {print(num, " is negative")}
  7.  
  8.        
  9. 1  is positive
  10. {None}

 

이런 식으로 조건을 괄호로 감싸도 되고 실행 블럭을 { }로 감싸도 됩니다. 하지만 첫번째 경우가 더 깔끔해보입니다. 파이썬에서도 위와 같이 개행과 인덴테이션만으로 구분되는 깔끔한 코드작성을 지향하는듯 합니다.

 

4. 반복문(for, while)

 

  1. >>> #for
  2. >>> numbers = [1,2,3,4,5,6]
  3. >>> sum = 0
  4. >>> for val in numbers:
  5.         sum = sum+ val
  6.  
  7.        
  8. >>> print(sum)
  9. 21
  10. >>> for i in range(len(numbers)):
  11.         print("Index[", i, "] is", numbers[i])
  12.  
  13.        
  14. Index[ 0 ] is 1
  15. Index[ 1 ] is 2
  16. Index[ 2 ] is 3
  17. Index[ 3 ] is 4
  18. Index[ 4 ] is 5
  19. Index[ 5 ] is 6

 

for문에서는 in 키워드를 사용합니다. 분기문과 마찬가지로 실행블럭은 인덴테이션으로 구분하고 조건 다음에 콜론을 붙입니다. 특이한 점은 for-else 구문을 사용할 수 있다는 점인데, 이 때 else 구문은 반복문을 실행한 후 맨 마지막에 한 번 실행됩니다. 

 

  1. >>> #while
  2. >>> n = 0
  3. >>> sum = 0
  4. >>> while n < 11:
  5.         sum = sum + n
  6.         n = n + 1
  7. else:
  8.         print("inside else")
  9.  
  10.        
  11. inside else
  12. >>> print("n is:",n,", sum is:",sum)
  13. n is: 11 , sum is: 55

 

while 문도 for문과 유사한 구조를 가지고 있으며, for-else와 마찬가지로 while-else 구문도 사용할 수 있습니다.

 

5. 함수(function)

 

  1. >>> #function
  2. >>> def printListLength(list):
  3.         """This function prints
  4. length of list passed in as parameter"""
  5.         print("List length is", len(list))
  6.  
  7. >>> printListLength([1,2,3])
  8. List length is 3
  9. >>>
  10. >>> print(printListLength.__doc__)
  11. This function prints
  12. length of list passed in as parameter

 

파이썬에서의 함수는 헤더에 'def'라는 키워드를 붙입니다. printListLength()라는 이름의 리스트를 파라미터로 받는 함수를 만들어보았습니다. 특이한 점은 함수에 따옴표 3개를 사용하여 multiple comments를 쓰면, 그 내용을 function_name.__doc__ 로 확인할 수 있는 점 입니다.

 

6. 클래스(class)

 

  1. >>> #class
  2. >>> class Person:
  3.         "This is test class"
  4.         def __init__(self, name="Jane", age=28):
  5.                 self.name = name
  6.                 self.age = age
  7.         def introduce(self):
  8.                 print("Hello, my name is ",self.name,". And I'm ", self.age, "years old.")
  9.  
  10.                
  11. >>> p1 = Person("Paul", 29)
  12. >>> p1.introduce()
  13. Hello, my name is  Paul . And I'm  29 years old.
  14. >>> p2 = Person()
  15. >>> p2.introduce()
  16. Hello, my name is  Jane . And I'm  28 years old.
  17. >>>
  18. >>> print(Person.introduce)
  19. <function Person.introduce at 0x0000000003069D08>
  20. >>>
  21. >>> print(p1.name)
  22. Paul
  23. >>> del p1
  24. >>> p1
  25. Traceback (most recent call last):
  26.   File "<pyshell#90>", line 1, in <module>
  27.     p1
  28. NameError: name 'p1' is not defined

 

파이썬은 객체 지향 언어로, '클래스'라는 개념을 가지고 있습니다. 파이썬의 클래스는 변수와 메소드를 가질 수 있습니다. 특이한 점 중 하나는 __init__() 메소드인데, 클래스의 새로운 객체가 초기화될 때 불리는 특별한 함수입니다. 이런 종류의 함수를 객체지향 프로그래밍에서는 '생성자'라고 부릅니다.

 

 또 한 가지 특이한 점은 클래스 내부에서 함수를 정의할 떄 첫번째 인자로 self를 쓰는 점 입니다. 메소드를 호출할 때는 인자가 없어도 작동합니다. 이렇게 쓰는 이유는 객체가 그 자신의 메소드를 호출할 때, 객체 그 자체가 첫번 째 인자로 넘어가기 때문입니다. 이름은 관례적으로 'self'라고 부르며, 다른 이름을 사용할 수 있지만 self로 하기를 강하게 권장하고 있습니다.

 

del 키워드로 attribute를 지우거나 생성한 객체를 지울 수 있습니다. 생성한 객체를 삭제하고 객체를 찾으려고하면, 정의되어 있지 않다는 에러가 발생합니다.

 

 

- 넘파이 라이브러리

 

  1. >>> import numpy as np
  2. >>> #create numpy array
  3. >>> arr = np.array([1,2,3])
  4. >>> print(arr)
  5. [1 2 3]
  6. >>> type(arr)
  7. <class 'numpy.ndarray'>
  8. >>>
  9. >>> arr1 = np.array([1.0, 2.0, 3.0])
  10. >>> arr2 = np.array([2.0, 3.0, 4.0])
  11. >>> arr1+arr2
  12. array([ 3.,  5.,  7.])
  13. >>> arr1 - arr2
  14. array([-1., -1., -1.])
  15. >>> arr1 * arr2
  16. array([  2.,   6.,  12.])
  17. >>> arr1/ arr2
  18. array([ 0.5       ,  0.66666667,  0.75      ])
  19. >>> arr1/ 2
  20. array([ 0.5,  1. ,  1.5])
  21. >>>
  22. >>> arr3 = np.array([3.0, 4.0, 5.0, 6.0])
  23. >>> arr1 + arr3
  24. Traceback (most recent call last):
  25.   File "<pyshell#15>", line 1, in <module>
  26.     arr1 + arr3
  27. ValueError: operands could not be broadcast together with shapes (3,) (4,)
  28. >>>

 

import numpy as np(참조할 이름) 를 입력하여 numpy를 임포트합니다. as 다음에 np라고 썼기 때문에, 넘파이 라이브러리에서 제공하는 메소드를 호출할 때 np라는 이름을 참조하여 가져오게 됩니다. array()를 사용해 생성한 배열의 타입은 'numpy.ndarray'로 출력되었습니다. 넘파이 배열은 원소의 수가 같다면, 덧셈, 뺼셈, 곱셈, 나눗셈 연산을 할 수 있습니다. 만약 원소의 수가 다른 배열과 연산을 시도하면 ValueError가 발생합니다.

 

  1. >>> A = np.array([[1,2], [3,4]])
  2. >>> print(A)
  3. [[1 2]
  4.  [3 4]]
  5. >>> A.shape
  6. (2, 2)
  7. >>> A.dtype
  8. dtype('int32')
  9. >>> B = np.array([[2, 0],[4,1]])
  10. >>> A + B
  11. array([[3, 2],
  12.        [7, 5]])
  13. >>> A * B
  14. array([[ 2,  0],
  15.        [12,  4]])
  16. >>> A * 10
  17. array([[10, 20],
  18.        [30, 40]])
  19. >>>
  20. >>> A[0]
  21. array([1, 2])
  22. >>> A[0][1]
  23. 2
  24. >>> A = A.flatten()
  25. >>> print(A)
  26. [1 2 3 4]
  27. >>>
  28. >>> #index 0, 2 values
  29. >>> A[np.array([0,2])]
  30. array([1, 3])
  31. >>>
  32. >>> A > 1
  33. array([False,  True,  True,  True], dtype=bool)
  34. >>>
  35. >>> # get values over 1
  36. >>> A[A>1]
  37. array([2, 3, 4])
  38. >>>

 

넘파이는 다차원 배열도 만들 수 있습니다. 그리고 1차원 배열과 마찬가지로 다차원 배열 간 산술 연산도 가능합니다. 특이한 점은 flatten()이라는 메소드로 다차원 배열을 1차원 배열로 만들 수 있다는 점입니다. 또한 배열에서 조건을 만족하는 값만 쉽게 추출할 수 있다는 점인데, 예를 들어 위에서 처럼 A=[1,2,3,4] 인 배열에서 0, 2 번째 값만 추출하고 싶은 경우 A[np.array([0,2])]로 할 수 있으며, 1 이상인 값만 추출하고 싶은 경우 A[A>1]로 쉽게 할 수 있습니다.

 

 

 

- matplotlib 라이브러리

 

matplotlib는 파이썬 2D 플로팅(plotting) 라이브러리입니다. 이 라이브러리를 사용하면, 라인, 바, 스캐터 플롯, 히스토그램 등 데이터를 매우 다양한 형태의 차트로 시각화할 수 있습니다. (matplotlib 사이트: http://matplotlib.org/ )

 

  1. >>> import numpy as np
  2. >>> import matplotlib.pyplot as py
  3. >>> x = np.arange(-3, 3, 0.1)
  4. >>> y = x**2 - x - 2
  5. >>> py.plot(x,y)
  6. [<matplotlib.lines.Line2D object at 0x0000000005D10CC0>]
  7. >>> py.show()

 

import matplotlib.pyplot을 py라는 이름으로 import 합니다. x는 -3부터 3까지 0.1로 증가하는 값을 가진 배열로 선언합니다. y값은 고등학교 시절 배운 이차방정식의 기억을 살려 위와 같이 정해보았습니다. 그런 후 matplotlib 라이브러리의 plot()과 show() 메소드를 호출하니...

 

 

 

 

포물선 형태의 그래프가 그려졌습니다! 저는 아주 간단한 그래프만 그려보았지만, matplotlib 사이트에 들어가보면 다양한 형태의 차트와 각각의 구현 코드가 있으니 관심이 있으신 분들은 들어가보시면 좋을 것 같습니다.

 


딥러닝 시리즈 1편 내용을 살펴보고 싶다면, 아래 링크를 클릭해주세요.

▶ 딥러닝에 대하여 1 - 딥러닝과 머신러닝, 그리고 신경망 기초 개념