최근에 밑시딥 스터디를 시작하였다. 블로그에 공부 기록을 남기기로 했으며 주에 2번씩 스터디가 진행 된다. 아는 내용이라고 흘려 보지(듣지) 말고 복습한다는 생각으로 꼼꼼히, 무사히 스터디를 완주하는 것이 목표이다 :)
해당 포스팅은 "밑바닥부터 시작하는 딥러닝 1"을 공부하고 정리, 요약한 글입니다. 모든 내용은 해당 도서 내용 기준입니다.
◾ 1.1 파이썬이란?
간단하고 배우기 쉬운 프로그래밍 언어로 알려져 있다. 오픈 소스이기 때문에 무료로 사용 가능하며 컴파일 과정도 없어 편리하다는 장점이 있다.
또, 파이썬 코드는 읽기 쉽고 성능도 뛰어나다. 때문에 구글, MS, 페이스북 등에서 파이썬을 자주 사용하고 있다.
파이썬은 numpy, scipy와 같은 라이브러리 때문에 과학 분야, 기계 학습, 데이터 과학 분야에서 널리 쓰이고 있으며, Caffe, TensorFlow 등과 같은 유명한 딥러닝 프레임워크들이 파이썬용 API를 제공하고 있다.
◾ 1.2 파이썬 설치하기
➡️ 해당 내용은 너무 기본적인 내용이라 생략함.
◾ 1.3 파이썬 인터프리터
파이썬 버전은 터미널에서 아래 명령어로 확인할 수 있다.
python --version
파이썬 인터프리터를 시작하려면 터미널에서 python만 입력하면 된다.
(나는 리눅스에 기본적으로 python 2.6 버전이 설치되어 있어 별도로 python3을 설치 했기 때문에 터미널 창에 python이 아니라 python3이라고 입력해야 한다.)
인터프리터는 '대화 모드'라고 부르며 개발자와 파이썬이 대화하듯 프로그래밍을 할 수 있다.
파아썬은 덧셈, 곱셈 등 산술 연산을 아래와 같이 할 수 있다.
>>> 1 - 2
-1
>>> 4 * 5 # 곱셉
20
>>> 7 / 5 # 나눗셈
1.4
>>> 3 ** 2 # 거듭 제곱
9
파이썬에서 자료형을 확인 하기 위해서는 type() 함수를 사용해야 한다.
또, 변수는 알파벳을 사용하여 정의할 수 있으며 이 변수를 사용하여 계산하고 값을 대입할 수도 있다.
>>> x = 10 # 초기화
>>> print(x) # x의 값 출력
10
>>> x = 100 # 변수에 값 대입
>>> print(x)
100
>>> y = 3.14
>>> x * y
314.0
>>> type(x * y)
<class 'float'>
파이썬은 동적 언어이기 때문에 변수의 자료형을 상황에 맞게 자동으로 결정한다.
위 코드에서 x가 int라고 명시하지 않았지만 10이라는 정수로 초기화할 때 x가 int인 것을 파이썬이 스스로 판단한 것이다.
정수와 실수를 곱한 결과를 실수가 된 것도 알 수 있다.
여러 데이터를 리스트, 딕셔너리 형태로 저장할 수도 있다.
>>> a = [1, 2, 3, 4, 5] # 리스트 생성
>>> print(a) # 리스트의 내용 출력
[1, 2, 3, 4, 5]
>>> len(a # 리스트의 길이 출력
5
>>> a[0] # 첫 원소에 접근
1
>>> a[4] # 다섯 번째 원소에 접근
5
>>> a[4] = 99 # 값 대입
>>> print(a)
[1, 2, 3, 4, 99]
>>> me = {'height':180} # 딕셔너리 생성
>>> me['height'] # 원소에 접근
180
>>> me['weight'] = 70 # 새 원소 추가
>>> print(me)
{'weight': 70, 'height': 180}
◾ 1.4 파이썬 스크립트 파일
사용자가 직접 클래스를 정의하여 독자적인 자료형을 만들 수도 있다. 클래스에는 그 클래스만의 전용 함수(메서드)와 속성을 정의할 수 있다.
클래스 구조는 다음과 같다.
class Man:
def __init__(self, name): # 생성자
self.name = name
print("Initialized!")
def hello(self): # 메서드 1
print("Hello " + self.name + "!")
def goodbye(self): # 메서드 2
print("Good-bye " + self.name + "!")
m = Man("David")
m.hello()
m.goodbye()
클래스 정의 시 __init__이라는 메서드가 클래스를 초기화 해준다. 이를 생성자라고 하며 클래스 인스턴스가 만들어질 때 한 번만 호출된다. 메서드의 첫 번째 인수로 자기 자신을 나타내는 self를 명시적으로 써야 한다.
◾ 1.5 넘파이
넘파이는 외부 라이브러리로 import하여 사용해야 한다.
넘파이 배열을 만들 때는 np.array() 메서드를 사용한다. 이는 파이썬의 리스트를 인수로 받아 특수한 형태의 배열인 numpy.ndarray를 반환한다.
import numpy as np
>>> x = np.array([1.0, 2.0, 3.0])
>>> print(x)
[1. 2. 3.]
>>> type(x)
<class 'numpy.ndarray'>
넘파이 배열로 산술 연산도 할 수 있다.
>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2.0, 4.0, 6.0])
>>> x + y # 원소별 덧셈
array([ 3., 6., 9.])
>>> x - y
array([ -1., -2., -3.])
>>> x * y # 원소별 곱셈
array([ 2., 8., 18.])
>>> x / y
array([ 0.5, 0.5, 0.5])
배열 x와 y의 원소 수가 같다는 점에 유의해야 한다. x와 y의 원소 수가 같다면 산술 연산은 각 원소에 대해서 행해지며, 원소 수가 다르면 오류가 발생한다. (원소별 이라는 말은 영어로 'element-wise'라고 한다. 원소별 곱셈은 element-wise product임.)
넘파이 배열은 스칼라값의 조합으로 된 산술 연산도 수행할 수 있다. 스칼라 값과의 계산이 넘파이 배열의 원소별로 한번씩 수행된다. 이 기능을 '브로드캐스트'라고 한다.
>>> x = np.array([1.0, 2.0, 3.0])
>>> x / 2.0
array([ 0.5, 1., 1.5])
또, 넘파이는 다차원 배열도 작성할 수 있으며 산술 연산도 가능하다.
>>> A = np.array([[1, 2], [3, 4]])
>>> print(A)
[[1 2]
[3 4]]
>>> A.shape
(2, 2)
>>> A.dtype
dtype('int64')
>>> B = np.array([[3, 0], [0, 6]])
>>> A + B
array([[ 4, 2],
[ 3, 10]])
>>> A * B
array([[ 3, 0],
[ 0, 24]])
이때 행렬과 스칼라값의 산술연산 역시 브로드캐스트 기능이 작동한다.
배열의 원소 인덱스는 0부터 시작하며 for문으로도 원소에 접근할 수 있다.
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> for row in X:
... print(row)
...
[51 55]
[14 19]
[0 4]
또, 인덱스를 배열로 지정해 한번에 여러 원소에 접근할 수도 있다.
>>> X = X.flatten() # X를 1차원 배열로 변환(평탄화)
>>> print(X)
[51 55 14 19 0 4]
>>> X[np.array([0, 2, 4])] # 인덱스가 0, 2, 4인 원소 얻기
array([51, 14, 0])
◾ 1.6 matplotlib
matplotlib는 그래프를 그려주는 라이브러리로 그래프 그리기와 데이터 시각화가 시워진다.
단순한 그래프를 그리기 위해서는 아래와 같이 pyplot 모듈을 사용하면 된다.
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 6, 0.1)
y = np.sin(x)
# 그래프 그리기
plt.plot(x, y)
plt.xlabel("x") # x축 이름
plt.ylabel("y") # y축 이름
plt.title('sin') # 제목
plt.show()
plt.plot 메서드를 호출해 그래프를 그리고 plt.show()를 호출하여 그래프를 화면에 출력한다.
이미지를 읽을 땐 imread() 메서드를, 이미지를 표시하기 위해서는 imshow() 메서드를 호출하면 된다.
import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread('test.png') # 이미지 읽기
plt.imshow(img)
plt.show()