티스토리 뷰
데이터를 확인하는 건 도메인 지식을 위해서이다.
비즈니스 인사이트와 이해를 얻기 위함.
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))