2024. 6. 28. 19:34ㆍ밑바닥부터 시작하는 딥러닝 1
ch01 헬로 파이썬¶
1.4 파이썬 스크립트 파일¶
1.4.2 클래스¶
개발자가 직접 클래스를 정의하면 독자적인 자료형을 만들 수 있다. 또한 클래스에는 그 클래스만의 전용 함수(method)와 속성(Attribute)를 정의 할 수도 있다.
파이썬에서는 class라는 키워드를 사용하여, 클래스를 정의한다. 클래스의 구조는 다음과 같다.
class 클래스 이름 :
def __init__(self, 인수, ...): #생성자
...
def 메서드이름1(self,인수, 인수,...): #메서드1
...
def 메서드이름2(self, 인수, 인수,...): #메서드2
...
클래스의 정의에는 init 이라는 특별한 메서드가 있는데, 클래스를 초기화 하는 방법을 정의한다. 이 초기화용 메서드를 constructor(생성자) 라고도 하며, 클래스의 인스턴스가 만들어질 때 한번만 불린다. 또, 파이썬에는 메서드의 첫 번째 인수로 자신(자신의 인스턴스)을 나타내는 self를 명시적으로 쓰는것이 특징이다. 다음은 class의 예시이다.
class Man:
def __init__(self,name):
self.name = name
print("Initialized!")
def hello(self):
print("Hello " + self.name + " !")
def goodbye(self):
print("Good-bye "+self.name + " !")
m = Man("David") #생성자 호출
m.hello() #메서드 호출
m.goodbye() #메서드 호출
Initialized! Hello David ! Good-bye David !
여기에서는 Man이라는 새로운 클래스를 정의했다. 그리고 Man클래스에서 m이라는 인스턴스(객체)를 생성했다. Man의 생성자(초기화 메서드는) name이라는 인수를 받고, 그 인수로 인스턴스 변수인 self.name을 초기화한다. 인스턴스 변수는 인스턴스별로 저장되는 변수이다. 파이썬에서는 self.name처럼 self 다음에 속성 이름을 써서, 인스턴스 변수를 작성하거나 접근할 수 있다.
1.5 넘파이¶
딥러닝을 구현하다 보면 배열이나 행렬 계산이 많이 등장한다. 넘파이의 배열 클래스인 numpy.array에는 편리한 메서드가 많이 준비되어 있어, 딥러닝을 구현할 때 이 메서드들을 이용한다.
1.5.1 Numpy import¶
넘파이는 외부 라이브러리 이다. 그래서 우선 넘파이 라이브러리를 쓸 수 있도록 가져와야(import)한다.
import numpy as np
1.5.2 넘파이 배열 생성하기¶
넘파이 배열 을 만들 때는 np.array() 메서드를 이용한다. np.array()는 파이썬의 리스트를 인수로 받아 넘파이 라이브러리가 제공하는 특수한 형태의 배열(numpy.ndarray)를 반환한다.
x = np.array([1.0,2.0,3.0]) #list를 인수로 받아 numpy.ndarray를 반환
print("x:",x)
print("type(x):",type(x))
x: [1. 2. 3.] type(x): <class 'numpy.ndarray'>
1.5.3 넘파이의 산술 연산¶
넘파이 배열로 산술 연산을 수행하는 예이다.
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])
넘파이의 N차원 배열¶
넘파이는 1차원 배열(1줄로 늘어선 배열)뿐 아니라 다차원 배열도 작성할 수 있다. 예를 들어 2차원 배열(행렬)은 다음처럼 작성한다.
A = np.array([[1,2],[3,4]])
print(A)
print("A.shape :",A.shape)
print("A.dtye: ",A.dtype)
[[1 2] [3 4]] A.shape : (2, 2) A.dtye: int64
B = np.array([[3,0],[0,6]])
print("A+B :\n",A+B)
print("A*B :\n",A*B)
A+B : [[ 4 2] [ 3 10]] A*B : [[ 3 0] [ 0 24]]
print(A*10)
[[10 20] [30 40]]
1.5.5 브로드캐스트¶
넘파이에서는 형상이 다른 배열끼리도 계산할 수 있다. 앞의 예에서는 2x2 행렬 A에 스칼라 값 10을 곱했다. 이때, 10 이라는 스칼라 값이 2x2 행렬로 확대된 후 연산이 이뤄진다. 이 기능을 브로드캐스트 라고 한다.
A = np.array([[1,2],[3,4]])
B = np.array([10,20])
A*B
array([[10, 40], [30, 80]])
1.5.6 원소접근¶
X = np.array([[51,55],[14,19],[0,4]])
print(X)
[[51 55] [14 19] [ 0 4]]
# 0행 인덱싱
print(X[0])
# (0,1) 위치의 원소
print(X[0][1])
[51 55] 55
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])
X > 15 #조건에 맞는 값은 True, 아닌값은 False, boolean array return
array([ True, True, False, True, False, False])
X[X>15] #boolean array를 이용한 indexing
array([51, 55, 19])
1.6 matplotlib¶
딥러닝 실험에서는 그래프 그리기와 데이터 시각화도 중요하다. matplotlib 은 그래프를 그려주는 라이브러리이다. matplotlib을 사용하면, 그래프 그리기와 데이터 시각화가 쉬워진다.
1.6.1 단순한 그래프 그리기¶
그래프를 그리려면 matplotlib의 pyplot 모듈을 이용한다.
import numpy as np
import matplotlib.pyplot as plt
#데이터 준비
x = np.arange(0,6,0.1) # 0에서 6까지 0.1간격으로 생성
y = np.sin(x) #sin값
plt.title("Sin Graph")
#그래프 그리기
plt.plot(x,y)
plt.show()
1.6.2 pyplot의 기능¶
import numpy as np
import matplotlib.pyplot as plt
#데이터 준비
x = np.arange(0,6,0.1) # 0에서 6까지 0.1간격으로 생성
y1 = np.sin(x)
y2 = np.cos(x)
#그래프 그리기
plt.plot(x,y1, label = 'sin') #sin label을 붙임
plt.plot(x,y2, label = 'cos',linestyle = '--') #cos label을 붙임 linestyle은 점선
plt.xlabel("X") #x축 이름 설정
plt.ylabel("Y") #y축 이름 설정
plt.title("sin & cos") #제목
plt.legend() #범례
plt.show()
1.6.3 이미지 표시하기¶
pyplot에는 이미지를 표시해주는 메서드인 imshow()도 준비되어 있다, 이미지를 읽어들일 때는 matplotlib.image 모듈의 imread()메서드를 이용한다.
import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread("./data/cactus.jpg")
plt.imshow(img) #img 표시하기
plt.show()
'밑바닥부터 시작하는 딥러닝 1' 카테고리의 다른 글
03. 신경망 (0) | 2024.07.24 |
---|---|
02. 퍼셉트론 (0) | 2024.07.11 |