본문 바로가기
DeepLearning Framework & Coding/Tensorflow 2.X

[코드로 이해하는 딥러닝 2-7] - Deep and Wide Neural Network(DWNN)

by 노마드공학자 2021. 1. 11.

※ Tensorflow1문법을 2로만 바꾸는것이기에, 코드분석 위주로 진행하고있습니다.

[Tensorflow1 링크종합] https://limitsinx.tistory.com/50

 

 

※ 이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다.

코드만 해석하고 넘어가기에 다소 불친절한 글 일수 있습니다..

   개념적인 부분은 하기 링크에 따로 정리해두어, 참조 부탁드립니다.

https://limitsinx.tistory.com/38

 

[코드로 이해하는 딥러닝 11] - Deep Neural Network/XOR

[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27 [코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28 [코드로 이해하는 딥러닝 2] - Tensorflow 변..

limitsinx.tistory.com

 

이 전글에서는, input/output layer만 구분하여, 원하는대로 세팅을 해보았는데요

 

이번에는 hidden layer도 여러개 추가하고, 노드의 갯수도 마음대로 늘려보는 식으로 코드를 짜보겠습니다.

 

[코드 전문]

 

import tensorflow as tf

import numpy as np

 

x_data = np.array([[00], [01], [10], [11]], dtype=np.float32)

y_data = np.array([[0], [1], [1], [0]], dtype=np.float32)

 

tf.model = tf.keras.Sequential()

tf.model.add(tf.keras.layers.Dense(units=10input_dim=2activation='sigmoid'))

tf.model.add(tf.keras.layers.Dense(units=10activation='sigmoid'))

tf.model.add(tf.keras.layers.Dense(units=10activation='sigmoid'))

tf.model.add(tf.keras.layers.Dense(units=10activation='sigmoid'))

tf.model.add(tf.keras.layers.Dense(units=1activation='sigmoid'))

 

tf.model.compile(loss='binary_crossentropy'optimizer=tf.optimizers.Adam(lr=0.1), metrics=['accuracy'])

tf.model.summary()

 

history = tf.model.fit(x_data, y_data, epochs=5000)

 

predictions = tf.model.predict(x_data)

print('Prediction: \n', predictions)

 

score = tf.model.evaluate(x_data, y_data)

print('Accuracy: ', score[1])

 

 

[코드 분석]

Exclusive OR문제를 여러개의 layer로 풀어보도록 하겠습니다.

 

현재 코드는, 1개의 input layer, 3개의 hidden layer, 1개의 output layer로 구성된 형태입니다.

 

input layer에서 2차원 array를 input으로 받기에 input_dim=2이고, Wide하게 노드를 늘려주기 위해 첫번째 layer의 output node를 10개로 만들어 놓은 상황입니다.

 

기존의 tensorflow1 코드는 input 과 output 차원을 동일하게 맞추어 주어야했는데요, tensorflow2는 알아서 맞춥니다.

 

즉, output dimension만 본인이 원하는대로 적어주면 그 다음 layer에서 input은 알아서 들어가게 됩니다.

(사실 이게 맞죠, 이전 layer의 output과 다음 layer의 output 차원은 무조건 동일해야 하는데 굳이 적어줄 필요가..?)

 

그리고, 최종 output layer의 dimension은 1로 주어 학습 모델링을 완료한 코드입니다.

 

이하 코드는 이전글과 동일합니다.

 

[결과값(5000번 학습)]

이 전글에서 single layer로 1만번 학습했을때보다, Deep 하고 Wide한 neural network로 5000번만 학습하니

loss가 100배이상 좋아지는것을 확인할 수 있습니다.

 

제가 연구중인 분야중 하나에서는 layer가 4이상 넘어가면 발산하거나, 성능 향상은 전혀 보이지 않더라구요

Wide한것도 일정수준이상은 연산량만 잡아먹구요

 

따라서 무조건 Deep하고 Wide하다고 좋은것은 아니나, 성능을 향상시킬 수 있는 여러가지 지표들 중 하나를 얻었다는데에 의미가 있을 것 같습니다.

 

 

댓글