본문 바로가기
AI, 빅데이터/AI

[AI 개념 다지기] Dense Layer

by Foxy현 2022. 8. 2.
728x90
반응형

안녕하세요  Foxy현입니다.

오늘은 Layer라는 개념에 대해서 배우고 Jupyter로 구현해보겠습니다!

인공신경망의 가장 기본이 되는 내용중 하나이므로 꼭 이해하고 넘어가셨으면 좋겠습니다


먼저, Layer는 뉴런들의 집합입니다.

또 필터들의 묶음이라고 말할 수 있습니다. 각각 서로 다른 Paramatric Function을 가지고 있는 묶음입니다!

서로 다른 PF가 들어가기 때문에 각 뉴런에서는 서로 다른 출력이 나올 수 있습니다.

(Input이 같거나 다르더라도 각 뉴런에서의 Output은 다르다)

 

Dense Layer는 추출된 feature들을 하나의 Layer로 모으고, 우리가 원하는 Tensor로 표현하기 위한 Layer입니다. 각 뉴런은 이전 계층의 모든 뉴런으로부터 입력을 받게 됩니다.

다시 말해서 뉴런마다 Input들이 전부 연결된 것들을 Dense Layer라고 부른다는 의미입니다.

 

여기서 화살표는 edge라고 부르고, x는 노드의 역할을 합니다. 우리가 딥러닝이 나오기 전부터 컴퓨터 공학에서는

이런 구조를 네트워크라고 불렀습니다. 따라서 network라고 부른다고 생각하시면 좋을 것 같습니다.


이제 이 개념을 가지고 실습으로 구현해보겠습니다

import tensorflow as tf
from tensorflow.keras.layers import Dense

N,n_feature = 1,10
X = tf.random.normal(shape=(N,n_feature))

n_neuron = 3
dense=Dense(units=n_neuron,activation='sigmoid')
Y=dense(X)

W,B = dense.get_weights()
print("===== Input/Weight/Bias=====")
print("X: ",X.shape)
print("W: ",W.shape)
print("B: ",B.shape)
print("Y: ",Y.shape)

print(W)
  • X = (1,10)의 배열을 생성함
  • n_neuron = 3개의 뉴런을 생성
  • Y = 3개의 뉴런을 가지고 sigmoid 활설화함수를 사용하는 layer 생성

위의 단일 Layer를 만들어봤으니, 2개의 Dense Layer를 만들어보겠습니다.

import tensorflow as tf
from tensorflow.keras.layers import Dense

N,n_feature = 4,10
X = tf.random.normal(shape=(N,n_feature))

n_neurons=[3,5]
dense1 = Dense(units=n_neurons[0],activation='sigmoid')
dense2 = Dense(units=n_neurons[1],activation='sigmoid')

A1 = dense1(X)
Y=dense2(A1)

W1,B1 = dense1.get_weights()
W2,B2 = dense2.get_weights()

print("X: {}\n".format(X.shape))
print("W1: {}\n".format(W1.shape))
print("B1: {}\n".format(B1.shape))

print("W2: {}\n".format(W2.shape))
print("B2: {}\n".format(B2.shape))
print("Y: {}\n".format(Y.shape))
  • dense Layer 층에 뉴런의 개수를 다르게 하여 생성

계산을 보면 10과 10이 사라지고, 3과 3이 사라졌습니다. 그럼 남은 것은 4,5겠죠?

이렇게 연산을 통해 (4,5)라는 Y값이 나오는 것입니다.

결국 마지막 층의 뉴런 개수를 출력층에서 확인할 수 있다는 것입니다!!

 

이제 dense층을 하나씩 추가해주면 다중 Layer를 만들 수 있다는 것을 알았으니, for문을 이용하여 지정한 개수만큼 만들어봅시다.

import tensorflow as tf
from tensorflow.keras.layers import Dense

N,n_feature = 4,10
X = tf.random.normal(shape=(N,n_feature))

n_neurons = [10,20,30,40,50,60,70,80,90,100]
dense_layers=list()

for n_neuron in n_neurons:
    dense = Dense(units=n_neuron,activation='relu')
    dense_layers.append(dense)

print("Input: ",X.shape)
for dense_idx,dense in enumerate(dense_layers):
    X = dense(X)
    print("After dense Layer ",dense_idx+1)
    print(X.shape,'\n')
  • 각 Dense Layer의 뉴런의 개수를 먼저 지정해줍니다.
  • for문을 이용하여 1~10개의 Dense Layer를 생성합니다

Output을 보면 10개의 인덱스가 각 뉴런의 개수만큼 구성되어 생성된 것을 확인할 수 있습니다.

 

또한 각 레이어에 정확히 하나의 입력 텐서와 하나의 출력 텐서가 있는 일반 레이어 스택에 사용하는 Sequential 모델로도 만들어 볼 수 있습니다.

https://www.tensorflow.org/guide/keras/sequential_model?hl=ko

하지만, 모델에 다중 입력 또는 다중 출력이 있는 경우 사용에 적합하지 않습니다.

 

from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential

model = Sequential() 
model.add(Dense(units=10,activation='sigmoid'))
model.add(Dense(units=20,activation='sigmoid'))

다음과 같이 add 메서드를 사용해서 layer를 추가할 수 있습니다.

Python의 Class를 사용하는 방법도 있습니다.

class TestModel(Model):
    def __init__(self):
        super(TestModel,self).__init__()
        self.dense1=Dense(units=10,activation='sigmoid')
        self.dense2=Dense(units=20,activation='sigmoid')
        
    def call(self,x):
        x=self.dense1(x)
        x=self.dense2(x)
        return x
    
model = TestModel()
Y=model(X)

처음에 Dense Layer에 대해 어렴풋이 이해는 했었지만, 막상 글로 적고 설명하려고 하는 과정에서 더욱 많이 이해가 되고, 어떤 식으로 연산이 돌아가는지 확인할 수 있었습니다.

앞으로의 딥러닝에서 가장 기초가 되는 Dense Layer에 대해 한번 살펴보았습니다. 감사합니다!

 

728x90
반응형