Coursera
[DL Specialization] C4W1A2
andre99
2024. 12. 28. 10:37
The Sequential API
레이어를 직선으로 쌓아서 모델을 구성 (단순한 설계)
Load the Data and Split the Data into Train/Test Sets
Happy House 데이터셋을 활용하여 얼굴 이미지에서 사람의 미소 여부를 판단하는 모델
모델 목표: 웃고 있는 사람만 Happy House에 입장할 수 있도록 웃는 얼굴 분류
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_happy_dataset()
# Normalize image vectors
X_train = X_train_orig/255.
X_test = X_test_orig/255.
# Reshape
Y_train = Y_train_orig.T
Y_test = Y_test_orig.T
number of training examples = 600
number of test examples = 150
X_train shape: (600, 64, 64, 3)
Y_train shape: (600, 1)
X_test shape: (150, 64, 64, 3)
Y_test shape: (150, 1)
happyModel 함수 구현
레이어 구성 및 하이퍼파라미터:
- ZeroPadding2D: 패딩 (3, 3) 사용, 입력 형태 (64, 64, 3)
- Conv2D: 필터 32개, 크기 (7, 7), 스트라이드 (1, 1)
- BatchNormalization: 축(axis) 3
- ReLU: 활성화 함수
- MaxPooling2D: 기본 매개변수 사용
- Flatten: 출력 데이터를 1차원으로 변환
- Dense: 유닛 1개, 활성화 함수 sigmoid
from tensorflow.keras.layers import ZeroPadding2D, Conv2D, BatchNormalization, ReLU, MaxPooling2D, Flatten, Dense
def happyModel():
model = tf.keras.Sequential([
ZeroPadding2D(padding=(3, 3), input_shape=(64, 64, 3)),
Conv2D(32, (7, 7), strides=(1, 1)),
BatchNormalization(axis=3),
ReLU(),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Flatten(),
Dense(1, activation='sigmoid')
])
return model
['ZeroPadding2D', (None, 70, 70, 3), 0, ((3, 3), (3, 3))]
['Conv2D', (None, 64, 64, 32), 4736, 'valid', 'linear', 'GlorotUniform']
['BatchNormalization', (None, 64, 64, 32), 128]
['ReLU', (None, 64, 64, 32), 0]
['MaxPooling2D', (None, 32, 32, 32), 0, (2, 2), (2, 2), 'valid']
['Flatten', (None, 32768), 0]
['Dense', (None, 1), 32769, 'sigmoid']
happy_model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
happy_model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
zero_padding2d (ZeroPadding2 (None, 70, 70, 3) 0
_________________________________________________________________
conv2d (Conv2D) (None, 64, 64, 32) 4736
_________________________________________________________________
batch_normalization (BatchNo (None, 64, 64, 32) 128
_________________________________________________________________
re_lu (ReLU) (None, 64, 64, 32) 0
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 32, 32, 32) 0
_________________________________________________________________
flatten (Flatten) (None, 32768) 0
_________________________________________________________________
dense (Dense) (None, 1) 32769
=================================================================
Total params: 37,633
Trainable params: 37,569
Non-trainable params: 64
_________________________________________________________________
Train and Evaluate the Model
happy_model.fit(X_train, Y_train, epochs=10, batch_size=16)
happy_model.evaluate(X_test, Y_test)
[0.1067291796207428, 0.95333331823349]
The Functional API
레이어를 다양한 방식으로 연결하여 복잡한 설계 가능 (그래프 구조)
Load the SIGNS Dataset & Split the Data into Train/Test Sets
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_signs_dataset()
X_train = X_train_orig/255.
X_test = X_test_orig/255.
Y_train = convert_to_one_hot(Y_train_orig, 6).T
Y_test = convert_to_one_hot(Y_test_orig, 6).T
number of training examples = 1080
number of test examples = 120
X_train shape: (1080, 64, 64, 3)
Y_train shape: (1080, 6)
X_test shape: (120, 64, 64, 3)
Y_test shape: (120, 6)
convolutional_model
def convolutional_model(input_shape):
input_img = tf.keras.Input(shape=input_shape)
Z1 = Conv2D(8, (4, 4), strides=(1, 1), padding='SAME')(input_img)
A1 = ReLU()(Z1)
P1 = MaxPooling2D(pool_size=(8, 8), strides=(8, 8), padding='SAME')(A1)
Z2 = Conv2D(16, (2, 2), strides=(1, 1), padding='SAME')(P1)
A2 = ReLU()(Z2)
P2 = MaxPooling2D(pool_size=(4, 4), strides=(4, 4), padding='SAME')(A2)
F = Flatten()(P2)
outputs = Dense(6, activation='softmax')(F)
model = tf.keras.Model(inputs=input_img, outputs=outputs)
return model
conv_model = convolutional_model((64, 64, 3))
conv_model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
conv_model.summary()
output = [['InputLayer', [(None, 64, 64, 3)], 0],
['Conv2D', (None, 64, 64, 8), 392, 'same', 'linear', 'GlorotUniform'],
['ReLU', (None, 64, 64, 8), 0],
['MaxPooling2D', (None, 8, 8, 8), 0, (8, 8), (8, 8), 'same'],
['Conv2D', (None, 8, 8, 16), 528, 'same', 'linear', 'GlorotUniform'],
['ReLU', (None, 8, 8, 16), 0],
['MaxPooling2D', (None, 2, 2, 16), 0, (4, 4), (4, 4), 'same'],
['Flatten', (None, 64), 0],
['Dense', (None, 6), 390, 'softmax']]
comparator(summary(conv_model), output)
Model: "functional_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 64, 64, 3)] 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 64, 64, 8) 392
_________________________________________________________________
re_lu_1 (ReLU) (None, 64, 64, 8) 0
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 8, 8, 8) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 8, 8, 16) 528
_________________________________________________________________
re_lu_2 (ReLU) (None, 8, 8, 16) 0
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 2, 2, 16) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 64) 0
_________________________________________________________________
dense_1 (Dense) (None, 6) 390
=================================================================
Total params: 1,310
Trainable params: 1,310
Non-trainable params: 0
_________________________________________________________________
Train the Model
train_dataset = tf.data.Dataset.from_tensor_slices((X_train, Y_train)).batch(64)
test_dataset = tf.data.Dataset.from_tensor_slices((X_test, Y_test)).batch(64)
history = conv_model.fit(train_dataset, epochs=100, validation_data=test_dataset)
History Object
df_loss_acc = pd.DataFrame(history.history)
df_loss= df_loss_acc[['loss','val_loss']]
df_loss.rename(columns={'loss':'train','val_loss':'validation'},inplace=True)
df_acc= df_loss_acc[['accuracy','val_accuracy']]
df_acc.rename(columns={'accuracy':'train','val_accuracy':'validation'},inplace=True)
df_loss.plot(title='Model loss',figsize=(12,8)).set(xlabel='Epoch',ylabel='Loss')
df_acc.plot(title='Model Accuracy',figsize=(12,8)).set(xlabel='Epoch',ylabel='Accuracy')
[Text(0, 0.5, 'Accuracy'), Text(0.5, 0, 'Epoch')]
Model Loss
- 에포크가 증가함에 따라 학습 데이터의 손실 값은 꾸준히 감소
- 검증 데이터의 손실 값도 초기에는 감소하다가 에포크가 진행됨에 따라 변화가 줄어듦
- 검증 손실이 학습 손실과 크게 차이 나지 않는다면 모델이 과적합되지 않았음을 나타냄
Model Accuracy
- 학습 데이터의 정확도는 에포크가 증가함에 따라 계속 상승
- 검증 데이터의 정확도는 초기에는 상승하며 학습 효과가 있음 → 일정 에포크 이후에는 더 이상 크게 증가하지 않고 일정한 수준에서 유지됨
- 검증 정확도가 학습 정확도보다 낮다면 모델이 학습 데이터에 과적합될 가능성을 의미함