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

텐서와 변수 - 3

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

Tensorflow의 변수와 텐서와의 결정적인 차이는 가변성(mutability)이다. 변수는 값을 업데이트할 수 있지만, 텐서는 값을 변경할 수 없으며 새로운 텐서를 생성할 수 있을 뿐이다.

 

 

가변성이 무엇을 말하는지 구체적으로 알아보자. 다음 코드를 보자.

 

a0 = tf.constant(2)
a1 = a0

print(a0)
print(a1)

 

이렇게 하면 a0라는 이름은 2라는 텐서 객체가 저장된 메모리의 위치를 가리킨다. a1도 a0와 동일한 메모리의 위치를 가리킨다.

 

 

 

Output:

tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)

 

그런데 a1에 덧셈 연산을 하면 a1은 연산 결과인 3을 저장한 다른 메모리 위치를 가리킨다. 새로운 텐서가 되는 것이다.

 

a1 = a1 + 1
print(a0)
print(a1)

 

 

 

 

Output:

tf.Tensor(2, shape=(), dtype=int32)
tf.Tensor(3, shape=(), dtype=int32)

 

즉시 실행 모드에서는 명확하지 않으므로 그래프 모드에서 다시 한번 살펴보자.

 

with tf.Graph().as_default():
    ga0 = tf.constant(2)
    ga1 = ga0
    print("before:")
    print(ga0)
    print(ga1)
    ga1 = ga1 + 1
    print("after:")
    print(ga0)
    print(ga1)

 

 

Output:

before:
Tensor("Const:0", shape=(), dtype=int32)
Tensor("Const:0", shape=(), dtype=int32)
after:
Tensor("Const:0", shape=(), dtype=int32)
Tensor("add:0", shape=(), dtype=int32)

 

ga1은 ga0과 같은 텐서였지만 연산 이후로는 다른 텐서가 됐다. 따라서 텐서는 비가변적(immutable)이다.

 

 

반면에 Tensorflow의 변수 객체(variable object)는 가변적이다. 다음 코드를 보자.

 

b0 = tf.Variable(2)
b1 = b0
print(b0)
print(b1)

 

이렇게 하면 b0라는 이름은 2라는 변수 객체가 저장된 메모리의 위치를 가리킨다. b1도 b0와 동일한 메모리의 위치를 가리킨다.

 

 

 

Output:

<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=2>
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=2>

 

그런데 b1에 덧셈 연산을 하면 b1은 연산 결과인 3은 동일한 메모리에 저장되므로 b1 뿐만 아니라 동일한 메모리를 공유하는 b0도 값이 3이 된다. 즉 변수는 가변적(mutable)이다. 참고로 변수에 새로운 값을 할당할 때는 assign 메쏘드를 사용한다.

 

b1.assign(b1 + 1)
print(b0)
print(b1)

 

 

 

 

Output:

<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=3>
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=3>

 

하지만 기존 변수에서 새로운 변수를 만들면,

 

bb0 = tf.Variable(2)
bb1 = tf.Variable(bb0)
print(bb0)
print(bb1)

 

두 변수는 메모리를 공유하지 않기 때문에,

 

 

bb1에 덧셈 연산을 하면 bb1이 가리킨 메모리에 저장된 값만 업데이트된다.

 

bb1.assign(bb1 + 1)
print(bb0)
print(bb1)

 

 

 

 

Output:

<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=2>
<tf.Variable 'Variable:0' shape=() dtype=int32, numpy=3>

 

이와 같이 Tensorflow의 변수는 신경망 학습중에 업데이트가 가능하기 때문에 모델 파라미터를 변수로 설정한다. 변수는 텐서와 마찬가지로 모양(shape)과 데이터 타입(dtype)을 가지며 numnpy로 내보낼 수 있다. 일단 변수가 생성되면 모양과 타입은 고정된다.

Variable() 생성자에는 변수의 초기값이 필요하며, 초기값은 모든 모양 및 타입의 텐서일 수 있다.

아래 코드는 변수에 텐서를 더하는 연산을 하면 결과가 텐서로 나오는 것을 보여준다.

 

var = tf.Variable([1, 3])
h = var + [4, -1]
print(h)

 

 

Output:

tf.Tensor([5 2], shape=(2,), dtype=int32)

 

 

 

'프로그래밍 > TensorFlow2' 카테고리의 다른 글

Model Subclassing 멀티 입력 신경망 모델 구현 방법  (0) 2021.03.16
tf.reduce_sum 함수  (0) 2021.03.12
텐서와 변수 - 2  (0) 2021.02.10
텐서와 변수 - 1  (0) 2021.02.09
GradientTape로 간단한 CNN 학습하기  (0) 2021.01.11

댓글0