-
keras-5 boston딥러닝/keras 2023. 5. 29. 13:05
1. python
from keras.datasets import boston_housing (train_data, train_labels),(test_data, test_labels) = boston_housing.load_data()
보스턴 집값데이터셋을 불로오고 데이터를 구분한다.
print(train_data.shape) print(test_data.shape) (404, 13) (102, 13)
데이터의 모양을 확인하면 13개의 특성을 가지고 있다. 개수가 404개, 102개로 작은 편이다.
print(train_data[0]) [ 1.23247 0. 8.14 0. 0.538 6.142 91.7 3.9769 4. 307. 21. 396.9 18.72 ]
데이터의 값이 들쑥날쑥하기 때문에 정규화가 필요하다.
mean = train_data.mean(axis=0) train_data -= mean std = train_data.std(axis=0) train_data /= std train_data[0] array([-0.27224633, -0.48361547, -0.43576161, -0.25683275, -0.1652266 , -0.1764426 , 0.81306188, 0.1166983 , -0.62624905, -0.59517003, 1.14850044, 0.44807713, 0.8252202 ])
평균을 빼고 표준 편차로 나누어주는 스탠다드 스케일링을 진행하여 평균을 0 편차를 1로 만들어준다.
from keras import models from keras import layers def build_model(): model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape=(train_data.shape[1],))) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(1)) model.compile(optimizer='rmsprop', loss='mse', metrics=['mse']) return model
샘플 수가 적기 때문에 64개의 유닛을 가진 은닉 층으로 구성한다. 마지막 층은 활성화함수가 없다. 일반적으로 회귀 문제의 출력층은 활성화 함수를 구성하지 않는다.
회귀모델에 사용하는 mse 손실 함수를 사용한다.
import numpy as np k = 4 num_val_samples = len(train_data) // k all_scores = [] for i in range(k): print('처리중인 폴드 #', i) val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples] val_labels = train_labels[i * num_val_samples: (i + 1) * num_val_samples] data1 = train_data[:i * num_val_samples] data2 = train_data[(i+1) * num_val_samples :] data1_labels = train_labels[:i * num_val_samples] data2_labels = train_labels[(i+1) * num_val_samples :] partial_train_data = np.concatenate([data1, data2], axis=0) partial_train_labels = np.concatenate([data1_labels, data2_labels], axis=0) model = build_model() model.summary() model.fit(partial_train_data, partial_train_labels, epochs=500, batch_size=128, verbose=0) val_mse, val_mae = model.evaluate(val_data, val_labels) print(val_mse, val_mae) all_scores.append(val_mae) 처리중인 폴드 # 0 Model: "sequential_10" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_26 (Dense) (None, 64) 896 dense_27 (Dense) (None, 64) 4160 dense_28 (Dense) (None, 1) 65 ================================================================= Total params: 5,121 Trainable params: 5,121 Non-trainable params: 0 _________________________________________________________________ 4/4 [==============================] - 0s 4ms/step - loss: 7.5154 - mse: 7.5154 7.515351295471191 7.515351295471191 처리중인 폴드 # 1 Model: "sequential_11" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_29 (Dense) (None, 64) 896 dense_30 (Dense) (None, 64) 4160 dense_31 (Dense) (None, 1) 65 ================================================================= Total params: 5,121 Trainable params: 5,121 Non-trainable params: 0 _________________________________________________________________ 4/4 [==============================] - 0s 4ms/step - loss: 9.7709 - mse: 9.7709 9.770906448364258 9.770906448364258 처리중인 폴드 # 2 Model: "sequential_12" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_32 (Dense) (None, 64) 896 dense_33 (Dense) (None, 64) 4160 dense_34 (Dense) (None, 1) 65 ================================================================= Total params: 5,121 Trainable params: 5,121 Non-trainable params: 0 _________________________________________________________________ 4/4 [==============================] - 0s 4ms/step - loss: 13.4938 - mse: 13.4938 13.493786811828613 13.493786811828613 처리중인 폴드 # 3 Model: "sequential_13" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_35 (Dense) (None, 64) 896 dense_36 (Dense) (None, 64) 4160 dense_37 (Dense) (None, 1) 65 ================================================================= Total params: 5,121 Trainable params: 5,121 Non-trainable params: 0 _________________________________________________________________ 4/4 [==============================] - 0s 4ms/step - loss: 11.1166 - mse: 11.1166 11.116632461547852 11.116632461547852
일반적으로 샘플의 개수가 적을 때 k-fold 검증을 사용한다. k-fold 검정은 훈련데이터를 검증데이터로 바꿔가며 검증하기 때문에 가지고 있는 샘플 수보다 많은 검증을 진행할 수 있다.
np.mean(all_scores) 11.951074600219727
손실함수의 평균 값은 11.9로 12000달러의 오차를 보인다.
'딥러닝 > keras' 카테고리의 다른 글
keras-6 cnn (0) 2023.05.29 keras-3 reuter (0) 2023.05.29 keras-2 imdb (0) 2023.05.23 keras-1 mnist (0) 2023.05.23