[밑바닥부터 시작하는 딥러닝] 1장 파이썬

Seongmin Park·2023년 1월 8일
0

밑바닥부터 시작하는 딥러닝 깃허브:https://github.com/WegraLee/deep-learning-from-scratch


클래스

개발자가 직접 클래스를 정의하면 독자적인 자료형을 만들 수 있다. 그리고 클래스만의 전용 함수와 속성을 정의할 수 있다.

  • __init__ 함수
    클래스를 초기화하는 방법을 정의한다.
    생성자라고 불리며, 클래스의 인스턴스가 만들어질 때 한 번만 불린다.
  • 함수의 첫 번째 인수로 자신(자신의 인스턴스)을 나타내는 self를 명시적으로 쓴다.

다음 코드는 간단한 클래스 Man코드이다.

def 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!

인스턴스 변수는 인스턴스별로 저장되는 변수이다. 위 코드에서 self.name처럼 self 다음에 속성 이름을 써서 인스턴스 변수를 작성하거나 접근할 수 있다.

넘파이

넘파이의 배열 클래스는 딥러닝을 구현할 때 필요한 배열과 행열 연산에 편리한 메서드를 많이 제공하기 때문에 사용한다.

import numpy as np # 넘파이 import

x = np.array([1, 2, 3]) # 넘파이 1차원 배열 선언
print(x)
[1 2 3]

넘파이 배열 선언시 np.array() 메서드를 사용하고 파이썬의 리스트를 인수로 받아 특수한 형태의 배열(numpy.ndarray)을 반환한다.

산술 연산

넘파이 배열은 두 배열 x, y의 원소 수가 같다면 산술 연산을 각 원소에 대해서 행한다. 원소 수가 다르면 오류가 발생한다.

x = np.array([1, 2, 3])
y = np.array([2, 4, 6])
x + y  # array([3, 6, 9])
x - y  # array([-1, -2, -3])
x / y  # array([0.5, 0.5, 0.5])
x * y  # array([ 2,  8, 18])

넘파이는 1차원 배열뿐 아니라 다차원 배열도 작성할 수 있다.

A = np.array([[1, 2], [3, 4]])
print(A)
print(A.shape)
print(A.dtype)
[[1 2]
 [3 4]]
(2, 2)
dtype('int64')

행렬의 형상은 shape으로, 행렬의 원소 자료형은 dtype으로 알 수 있다.

브로드캐스트

넘파이에선 형상이 다른 배열끼리 계산이 가능하다.

A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
A * B
array([[ 10, 40],
       [ 30, 80]])

원소 접근

x = np.array([[51, 55], [14, 19], [0, 4]])
X[0] 	# array([51, 55])
X[0][1] # 55

for row in X:
	print(row)
[51 55]
[14 19]
[0 4]

인덱스를 배열로 지정해 한 번에 여러 원소에 접근할 수 있다.

X = X.flatten()			# X를 1차원 배열로 변환(평탄화)
print(X)
X[np.array([0, 2, 4])] 	# 인덱스가 0, 2, 4인 원소 얻기
[51 55 14 19  0  4]
array([51, 14,  0])

matplotlib

matplotlib는 그래프를 그려주는 라이브러리이다.

그래프 그리기

다음 코드는 matplot의 pyplot 모듈을 이용해 sin 함수를 그리는 예이다.

import numpy as np
import matplotlib.pyplot as plt

# 데이터
x = np.arange(0, 6, 0.1) # 0에서 6까지 0.1 간격으로 생성
y = np.sin(x)

# 그래프 그리기
plt.plot(x, y)
plt.show()

다음 이미지는 위 코드의 실행 결과이다.
Figure-1

위 그림에 추가로 cos 함수를 그려보고 제목과 각 축의 이름(레이블) 표시 등을 해본다.

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")
plt.plot(x, y2, linestyle="--", label="cos") # cos 함수는 점선으로 그리기
plt.xlabel("x") # x축 이름
plt.ylabel("y") # y축 이름
plt.title('sin & cos') # 제목
plt.legend()
plt.show()

Figure-2

이미지 표시하기

pyplot에는 이미지를 표시해주는 메서드 imshow()가 있다.

import matplotlib.pyplot as plt
from matplotlib.image import imread

img = imread("./image/images.jpg")

plt.imshow(img)
plt.show()

다음은 실행 결과이다.
Figure-3

profile
공부 정리

0개의 댓글