Open njs03332 opened 2 years ago
model.compile(loss="sparse_categorical_crossentropy",
optimizer="sgd",
metrics=["accuracy"])
history = model.fit(X_train, y_train, epochs=30,
validation_data=(X_valid, y_valid))
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]
wide & deep 신경망 - 순차적이지 않은 신경망의 예
예시 코드
input_ = keras.layers.Input(shape=X_train.shape[1:])
hidden1 = keras.layers.Dense(30, activation="relu")(input_)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.models.Model(inputs=[input_], outputs=[output])
여러 입력을 사용
일부 특성은 짧은 경로로 전달하고 다른 특성들은 깊은 경로로 전달하고 싶은 경우 사용할 수 있음
input_A = keras.layers.Input(shape=[5], name="wide_input")
input_B = keras.layers.Input(shape=[6], name="deep_input")
hidden1 = keras.layers.Dense(30, activation="relu")(input_B)
hidden2 = keras.layers.Dense(30, activation="relu")(hidden1)
concat = keras.layers.concatenate([input_A, hidden2])
output = keras.layers.Dense(1, name="output")(concat)
model = keras.models.Model(inputs=[input_A, input_B], outputs=[output])
fit() 메서드 호출시 입력마다 하나씩 행렬의 튜플 (X_train_A, X_train_B)을 전달해야 함 (X_valid, X_test, X_new에서도 마찬가지)
model.compile(loss="mse", optimizer=keras.optimizers.SGD(lr=1e-3))
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])
model.compile(loss=['mse', 'mse'], loss_weights=[0.9, 0.1], optimizer='sgd')
history = model.fit([X_train_A, X_train_B], [y_train, y_train], epochs=20,
validation_data=([X_valid_A, X_valid_B], [y_valid, y_valid]))
total_loss, main_loss, aux_loss = model.evaluate([X_test_A, X_test_B], [y_test, y_test])
y_pred_main, y_pred_aux = model.predict([X_new_A, X_new_B])
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, ...]])
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)