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

  • 학습 데이터의 정확도는 에포크가 증가함에 따라 계속 상승
  • 검증 데이터의 정확도는 초기에는 상승하며 학습 효과가 있음 → 일정 에포크 이후에는 더 이상 크게 증가하지 않고 일정한 수준에서 유지됨
  • 검증 정확도가 학습 정확도보다 낮다면 모델이 학습 데이터에 과적합될 가능성을 의미함