본문 바로가기
ML & DL/tensorflow

Cat Classification (2) : L-layers Neural Network

by 별준 2020. 11. 15.

2020/11/15 - [ML & DL/tensorflow] - Cat Classification (1) : simple neural network

 

Cat Classification (1) : simple neural network

이번에는 Courser Deep learning 특화과정 첫번째강의 2주차 수업에서 실습했던, cat classification을 구현해보도록 하겠습니다. 2020/09/24 - [Coursera 강의/Deep Learning] - [실습] Logistic Regression with..

junstar92.tistory.com

위 글에 이어서 이번에는 L개의 layer를 가지는 Neural Network를 설계해보도록 하겠습니다. 

구현은 tf.keras를 통해서 할 예정인데, 비교를 위해서 단순 NN을 keras로 구현해서 결과를 얻어보겠습니다. 

사용된 dataset과 random seed는 이전글과 동일합니다.

 

1. Simple NN

# simple neural network
one_layer_model = tf.keras.models.Sequential([
    tf.keras.layers.Input(shape=(12288,)),
    tf.keras.layers.Dense(1, activation='sigmoid', kernel_initializer=initializer)
])

one_layer_model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.005),
                       loss='binary_crossentropy',
                       metrics=['accuracy'])
                       
hist = one_layer_model.fit(train_x, train_y, epochs=2000, verbose=0)
print(f'After training, loss: {hist.history["loss"][-1]} - accuracy: {hist.history["accuracy"][-1]}')
one_layer_model.evaluate(test_x, test_y)

training set에서 100%의 정확도와, test set에서 70%의 정확도를 얻었습니다. 이전글과 동일하게 training set에 overfitting되어 있다는 것을 확인할 수 있습니다.

 

2. L-layers NN

L개의 layer를 갖는 NN을 구현해보도록 할 것인데, 매번 구현할 수 없으므로 재사용이 가능한 함수 형태로 구현해보도록 하겠습니다. 다음과 같은 NN을 구현하게 됩니다.

def Model(layers_dims, learning_rate=0.0075):
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Input(shape=(layers_dims[0],)))
    
    n_layer = len(layers_dims)
    for i in range(1, n_layer):
        if i != n_layer-1:
            model.add(tf.keras.layers.Dense(
                layers_dims[i], activation='relu', kernel_initializer=initializer
            ))
        else:
            model.add(tf.keras.layers.Dense(
                layers_dims[i], activation='sigmoid', kernel_initializer=initializer
            ))
    
    model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate),
                 loss='binary_crossentropy',
                 metrics=['accuracy'])
    
    return model

각 layer의 activation unit 수는 layers_dims를 통해서 받아오고, 마지막 output layer를 제외하고 모든 layer의 activation function은 relu입니다.

 

a. 2 layers NN

two_layer_model = Model(layers_dims=(12288, 7, 1))
two_layer_model.summary()

입력이 12288, hidden layer의 unit이 7, output이 1인 2개의 layer를 가진 NN입니다.(layer의 수, depth를 이야기할 때 보통 input layer는 포함하지 않습니다.) 이렇게 생성된 model을 summary를 통해 확인해보면 다음과 같습니다.

학습을 해보면, 

hist_2_layer=two_layer_model.fit(train_x, train_y, epochs=1500, verbose=0)
print(f'After training, loss: {hist_2_layer.history["loss"][-1]} - accuracy: {hist_2_layer.history["accuracy"][-1]}')
two_layer_model.evaluate(test_x, test_y)

training set에서의 정확도는 100%, test set에서의 정확도는 약간 증가한 72%입니다. 여전히 training set에 overfitting되어 있는 것을 볼 수 있습니다.

 

cost 그래프

# plot the cost

plt.plot(np.squeeze(hist_2_layer.history['loss']))
plt.ylabel('cost')
plt.xlabel('iterations')
plt.title("Learning rate =" + str(0.0075))
plt.show()

 

 

b. 4-layers NN

이번에는 4개의 layer를 갖는 NN을 생성해보겠습니다.

layers_dims = [12288, 20, 7, 5, 1] #  4-layer model
four_layer_model = Model(layers_dims)
four_layer_model.summary()

학습을 하면,

hist_4_layer=four_layer_model.fit(train_x, train_y, epochs=2500, verbose=0)
print(f'After training, loss: {hist_4_layer.history["loss"][-1]} - accuracy: {hist_4_layer.history["accuracy"][-1]}')
four_layer_model.evaluate(test_x, test_y)

딱히 결과가 좋아지지는 않았습니다. 동일하게 100%의 training acc와 72%의 test acc를 얻었고, 여전히 overfitting하고 있는 것으로 보입니다. coursera 실습에서는 80%가 나왔었는데, 조금 다른 결과가 나왔습니다.

 

학습횟수나, learning_rate를 변경해가면서 시도해보았지만, 최대 74%까지의 정확도를 얻었습니다.. 

파라미터 초기화의 차이거나.. 텐서플로우에서 training set의학습이 더 잘 되어서 거의 모든 모델에서 overfitting이 일어나는 것이 아닌가.. 추측해봅니다.. 

 

직접 구현은 아래 이전 게시글에서 확인하시면 됩니다 !

2020/09/26 - [Coursera 강의/Deep Learning] - [실습] Deep Neural Network for Image Classification(cat vs non-cat)

 

[실습] Deep Neural Network for Image Classification(cat vs non-cat)

해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 첫 번째 강의 Neural Networks and Deep Learning을 듣고 정리한 내용입니다. (Week 4) 4주차 두 번째 실습은 이전 실습에서 구현한 NN..

junstar92.tistory.com

 

댓글