티스토리 뷰

반응형

데이터를 확인하는 건 도메인 지식을 위해서이다.

비즈니스 인사이트와 이해를 얻기 위함.

 

7차 미프떄 MLops, data pipeline를 배운다.

 

딥러닝의 성능이 대체로 좋은 곳 -> 시각, 언어, big data, 시계열

 

 

[참조] 가중치 업데이트

Gradient : 기울기(벡터)

Gradient Decent(경사 하강법, optimizer의 기본)

w의 초기값이 지정 : w0

초기값에서의 기울기(방향)을 확인한다. df(w)/dw, w= w0

기울기가 -면 x는 + 방향

기울기가 +면 x는 -방향

 

learning rate로 조금 조정한다.

df(w)/dw * learning rate

 

Wnew = w0 - 편미분(f(w)) x learning rate

 

Wnew는 업데이트 해갈수록 최적화에 가까워진다.

기울기 소실 vanishing gradient

이런 Wnew의 그래프 따라가는 걸 활성화 함수의 미분 그래프를 따라가는데, 이것은sigmoid함수에서는 미분을 거듭할수록 기울기가 0으로 가까워진다.

 

해결하기 위한 노력

ReLU를 쓴다.

Leaky,ReLU, PReLU, ELU

 

가중치 초기화 기법

배치 정규화

Residual Connections 등

 

Local Minima problem

만약 골짜기가 2개가 있다면, initial point 때문에 최적화가 안될 수 있다.

그래서 이걸 고려해서 찾을 수 있게 만든 게 최종적으로 Adam이라는 옵티마이저다.

요즘에는 고려를 많이 안 하는 추세이다.

 

 

복습

이미지에 대한 다중분류 딥러닝

# 케라스 데이터셋으로 부터 mnist 불러오기
(x_train, y_train), (x_val, y_val) = mnist.load_data()

class_names = ['0','1','2','3','4','5','6','7','8','9']

 

데이터를 살펴본다.

# 아래 숫자를 바꿔가며 화면에 그려 봅시다.
n = 20

plt.figure()
plt.imshow(x_train[n], cmap=plt.cm.binary)
plt.colorbar()
plt.show()

np.set_printoptions(threshold=np.inf, linewidth=np.inf)
x_train[n]

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(x_train[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[y_train[i]])
plt.tight_layout()
plt.show()

 

이미지 [ [1,2,3],[4,5,6],[7,8,9]]를 [1,2,3,4,5,6,7,8,9]로 만든다.

이게 flatten이다.

x_train = x_train.reshape(60000, -1)
x_val = x_val.reshape(10000, -1)

x_train.shape, x_val.shape
(60000, 28, 28), (10000, 28, 28))

((60000, 784), (10000, 784))

 

60000,28,28을 행의 수는 6만개, 열은 784로 된다.

 

스케일링

min이 0이기 때문에, 스케일링은 그냥 255로 나누면 된다.

x_train = x_train / 255.
x_test = x_val / 255.

 

그럼 nfeature가 784개인 정형 데이터와 똑같이 된다.

nfeatures = x_train.shape[1]
nfeatures
>784

 

10개로 분류해야 하니, sparse를 쓴다.

clear_session()

model = Sequential(Dense(10, input_shape = (nfeatures,), activation = 'softmax'))

model.summary()

model.compile(optimizer=Adam(learning_rate=0.001), loss= 'sparse_categorical_crossentropy' )

history = model.fit(x_train, y_train, epochs = 20, validation_split=0.2).history

 

argmax가 한 행당 10개가 나온다.

pred = model.predict(x_test)
pred_1 = pred.argmax(axis=1)

print(confusion_matrix(y_val, pred_1))
print(classification_report(y_val, pred_1))

 

[참조] y를 one-hot encoding 하여 모델링

from keras.utils import to_categorical

y_c = to_categorical(y.values, 3)

y의 값들에 대해서 클래스 3개로 담아낸다.

 

[1,0,0] 와 같은 형태가 된다.

x_train, x_val, y_train, y_val = train_test_split(x, y_c, test_size = .3, random_state = 2022)
y_train.shape
> (105,3)

 

그 후에는 x_train을 또 따로 스케일링 해준다.

scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_val = scaler.transform(x_val)

 

만약 원 핫 인코딩했다면 categorical로 쓴다.

model.compile(optimizer=Adam(learning_rate=0.1), loss='categorical_crossentropy')

 

이렇게 하면 예측 결과 자체가 softmax로 변환된 값이 된다.

그래서 argmax만 하면 된다.

그런데 y_val도 바뀌었으므로, y_val도 돌려놓아야 한다.

pred = model.predict(x_val)
pred_1 = pred.argmax(axis=1)
pred_1

y_val_1 = y_val.argmax(axis=1)
y_val_1

print(confusion_matrix(y_val_1, pred_1))
print(classification_report(y_val_1, pred_1))

 

반응형