주요 컨텐츠로 이동

Databricks의 TensorFlow™

Illustration

자리 표시자(Placeholder)

지금까지는 변수를 사용해 데이터를 관리했지만, 그 외에도 기본 구조로 자리 표시자가 있습니다. 자리 표시자는 나중에 데이터를 할당할 변수로, 자리 표시자를 사용하면 데이터 없이도 연산을 생성하고 연산 그래프를 만들 수 있습니다. TensorFlow 용어에서는 이러한 자리 표시자를 통해 그래프를 데이터에 공급합니다.

 

import tensorflow as tf

x = tf.placeholder("float", None)
y = x * 2

with tf.Session() as session:
    result = session.run(y, feed_dict={x: [1, 2, 3]})
    print(result)

 

이 예시는 앞의 예시들과 약간 다르게 작동하므로, 자세히 살펴보겠습니다.

먼저, 평소처럼 tensorflow를 가져옵니다. 그런 다음 나중에 값을 저장할 메모리 공간인 x라는 자리 표시자를 만듭니다.

그런 다음 x에 2를 곱하는 연산인 텐서를 만듭니다. 참고로, 아직 x의 초기 값을 정의하지 않았습니다.

이제 연산(y)을 정의했으므로, 세션에서 이 연산을 실행할 수 있습니다. 세션 개체를 만든 다음 y 변수를 실행하면 됩니다. 즉, 훨씬 더 큰 연산 그래프를 정의했다면 그래프의 일부만 실행할 수 있습니다. 이 하위 그래프 평가는 실제로 TensorFlow의 차별화 요소이며, 유사한 연산을 수행하는 다른 많은 라이브러리에는 존재하지 않습니다.

y를 실행하려면 x 값에 대한 정보가 필요합니다. 실행할 feed_dict 인수 내부에서 이 값을 정의합니다. 여기서는 x의 값을 [1, 2, 3]이라고 하겠습니다. y를 실행하면 [2, 4, 6]라는 결과가 반환됩니다.

자리 표시자의 크기를 정적으로 조정할 필요는 없습니다. x가 임의의 길이를 가질 수 있도록 프로그램을 업데이트해 보겠습니다. x의 정의를 다음과 같이 변경합니다.

 

x = tf.placeholder("float", None)

 

이제 feed_dict에서 x 값을 정의하면 값을 개수에 제한 없이 가질 수 있습니다. 아직 코드가 작동하고 동일한 답을 반환해야 하지만, 이제 feed_dict의 값에 관계없이 작동하게 됩니다.

자리 표시자는 배열을 저장할 수 있도록 여러 차원을 가질 수도 있습니다. 다음 예시에서는 3x2 행렬을 만들고 여기에 몇 개의 숫자를 저장합니다. 그런 다음 이전과 동일한 연산을 사용하여 요소별로 숫자를 두 배로 늘립니다.

 

import tensorflow as tf

x = tf.placeholder("float", [None, 3])
y = x * 2

with tf.Session() as session:
    x_data = [[1, 2, 3],
              [4, 5, 6],]
    result = session.run(y, feed_dict={x: x_data})
    print(result)

 

자리 표시자의 첫 번째 차원은 None으로, 행을 개수에 제한 없이 가질 수 있음을 의미합니다. 두 번째 차원은 3으로 고정되어 있습니다. 즉, 각 행에 3개의 데이터 열이 있어야 합니다.

이를 확장하여 임의 개수의 None 차원을 사용할 수 있습니다. 이 예시에서는 지난 강의의 이미지를 로드한 다음 해당 이미지의 슬라이스를 저장하는 자리 표시자를 만듭니다. 슬라이스는 이미지의 2D 세그먼트이지만 각 "픽셀"에는 세 가지 구성 요소(빨간색, 녹색, 파란색)가 있습니다. 따라서 처음 두 차원에는 None이 필요하지만, 마지막 차원에는 3(또는 None도 작동함)이 필요합니다. 그런 다음 TensorFlow의 슬라이스 메서드를 사용하여 작업할 이미지에서 하위 세그먼트를 가져옵니다.

 

import tensorflow as tf
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import os

# First, load the image again
dir_path = os.path.dirname(os.path.realpath(__file__))
filename = dir_path + "/MarshOrchid.jpg"
raw_image_data = mpimg.imread(filename)

image = tf.placeholder("uint8",  [None, None, 3])
slice = tf.slice(image,  [1000, 0, 0], [3000, -1, -1])

with tf.Session() as session:
    result = session.run(slice,  feed_dict={image: raw_image_data})
    print(result.shape)

plt.imshow(result)
plt.show()

 

  1. 공식 문서에서 TensorFlow의 배열에 대한 다른 함수를 살펴봅니다.
  2. 이미지를 4개의 "모서리"로 나눈 다음 다시 연결합니다.
  3. 이미지를 그레이 스케일로 변환합니다. 이를 위한 한 가지 방법은 단일 색상 채널만 가져와 표시하는 것입니다. 또 다른 방법은 세 채널의 평균을 회색으로 사용하는 것입니다.