2020/11/15 - [ML & DL/tensorflow] - Cat Classification (1) : simple neural network
위 글에 이어서 이번에는 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이 일어나는 것이 아닌가.. 추측해봅니다..
직접 구현은 아래 이전 게시글에서 확인하시면 됩니다 !
'ML & DL > tensorflow' 카테고리의 다른 글
Regularization 적용에 따른 학습 비교 (0) | 2020.11.16 |
---|---|
Initialization에 따른 학습 비교 (0) | 2020.11.15 |
Cat Classification (1) : simple neural network (0) | 2020.11.15 |
tensorflow에서 random seed 설정 (1) | 2020.11.14 |
Logistic Regression with 1 hidden layer(planar data classification) (0) | 2020.11.13 |
댓글