본문 바로가기
프로그래밍/TensorFlow2

텐서와 변수 - 1

by 세인트워터멜론 2021. 2. 9.

신경망은 일종의 수학 함수다. 입력 데이터를 신경망에 주면 각 레이어를 거치면서 여러가지 연산을 거쳐서 출력 데이터가 산출된다.

 

 

신경망 모델에 입력과 출력이 있듯이 모델 내부의 각 레이어에도 입력과 출력이 있다. 각 레이어의 입력은 신경망의 가중치(weight) 또는 파라미터와 벡터/행렬 연산을 거쳐서 출력을 산출하게 된다. 신경망의 파라미터는 학습을 시작하면 최적화 알고리즘에 의해서 그 값이 변경되고 반복적으로 업데이트 된다.

이와 같은 반복적인 업데이트를 통해서 목적함수를 최적화하도록 신경망의 파라미터를 계산하는 것이 딥러닝의 핵심이다.

 

 

텐서(tensor)는 Tensorflow에서 사용하는 데이터 구조로서 다차원 배열(n-dimensional array)이다. Tensorflow 프로그램에서는 모든 데이터를 텐서 데이터 구조를 사용하여 표현한다. 또한 모든 종류의 연산 작업에서도 텐서를 사용한다. 신경망 모델의 입력 데이터도 텐서로 주어져야 하며 각 레이어에 전달되고 처리되는 데이터도 텐서다. 즉 이름 그대로 Tensorflow에서 tensor는 신경망 내부를 flow하는 다차원 행렬 데이터라고 보면 된다.

Tensorflow에는 텐서와 함께 변수(variable)라는 데이터 구조가 있다. 텐서가 저장된 값을 바꿀 수 없는 상수(constant) 텐서인 반면에, 변수는 값을 변경할 수 있는 텐서를 나타낸다. 신경망의 파라미터는 학습하는 도중에 최적화 알고리즘에 의해서 그 값이 바뀌어야 하므로 변수로 설정한다.

실제로 그런지 간단한 신경망 모델로 확인해 보자. 아래 모델은 입력 레이어에 4개의 뉴런, 출력 레이어에 2개의 뉴런이 있는 완전 연결(fully connected)된 구조를 갖는 신경망이다.

 

import tensorflow as tf

inputs = tf.keras.layers.Input(shape=(4,))
h = tf.keras.layers.Dense(2)(inputs)
model = tf.keras.Model(inputs=inputs, outputs=h)

 

모델의 가중치(weight)를 모두 보려면 print(model.weights)하면 된다.

 

print(model.weights)

 

그러면 다음과 같이 결과가 나온다.

 

[<tf.Variable 'dense/kernel:0' shape=(4, 2) dtype=float32, numpy=
array([[-0.35888124, -0.05906391],
       [-0.5776701 , -0.4829433 ],
       [-0.523319  ,  0.5437064 ],
       [ 0.12623   , -0.9078467 ]], dtype=float32)>, 
       
 <tf.Variable 'dense/bias:0' shape=(2,) dtype=float32, numpy=
array([0., 0.], dtype=float32)>]

 

위 모델의 경우 파라미터는 2가지 변수 객체가 있으며 각각의 이름은 dense 레이어의 kernel:0과 bias:0이며 모양(shape)은 각각 (4,2), (2, )임을 알 수 있다. 참고로 커널의 모양은 (앞 레이어의 뉴런수, 뒤 레이어의 뉴런수)이고 바이어스의 모양은 (뒤 레이어 뉴런수, )이다.

커널의 경우 데이터 타입이 float32이고 넘파이 배열로 초기값이 표현된 것을 볼 수 있다. 바이어스도 역시 데이터 타입이 float32이고 초기값이 모두 0임을 알 수 있다.

여기서 중요한 것은 모델 파라미터는 Tensorflow의 변수로 설정된다는 점이다.

위 모델에서 inputs은 신경망의 입력이고 h는 출력이다. 각각을 프린트해보면,

 

print(inputs)
print(h)

 

다음과 같이 나온다.

 

Tensor("input_1:0", shape=(None, 4), dtype=float32)
Tensor("dense/BiasAdd:0", shape=(None, 2), dtype=float32)

 

inputs은 텐서이며, h도 텐서 inputs을 입력으로 받아서 계산된 텐서임을 알 수 있다. 각각의 데이터 타입은 float32이고 모양은 (None,4), (None,2)이다.

이제 텐서와 변수가 신경망 모델에서 어떻게 사용되는지 대충 파악했으므로 다음에는 텐서와 변수에 대해서 좀더 자세히 알아보도록 하자.

 

 

 

댓글0