njs03332 / ml_study

3 stars 0 forks source link

2022/11/09 ~ 2022/12/15 #50

Open njs03332 opened 1 year ago

njs03332 commented 1 year ago
givitallugot commented 1 year ago

10.2.2 시퀀셜 API를 사용하여 이미지 분류기 만들기

모델 컴파일

모델 훈련과 평가

Epoch 1/30 1719/1719 [==============================] - 5s 2ms/step - loss: 0.7237 - accuracy: 0.7644 - val_loss: 0.5207 - val_accuracy: 0.8234 Epoch 2/30 1719/1719 [==============================] - 3s 2ms/step - loss: 0.4843 - accuracy: 0.8318 - val_loss: 0.4345 - val_accuracy: 0.8538 Epoch 3/30 1719/1719 [==============================] - 3s 2ms/step - loss: 0.4393 - accuracy: 0.8455 - val_loss: 0.5310 - val_accuracy: 0.7986 Epoch 4/30 1719/1719 [==============================] - 3s 2ms/step - loss: 0.4126 - accuracy: 0.8566 - val_loss: 0.3918 - val_accuracy: 0.8644 Epoch 5/30 1719/1719 [==============================] - 3s 2ms/step - loss: 0.3940 - accuracy: 0.8621 - val_loss: 0.3753 - val_accuracy: 0.8680 ...


- 만약 불균형적으로 더 많이 등장하는 클래스가 있다면 fit() 메서드 호출 시 class_weight 매개변수 지정
- 만약 샘플별로 가중치를 부여하고 싶다면 sample_weight 매개변수 지정
- fit() 메서드는 에포크가 끝날 때마다 훈련, 검증 세트에 대한 손실과 측정 지표를 담은 딕셔너리 속성 가짐, 이를 사용해서 dataframe 만들고 plot() 메서드를 호출
```python
import pandas as pd

pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 1)
save_fig("keras_learning_curves_plot")
plt.show()
model.evaluate(X_test, y_test)

313/313 [==============================] - 1s 2ms/step - loss: 0.3386 - accuracy: 0.8823
[0.3386382460594177, 0.8823000192642212]
njs03332 commented 1 year ago

10.2.4 함수형 API를 사용해 복잡한 모델 만들기

X_train_A, X_train_B = X_train[:, :5], X_train[:, 2:] X_valid_A, X_valid_B = X_valid[:, :5], X_valid[:, 2:] X_test_A, X_test_B = X_test[:, :5], X_test[:, 2:] X_new_A, X_new_B = X_test_A[:3], X_test_B[:3]

history = model.fit((X_train_A, X_train_B), y_train, epochs=20, validation_data=((X_valid_A, X_valid_B), y_valid)) mse_test = model.evaluate((X_test_A, X_test_B), y_test) y_pred = model.predict((X_new_A, X_new_B))

- 여러 개의 출력을 사용
  - 여러 개의 출력이 필요한 경우
    - 여러 출력이 필요한 작업인 경우: 예) 그림에 있는 주요 물체를 분류 (분류 작업) 하고 위치를 알아야 (회귀 작업) 할 때
    - 동일한 데이터에서 독립적인 여러 작업을 수행하는 경우: 작업마다 하나의 출력을 가진 단일 신경망을 훈련하는 것이 작업마다 새로운 신경망을 훈련하는 것보다 보통 더 나은 결과 (여러 작업에 걸쳐 유용한 특성을 학습할 수 있음)
      - 예) 얼굴 사진으로 다중 작업 분류 (multitask classification) - 얼굴 표정 & 안경을 썼는지
    - 규제 기법으로 사용하는 경우: 예) 신경망 구조 안에 보조 출력을 추가하여, 하위 네트워크가 나머지 네트워크에 의존하지 않고 그 자체로 유용한 것을 학습하는지 확인
<img width="566" alt="스크린샷 2022-11-16 오후 9 58 18" src="https://user-images.githubusercontent.com/37107740/202186760-b3022862-0c00-4ff5-b7fb-57f70019e361.png">

```python
output =keras.layers.Dense(1, name='main_ouput')(concat)
aux_output = keras.layers.Dense(1, name='aux_output')(hidden2)
model = keras.Model(inputs=[input_A, input_B], outputs=[output, aux_output])
danbi5228 commented 1 year ago

10.2.2 시퀀셜 API를 사용하여 이미지 분류기 만들기

모델을 사용해 예측을 만들기

실제 새로운 샘플이 없으므로 테스트 세트 샘플 사용

X_new = X_test[:3] y_proba = model.predict(X_new) y_proba.round(2) # array([[0, 0, 0, 0, 0, 0.03, ...], [0, 0, 0.98, 0.02, 0, ...], [0, 1, 0, ...]])

; 3개 샘플의 9개 클래스에 대한 확률값

가장 높은 확률을 가지는 클래스에만 관심이 있다면 predict_classes() 메서드 사용

y_pred = model.predict_classes(X_new) y_pred # array([9, 2, 1]) np.array(class_names)[y_pred] # array(['Ankle boot', 'Pullover', 'Trouser'])

- p.382; 올바르게 분류된 패션이미지 확인

## 10.2.3 시퀀셜 API를 사용하여 회귀용 다층 퍼셉트론 만들기
- 캘리포니아 주택 가격 데이터셋으로 바꾸어 회귀 신경망으로 해결해보기

```python
from sklearn.datasets import fetch_california_housing
from sklean.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 데이터 적재
housing  = fetch_california_housing()

# 훈련/검증/테스트 세트로 데이터 나누기
X_train_full, X_test, y_train_full, y_test = train_test_split(
    hosing.data, housing.target)
X_train, X_valid, y_train, y_valid = train_test_split(
    X_train_full, y_train_full)

# StandardScaler ; 각 특성의 평균값을 빼고 분산을 1로 만드는 형태의 표준화기법
scaler = StandardScaler()
X_train = scaler.fit_trainsform(X_train)
X_valid = scaler.transform(X_valid)
X_test = scaler.transform(X_test)

# 이전 장과 동일하게 회귀용 MLP 구축
# 이전 장과 달리 데이터에 잡음이 많기 때문에 과대적합을 막고자 뉴런 수가 적은 은닉층 하나만 사용
model = keras.models.Squential([
    keras.layers.Dense(30, activation="relu", input_shape=X_train.shape[1:]),
    keras.layers.Dense(1)
])
model.compile(loss="mean_squared_error", optimizer="sgd") # 손실함수와 옵티마이저 지정
history = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid) # 각 출력 레이블 확인
mse_test = model.evaluate(X_test, y_test) # 모델 평가; 손실 확인

# 새로운 샘플이 없으므로 테스트셋 샘플 사용해서 예측 결과 확인
X_new = X_test[:3]
y_pred = model.predict(X_new)