카테고리 없음

ML/DL - Code CheatSheet

dongsunseng 2023. 7. 22. 23:12

Numpy

1. __version__ : 버전 확인

import numpy as np
print(np.__version__)

 

2. array() : 배열 만들기

my_arr = np.array([10, 20, 30], [40, 50, 60])

결과값: [[10, 20, 30], [40, 50, 60]]

 

3. sum() : 배열의 각 요소를 모두 더한 값을 반환하기

넘파이 배열은 + 와 * 을 배열의 각 요소를 더하고 곱하는 작업이 가능하다. 

a = np.array([1, 2, 3])
b = np.array([3, 4, 5])
print(a + b) #결과값: array([4, 6, 8])
print(a * b) #결과값: array([3, 8, 15])

np.sum() 함수에 a * b를 전달하면 넘파이 배열의 각 요소를 모두 더한 값을 반환할 수 있다.

np.sum(a * b) #결과값: 26 (3 + 8 + 15)

 

4. unique() : 고유한 값을 찾아 반환하기

np.unique(target_data, return_counts=True)

결과 값: (array([0, 1]), array([212, 357]))

 

return_counts=True : 고유한 값이 등장하는 횟수까지 세어서 반환

--> array([0, 1]) : target_data에 들어있는 고유한 값. 즉, 해당 데이터에는 0과 1 값만 들어있음.

--> array([212, 357]): 고유한 값의 개수. 즉, 212개의 0 값과 357개의 1 값이 들어있음.

 

5. random.randn() : 표준 정규 분포를 따르는 난수 만들기

x = np.random.randn(1000)
y = np.random.randn(1000)
plt.scatter(x, y)
plt.show()

표준 정규 분포를 따르는 난수 1000개를 만들어서 산점도 그려보기

 

6. ones(), zeros(), full() : 입력된 매개변수와 동일한 크기의 배열을 만들고 모두 특정 값으로 채움

--> ones() 는 1로, zeros()는 0으로, full()은 인자 값으로 채움.

--> 매개변수로 하나의 배열을 넣어줘서 이 배열과 같은 크기의 배열을 만들어도 되지만 아래 예시처럼 크기를 튜플 형식으로 전달해도 된다.

np.ones(data) #data와 같은 크기의 배열을 만들고 그 값들을 모두 1로 채움

np.zeros((2, 3)) #결과 값: array([[0., 0., 0.], [0., 0., 0.]])

np.full((2, 3), 7) #결과 값: array([[7, 7, 7], [7, 7, 7]])

 

7. exp() : 자연 상수(e)의 지수 함수를 계산

def activation(self, z):
	a = 1 / (1 + np.exp(-z))
    return a

시그모이드 함수를 계산하는 함수를 만든 것이다.

 

8. clip() : array 내의 요소들에 대해서 min으로 지정한 값보다 작으면 min 값으로 바꿔주고 max도 마찬가지.

z = np.clip(z, -100, None)

위의 예시에서는 z의 각 요소들에 대해서 -100 보다 작으면 -100으로 바꿔주고 max 값이 들어가야 할 자리에는 None이 들어갔으므로 max에 대한 작업은 수행하지 않는다.

 

9. mean() : numpy 배열의 평균 구하기

np.mean(arr, axis=1)

arr : 넘파이 배열이 들어감

axis(optional) : 평균이 계산되는 축 - 0은 열을 따라 계산, 1은 행을 따라 계산, 디폴트로 axis의 값이 없다면 1차원 배열을 계산하는 경우이다.

 

10. random.permutation() : randomly permute a sequence or return a permuted range

np.random.permutation(10) #랜덤 결과: array([1, 7, 4, 3, 0, 9, 2, 5, 8, 6]) 
np.random.permutation([1, 4, 9, 16, 25]) #랜덤 결과: array([25, 9, 4, 1, 16])

integer를 인수로 받으면 0부터 그 숫자까지의 값들을 랜덤하게 섞은 배열을 반환하고 인수로 배열을 넣으면 그 배열의 값들을 섞고 반환한다.

 

11. np.arange() : Python range 함수와 유사함

np.arange(5) #결과: array([0, 1, 2, 3, 4, 5])

Python의 range 함수와의 차이점은 

  1. np.arange 함수는 실수의 값들이 있는 배열의 값들도 섞어서 반환하지만 range 함수는 정수만 지원한다.
  2. np.arange는 당연히 numpy 배열을 반환하므로 넘파이에서 지원하는 연산이 가능하지만 range는 불가능하다. 예를 들어, 넘파이는np.arange(10) * 3 와 같은 연산이 가능할 수 있게 지원한다. 

12. sign() : 배열 안 요소들의 부호를 반환하기

np.sign([-5., 4.5]) #returns array([-1., 1.])

 

13. dot() : 행렬 곱셈 수행하기

x = [x1, x2, x3]
w = [w1, w2, w3]

np.dot(x, w) #결과 값: x1 * w1 + x2 * w2 + x3 * w3

14. random.normal() : 정규 분포를 만드는 무작위 수(배열) 만들기

np.random.normal(0, 1, (n_features, self.units))

매개변수는 순서대로 평균, 표준 편차, 만들고 싶은 배열의 크기

 

15. random.seed() : 무작위수 초깃값 고정(결과 동일하게 만들기 위해서 사용)

np.random.seed(1234)

16. argmax() : 배열의 가장 큰 값의 인덱스를 반환하기

np.argmax(z, axis=1)

 

17. bincount() : 넘파이 배열에 들어있는 정수값의 등장 횟수를 세어 정수값에 해당하는 인덱스 위치에 저장하기

np.bincount(y_train_all)
#결과 값: array([6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000])

 

18. flip() : 넘파이 배열 뒤집기

w_r = np.flip(w)
#파이썬 슬라이스 연산자를 이용해도 됨
w_r = w[::-1]

 

19. reshape() : 배열의 차원 변환하기

x_4d = x.reshape(1, 3, 3, 1)

위의 코드는 x 배열을 4차원 배열로 바꿔준다. 

 

20. astype() : 자료형 바꾸기

x = x.astype(np.float)

위의 코드는 x 라는 배열의 각 원소들의 자료형을 실수로 바꾼 것이다.

 

21. numpy() : 넘파이 배열로 변환하기

c.numpy()

c 가 텐서라면 위와 같은 코드를 통해서 넘파이 배열로 변환할 수 있다 (텐서플로에서는 다차원 배열을 텐서라고 부름). 

 

22. 

 

SciPy

1. convolve() : 합성곱 계산하기

from scipy.signal import convolve
convole(x, m, mode='valid')

 

2. correlate() : 교차 상관 계산하기

from scipy.signal import correlate
correlate(x, w, mode='valid')

 

3. correlate2d() : 2차원 배열의 합성곱 계산하기

x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
w = np.array([[2, 0], [0, 0]])

from scipy.signal import correlate2d
correlate2d(x, w, mode='valid')
#결과 값: array([2, 4], [8, 10])

 

4. 

 

Matplotlib

1. import

import matplotlib.pyplot as plt

 

2. show() : 화면에 그래프 출력

plt.show()

 

3. plot() : 선그래프 그리기

plt.plot([1, 2, 3, 4, 5], [1, 4, 9, 16, 25])
plt.show()

 

4. scatter() : 산점도(scatter plot) 그리기

plt.scatter([1, 2, 3, 4, 5], [1, 4, 9, 16, 25])
plt.show()

scatter() 함수의 첫 번째 argument(인자)로는 x축 값(입력 데이터), 두 번째 인자로는 y축 값(타깃 데이터)를 넣어준다.

 

5. xlabel(), ylabel() : 라벨 이름 표시하기

plt.xlabel('x')
plt.ylabel('y')

 

6. boxplot() : 박스 플롯 그리기

plt.boxplot(data)
plt.show()

입력 데이터를 그대로 boxplot() 함수에 넣는다면 Matplotlib은 x축을 feature(특성), y축을 value(값)으로 두고 박스플롯을 그린다.

 

7. ylim() : y축 값의 범위를 get 하거나 지정함

bottom, top = ylim()  # return the current ylim
ylim((bottom, top))   # set the ylim to bottom, top
ylim(bottom, top)     # set the ylim to bottom, top

 

8. legend() : 각 축을 설명하는 legend를 그래프에 넣음

plt.legend(['train_loss', 'val_loss'])

 

9. imshow() : 이미지 확인하기

plt.imshow(x_train_all[0], cmap='gray')
plt.show()

넘파이 배열을 입력 받아서 이미지를 그려줌

 

10. hist() : 히스토그램 그리기

housing.hist(bins=50, figsize(20, 15))
plt.show()

 

11. 

Pandas

1. info() : 데이터에 대한 간략한 설명, 전체 행의 개수, 각 feature의 data type과 null이 아닌 값의 개수 등의 정보 반환

2. value_counts() : 카테고리 설명, 각 카테고리 별 데이터 수 반환

3. describe() : 숫자형 특성의 요약 정보 반환

4. 

Scikit-learn

1. train_test_split() : 훈련 데이터와 검증 데이터로 나누기(default로는 총 데이터를 훈련 세트 75%와 테스트 세트 25%의 비율로 나눔)

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(input_data, target_data, stratify=target_data, test_size=0.2, random_state=42)

stratify=target_data : 데이터를 나눌 때 비율을 동일하게 만듦. 기본적으로 데이터를 나누기 전에 자체적으로 섞지만 일부 세트간의 비율이 불균형한 경우에 이렇게 지정해주면 비율을 유지시켜줌. 

test_size=0.2 : 세트를 나눌 때의 비율을 지정해줌. 테스트 사이즈를 0.2로 지정해주면 총 훈련 데이터 세트를 훈련:테스트 = 8:2 비율로 나눠줌.

random_state=42 : 실전에서는 쓸 일이 없는 매개변수임. train_test_split 함수는 데이터를 무작위로 섞은 다음 세트를 나눠주는데 섞은 다음의 결과가 항상 일정하도록 난수의 초기값을 42로 설정해주는 것이다. 이렇게 설정해주면 항상 결과가 일정함.

 

2. 

 

Tensorflow

1. to_categorical() : 원-핫 인코딩하기 (문자열로 되어있으면 인코딩하지 못함)

tf.keras.utils.to_categorical([0, 1, 3])
# 결과 값: array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 0., 1.]])

 

2. conv2d() : 2차원 합성곱 계산하기

 

3. max_pool2d() : 최대 풀링 수행하기

x = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9. 10, 11, 12], [13, 14, 15, 16]])
x = x.reshape(1, 4, 4, 1)

p_out = tf.nn.max_pool2d(x, ksize=2, strides=2, padding='VALID')
p_out.numpy().reshape(2, 2)
#결과 값: array([[6, 8], [14, 16]])

ksize : 풀링의 크기

strides : 스트라이드의 크기

 

4. avg_pool2d() : 평균 풀링 수행하기

 

5. relu() : 렐루 함수 사용하기

x = np.array([-1, 2, -3, 4])

r_out = tf.nn.relu(x)
r_out.numpy()
#결과 값: array([0, 2, 0, 4])

텐서플로의 렐루 함수는 Tensor 객체를 반환하기 때문에 화면에 출력하고 싶다면 넘파이로 변환해줘야 한다.

 

6. matmul() : np.dot()이랑 유사함

z1 = tf.matmul(f_out, self.w1) + self.b1

 

7. 자동미분

x = tf.Variable(np.array([1.0, 2.0, 3.0]))

with tf.GradientTape() as tape:
	y = x ** 3 + 2 * x + 5

print(tape.gradient(y, x))
#결과 값: tf.Tensor([5. 14. 29.], shape=(3,), dtype=float64)
  • with block으로 tf.GradientType() 객체가 감시할 코드를 감싼다.
  • tape 객체는 with block 안에서 일어나는 모든 연산을 기록하고 텐서플로 변수인 tf.Variable 객체를 자동으로 추적한다. 
  • 그레디언트를 계산하려면 미분 대상 객체와 변수를 tape 객체의 gradient() method에 전달해야 한다. 

8. glorot_uniform() : 글로럿(Glorot) 초기화 사용하기 

 

 

ETC.

1. type() : 객체의 타입 확인

 

2. data[:, 2] (Python syntax)

  • In python, the syntax [:, 2] is used to access elements from a two-dimensional array or list.
  • It is known as slicing, which allows us to extract specific portions of an iterable object like lists, tuples, or arrays.
  • The ':' before the comma indicates that we want to include all the elements along the first dimension of the object.
  • In other words, it selects all the rows of the two-dimensional array.
  • The number '2' after the comma represents the index of the column we want to extract.
  • In python, indexing starts at 0, so '2' refers to the third column.

3. len(넘파이 배열) : len() 함수에 넘파이 배열을 넣으면 행 크기를 반환함

4. 

 

 

 

일단 이 분야는 관련 라이브러리 활용 능력이 중요하다고 느껴졌고, 웹/앱 개발과는 다르게 함수명을 어느정도 알고 있어야 하고 그 문법이 생소했기 때문에 CheatSheet을 만들기로 결정했다. 영어와 한국어가 중구난방으로 쓰이는 느낌이 들 수 있지만 필자는 미국 소재 대학에서 코딩을 배웠기 때문에 영어로 표기하는 것이 더 편하다. 최대한 알아보기 쉽게 작성해보도록 하겠다.

Last Update: 2023.07.22

 

 

 

좌절을 경험한 사람은 자신만의 역사를 갖게 된다.
- 쇼펜하우어의 <희망에 대하여> 중에서 -