TensorFlow에서 텐서란 무엇인가요? 모양, 유형 및 Opera토르

⚡ 스마트 요약

텐서는 모든 TensorFlow 연산이 읽고 쓰는 n차원 배열로, 각각 이름, 모양 및 데이터 유형을 가집니다. 이 예제에서는 상수, 변수, 플레이스홀더 및 연산자를 생성하고 세션 내에서 평가합니다.

  • 🔘 세 가지 속성: 모든 tf.Tensor 객체는 고유한 이름, 모양 및 데이터 유형을 노출합니다.
  • ☑️ 텐서 유형 네 가지: tf.constant, tf.Variable, tf.placeholder 및 tf.SparseTensor는 기존 API를 다룹니다.
  • 순위는 중첩을 의미합니다. 괄호 쌍이 하나씩 추가될 때마다 도형 튜플에 차원이 하나씩 더해집니다.
  • 🧪 평가 연기: 연산 결과를 출력하면 해당 연산의 정의만 표시될 뿐, 세션에서 실행되기 전까지는 값을 보여주지 않습니다.
  • 🛠️ 그래프 및 세션: 그래프는 세션이 작업을 실행하고 결과를 반환하는 동안 해당 작업을 표시합니다.
  • ⚠️ 버전 참고: 세션과 플레이스홀더는 TensorFlow 1.x에 속하며 현재는 tf.compat.v1에서 사용 가능합니다.

TensorFlow 기초: 텐서, 형태, 유형, 세션 및 Opera토르

텐서란 무엇입니까?

이름 TensorFlow TensorFlow는 핵심 객체인 텐서에서 직접 파생됩니다. TensorFlow에서 모든 계산은 텐서를 사용합니다. 텐서는 모든 유형의 데이터를 나타내는 n차원의 벡터 또는 행렬입니다. 텐서의 모든 값은 알려진(또는 부분적으로 알려진) 형태를 가진 동일한 데이터 유형을 가지며, 데이터의 형태는 행렬 또는 배열의 차원입니다.

텐서는 입력 데이터 또는 계산 결과에서 생성될 수 있습니다. TensorFlow에서는 모든 연산이 그래프 내에서 수행됩니다. 그래프는 순차적으로 발생하는 계산들의 집합입니다. 각 연산을 op 노드라고 하며, 노드들은 서로 연결되어 있습니다.

이 그래프는 연산과 노드 간의 연결을 보여줍니다. 하지만 값은 표시하지 않습니다. 노드 사이의 간선은 텐서, 즉 ​​연산에 데이터를 채우는 방법을 나타냅니다.

머신러닝에서 모델은 특징 벡터라고 불리는 객체 목록을 입력으로 받습니다. 특징 벡터는 어떤 데이터 유형이든 될 수 있으며, 일반적으로 텐서를 채우는 주요 입력값입니다. 이러한 값들은 텐서를 통해 연산 노드로 전달되고, 해당 연산의 결과는 새로운 텐서를 생성하며, 이 텐서는 다시 새로운 연산에 사용됩니다. 이러한 모든 연산은 그래프에서 확인할 수 있습니다.

텐서의 표현

TensorFlow에서 텐서는 n차원의 특징 벡터(즉, 배열)들의 모음입니다. 예를 들어, 1부터 6까지의 값을 가진 2×3 행렬이 있다면 아래와 같이 표현할 수 있습니다.

1부터 6까지의 값을 괄호 표기법으로 나타낸 2x3 행렬

TensorFlow는 이 행렬을 다음과 같이 표현합니다.

[[1, 2, 3], 
   [4, 5, 6]]

1부터 8까지의 값을 가진 3차원 행렬을 만들면, 동일한 데이터가 두 면이 겹쳐진 상자 형태로 표현됩니다.

3차원 텐서는 두 개의 겹쳐진 면에 1부터 8까지의 값이 표시된 상자 형태로 표현됩니다.

TensorFlow는 이 행렬을 다음과 같이 표현합니다.

[ [[1, 2],  
       [[3, 4],  
       [[5, 6],  
       [[7,8] ]

참고: 텐서는 스칼라 값으로 표현될 수도 있고, 3차원 이상의 형태를 가질 수도 있습니다. 다만, 고차원 텐서는 시각화하기가 더 어렵습니다.

텐서의 유형

TensorFlow에서는 모든 계산이 하나 이상의 텐서를 거쳐 수행됩니다. tf.Tensor는 세 가지 속성을 가진 객체입니다.

  • 고유한 라벨(이름)
  • 치수(모양)
  • 데이터 유형(dtype)

TensorFlow에서 수행하는 모든 연산은 텐서 조작을 포함합니다. 생성할 수 있는 주요 텐서 유형은 네 가지입니다.

  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

이 튜토리얼에서는 다음을 만드는 방법을 배우게 됩니다. tf.constanttf.Variable.

코드를 실행하기 전에 한 가지 유의해야 할 점은 이 튜토리얼이 TensorFlow 1.x API를 기반으로 한다는 것입니다. 즉, 그래프를 먼저 구축한 후 세션 내에서 실행하는 방식입니다. TensorFlow 2는 기본적으로 즉시 실행되므로 아래의 심볼 중 일부가 이동되거나 제거되었습니다. 하지만 이러한 심볼들은 여전히 ​​다른 방법을 통해 접근할 수 있습니다. tf.compat.v1 네임스페이스이며, 테이블은 각각을 최신 버전으로 매핑합니다.

TensorFlow 1.x 심볼 TensorFlow 2와 동등한 기능
tf.placeholder() 필수 사항이 아닙니다. 즉시 실행이 허용됩니다. Python 또는 NumPy 값을 직접 사용하거나 tf.function 이 매개변수는 그래프 모드에서도 동일한 역할을 합니다.
tf.Session() sess.run() 연산을 직접 호출하여 결과를 읽거나, 계산을 래핑할 수 있습니다. tf.function.
tf.get_variable() tf.Variable()평범한 것과 함께 Python 사물 trac컬렉션 대신 변수를 사용하세요.
tf.global_variables_initializer() 필수 사항이 아닙니다. A tf.Variable 생성되는 순간 초기화됩니다.
tf.div() tf.divide()또한 하위 항목은 다음과 같습니다.traction op는 철자가 맞습니다. tf.subtract()가 아닌 tf.substract().

튜토리얼을 시작하기 전에 TensorFlow가 설치된 conda 환경을 활성화했는지 확인하세요. 이 환경의 이름은 hello-tf입니다.

럭셔리 macOS 사용자 :

source activate hello-tf

럭셔리 Windows 사용자 :

activate hello-tf

위 단계를 완료하면 TensorFlow를 가져올 준비가 됩니다.

# Import tf
import tensorflow as tf

n차원의 텐서 생성

한 차원, 즉 스칼라를 갖는 텐서 생성부터 시작합니다.

텐서를 생성하려면 다음을 사용할 수 있습니다. tf.constant() 아래 TensorFlow 텐서 모양 예시에서 볼 수 있듯이:

tf.constant(value, dtype, name = "")
arguments

- `value`: Value of n dimension to define the tensor. Optional
- `dtype`: Define the type of data:    
    - `tf.string`: String variable    
    - `tf.float32`: Float variable    
    - `tf.int16`: Integer variable
- "name": Name of the tensor. Optional. By default, `Const_1:0`

차원이 0인 텐서를 생성하려면 다음 코드를 실행하세요.

## rank 0
# Default name
r1 = tf.constant(1, tf.int16) 
print(r1)			

산출

Tensor("Const:0", shape=(), dtype=int16)

해당 출력의 세 부분은 아래 주석이 달린 버전에서 명확히 알 수 있듯이 세 가지 텐서 속성에 매핑됩니다.

텐서 출력에는 이름, 모양 및 데이터 유형을 표시하는 콜아웃이 주석으로 표시됩니다.

또한 다음을 사용하여 텐서에 원하는 이름을 지정할 수 있습니다. name 논의.

# Named my_scalar
r2 = tf.constant(1, tf.int16, name = "my_scalar") 
print(r2)

산출

Tensor("my_scalar:0", shape=(), dtype=int16)

각 텐서는 텐서 이름으로 표시됩니다. 각 텐서 객체는 고유한 레이블(이름), 차원(형태) 및 TensorFlow 데이터 유형(dtype)과 같은 속성으로 정의됩니다.

데이터 유형을 변경하여 XNUMX진수 값이나 문자열로 텐서를 정의할 수 있습니다.

# Decimal
r1_decimal = tf.constant(1.12345, tf.float32)
print(r1_decimal)
# String
r1_string = tf.constant("Guru99", tf.string)
print(r1_string)

산출

Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("Const_2:0", shape=(), dtype=string)

차원이 1인 텐서는 다음과 같이 생성할 수 있습니다.

## Rank 1
r1_vector = tf.constant([1,3,5], tf.int16)
print(r1_vector)
r2_boolean = tf.constant([True, True, False], tf.bool)
print(r2_boolean)

산출

Tensor("Const_3:0", shape=(3,), dtype=int16)
Tensor("Const_4:0", shape=(3,), dtype=bool)

TensorFlow의 도형은 단 하나의 열로 구성되어 있다는 것을 알 수 있습니다.

2차원 텐서 배열을 생성하려면 각 행 뒤에 대괄호를 닫아야 합니다. 아래의 텐서 모양 예시를 참조하세요.

## Rank 2
r2_matrix = tf.constant([ [1, 2],
                          [3, 4] ],tf.int16)
print(r2_matrix)

산출

Tensor("Const_5:0", shape=(2, 2), dtype=int16)

이 행렬은 2행 2열로 이루어져 있으며, 각 열에는 1, 2, 3, 4의 값이 채워져 있습니다.

괄호를 한 단계 더 추가하면 3차원 행렬이 만들어집니다.

## Rank 3
r3_matrix = tf.constant([ [[1, 2],
                           [3, 4], 
                           [5, 6]] ], tf.int16)
print(r3_matrix)

산출

Tensor("Const_6:0", shape=(1, 3, 2), dtype=int16)

결과는 이 튜토리얼 앞부분에 나온 3차원 상자 그림과 일치합니다.

텐서의 형태

텐서를 출력할 때 TensorFlow는 텐서의 형태를 추론합니다. 하지만 TensorFlow를 사용하면 텐서의 형태를 직접 읽을 수도 있습니다. shape 재산.

아래에서는 10부터 15까지의 숫자로 채워진 행렬을 구성하고 그 모양을 확인합니다. m_shape.

# Shape of tensor
m_shape = tf.constant([ [10, 11],
                        [12, 13],
                        [14, 15] ]                      
                     ) 
m_shape.shape

산출

TensorShape([Dimension(3), Dimension(2)])

행렬에는 3개의 행과 2개의 열이 있습니다.

TensorFlow에는 0 또는 1로 채워진 벡터나 행렬을 생성하는 데 유용한 명령이 있습니다. 예를 들어, 1으로 채워진 특정 모양 10의 0차원 텐서를 생성하려는 경우 아래 코드를 실행할 수 있습니다.

# Create a vector of 0
print(tf.zeros(10))

산출

Tensor("zeros:0", shape=(10,), dtype=float32)

이 속성은 행렬에도 적용됩니다. 여기서는 1로 채워진 10×10 행렬을 생성합니다.

# Create a vector of 1
print(tf.ones([10, 10]))

산출

Tensor("ones:0", shape=(10, 10), dtype=float32)

주어진 행렬의 형태를 이용하여 모든 요소가 1인 벡터를 만들 수 있습니다. 행렬 m_shape 3×2 크기이므로 다음 코드는 모든 행이 3로 채워진 텐서를 생성합니다.

# Create a vector of ones with the same number of rows as m_shape
print(tf.ones(m_shape.shape[0]))

산출

Tensor("ones_1:0", shape=(3,), dtype=float32)

대괄호 안에 값 1을 전달하면 행렬의 열 개수와 같은 수의 모든 요소가 1인 벡터가 생성됩니다. m_shape.

# Create a vector of ones with the same number of column as m_shape
print(tf.ones(m_shape.shape[1]))

산출

Tensor("ones_2:0", shape=(2,), dtype=float32)

마지막으로, 모든 요소가 1로 채워진 3×2 행렬을 만들 수 있습니다.

print(tf.ones(m_shape.shape))

산출

Tensor("ones_3:0", shape=(3, 2), dtype=float32)

데이터 유형

텐서의 두 번째 속성은 데이터 유형입니다. 텐서는 한 번에 한 가지 유형의 데이터만 저장할 수 있으며, 해당 유형의 데이터는 `read()` 함수를 사용하여 읽을 수 있습니다. dtype 재산.

print(m_shape.dtype)

산출

<dtype: &#x27;int32'>

경우에 따라 데이터 유형을 변경해야 할 때가 있습니다. TensorFlow에서는 다음과 같은 방법으로 그것이 가능합니다. tf.cast 방법.

예시

아래 예시에서는 부동소수점 텐서를 정수로 변환합니다. cast 방법.

# Change type of data
type_float = tf.constant(3.123456789, tf.float32)
type_int = tf.cast(type_float, dtype=tf.int32)
print(type_float.dtype)
print(type_int.dtype)

산출

<dtype: &#x27;float32'>
<dtype: &#x27;int32'>

TensorFlow는 텐서를 생성할 때 인수를 지정하지 않으면 데이터 유형을 자동으로 선택합니다. TensorFlow는 가장 가능성이 높은 데이터 유형을 추측합니다. 예를 들어, `text`를 전달하면 문자열로 추론합니다.

만들기 Opera바위 산

유용한 TensorFlow 기능 몇 가지 Opera토르

TensorFlow로 텐서를 만드는 방법을 알고 있습니다. 이제 수학 연산을 수행하는 방법을 배울 시간입니다.

TensorFlow는 모든 기본 연산을 포함하고 있습니다. 간단한 연산부터 시작해 TensorFlow 메서드를 사용하여 숫자의 제곱근을 계산할 수 있습니다. 이 연산은 텐서를 구성하는 데 필요한 인수가 하나뿐이므로 매우 간단합니다.

어떤 수의 제곱근은 다음과 같이 구성됩니다. tf.sqrt(x)여기서 x는 부동 소수점 숫자입니다.

x = tf.constant([2.0], dtype = tf.float32)
print(tf.sqrt(x))

산출

Tensor("Sqrt:0", shape=(1,), dtype=float32)

참고: 출력 결과는 2의 제곱근이 아닌 텐서 객체입니다. 이 예제에서는 연산의 실제 평가 결과가 아닌 텐서의 정의를 출력합니다. 아래 세션 섹션에서 TensorFlow가 연산을 실행하는 방법을 알아볼 수 있습니다.

다음은 자주 사용되는 연산 목록입니다. 기본 개념은 동일하며, 각 연산에는 하나 이상의 인수가 필요합니다.

  • tf.add(a, b)
  • tf.subtract(a, b)
  • tf.multiply(a, b)
  • tf.divide(a, b)
  • tf.pow(a, b)
  • tf.exp(a)
  • tf.sqrt(a)

예시

# Add
tensor_a = tf.constant([[1,2]], dtype = tf.int32)
tensor_b = tf.constant([[3, 4]], dtype = tf.int32)

tensor_add = tf.add(tensor_a, tensor_b)
print(tensor_add)

산출

Tensor("Add:0", shape=(1, 2), dtype=int32)

Code 설명

두 개의 텐서를 만듭니다.

  • 1과 2가 있는 하나의 텐서
  • 3과 4가 있는 하나의 텐서

두 텐서를 모두 합산합니다.

두 텐서의 모양이 동일해야 한다는 점에 유의하세요. 두 텐서를 곱하는 연산을 수행할 수도 있습니다.

# Multiply
tensor_multiply = tf.multiply(tensor_a, tensor_b)
print(tensor_multiply)

산출

Tensor("Mul:0", shape=(1, 2), dtype=int32)

변수

지금까지는 상수 텐서만 생성했는데, 이는 그 자체로는 활용도가 제한적입니다. 데이터는 항상 다른 값을 가지고 들어오므로, 이를 포착하기 위해 Variable 클래스를 사용할 수 있습니다. 변수는 시간이 지남에 따라 값이 변하는 노드를 나타냅니다.

변수를 생성하려면 다음을 사용할 수 있습니다. tf.get_variable() 방법.

tf.get_variable(name = "", values, dtype, initializer)
argument
- `name = ""`: Name of the variable
- `values`: Dimension of the tensor
- `dtype`: Type of data. Optional
- `initializer`: How to initialize the tensor. Optional
If initializer is specified, there is no need to include the `values` as the shape of `initializer` is used.

예를 들어, 아래 코드는 두 개의 무작위 값을 가진 2차원 변수를 생성합니다. TensorFlow는 기본적으로 무작위 값을 반환합니다. 변수 이름은 var로 지정합니다.

# Create a Variable
## Create 2 Randomized values
var = tf.get_variable("var", [1, 2])
print(var.shape)

산출

(1, 2)

이 예제에서는 한 행과 두 열로 구성된 변수를 생성하므로 변수의 차원으로 [1, 2]를 전달합니다.

텐서의 초기값은 0일 수도 있습니다. 예를 들어 모델을 학습시킬 때, 특징의 가중치를 계산하기 전에 초기값이 필요합니다. 아래 예시에서는 초기값을 0으로 설정합니다.

var_init_1 = tf.get_variable("var_init_1", [1, 2], dtype=tf.int32,  initializer=tf.zeros_initializer)
print(var_init_1.shape)

산출

(1, 2)

상수 텐서의 값을 변수에 전달할 수도 있습니다. 상수 텐서는 해당 메서드를 사용하여 생성합니다. tf.constant() 그리고 그 텐서를 사용하여 변수를 초기화합니다.

변수의 초기값은 10, 20, 30, 40입니다. 새로운 텐서는 2×2 형태입니다.

# Create a 2x2 matrix
tensor_const = tf.constant([[10, 20],
[30, 40]])
# Initialize the first value of the tensor equals to tensor_const
var_init_2 = tf.get_variable("var_init_2", dtype=tf.int32,  initializer=tensor_const)
print(var_init_2.shape)

산출

(2, 2)

자리 표시 자

플레이스홀더는 텐서에 데이터를 입력하는 역할을 합니다. 플레이스홀더는 텐서 내부로 흐를 데이터를 초기화합니다. 플레이스홀더를 제공하려면 다음을 사용합니다. feed_dict 인수이며, 자리 표시자는 세션 내에서만 제공됩니다.

다음 예제에서는 해당 메서드를 사용하여 플레이스홀더를 만드는 방법을 보여드리겠습니다. tf.placeholder세션 섹션에서는 플레이스홀더에 실제 텐서 값을 입력하는 방법을 배우게 됩니다.

구문은 다음과 같습니다.

tf.placeholder(dtype,shape=None,name=None )
arguments:
- `dtype`: Type of data
- `shape`: dimension of the placeholder. Optional. By default, shape of the data
- `name`: Name of the placeholder. Optional			
data_placeholder_a = tf.placeholder(tf.float32, name = "data_placeholder_a")
print(data_placeholder_a)

산출

Tensor("data_placeholder_a:0", dtype=float32)

세션

TensorFlow는 3가지 주요 구성요소를 중심으로 작동합니다.

  • 그래프
  • 텐서
  • 세션
구성 요소 기술설명
그래프 그래프는 TensorFlow의 핵심입니다. 모든 수학적 연산(op)은 그래프 내부에서 수행됩니다. 그래프는 모든 연산이 실행되는 프로젝트라고 생각할 수 있습니다. 노드는 이러한 연산을 나타내며, 새로운 텐서를 생성하거나 기존 텐서를 흡수할 수 있습니다.
텐서 텐서는 연산 간에 변화하는 데이터를 나타냅니다. 앞서 텐서를 초기화하는 방법을 살펴보았습니다. 상수와 변수의 차이점은 변수의 초기값은 시간이 지남에 따라 변한다는 것입니다.
세션 세션은 그래프의 연산을 실행합니다. 텐서의 값을 그래프에 입력하려면 세션을 열어야 합니다. 세션 내부에서는 출력을 생성하기 위해 연산자를 실행해야 합니다.

그래프와 세션은 서로 독립적입니다. 세션을 실행한 후 값을 저장해 두었다가 나중에 추가 계산에 사용할 수 있습니다.

아래 예에서는 다음을 수행합니다.

  • 두 개의 텐서 생성
  • 작업 생성
  • 세션 열기
  • 결과 인쇄

1단계) x와 y라는 두 개의 텐서를 생성합니다.

## Create, run  and evaluate a session
x = tf.constant([2])
y = tf.constant([4])

2단계) x와 y를 곱하여 연산자를 만듭니다.

## Create operator
multiply = tf.multiply(x, y)

3단계) ​​세션을 엽니다. 모든 계산은 세션 내에서 이루어지며, 완료되면 세션을 닫아야 합니다.

## Create a session to run the code
sess = tf.Session()
result_1 = sess.run(multiply)
print(result_1)
sess.close()

산출

[8]

Code 설명

  • tf.Session()세션을 엽니다. 모든 작업은 해당 세션 내에서 이루어집니다.
  • run(multiply)2단계에서 생성된 작업을 실행합니다.
  • print(result_1)마지막으로 결과를 출력할 수 있습니다.
  • close()세션을 종료합니다.

결과는 x와 y의 곱인 8을 보여줍니다.

세션을 생성하는 또 다른 방법은 블록 내부에서 생성하는 것입니다. 이 방법의 장점은 세션이 자동으로 종료된다는 것입니다.

with tf.Session() as sess:
    result_2 = multiply.eval()
print(result_2)

산출

[8]

세션 컨텍스트에서 다음을 사용할 수 있습니다. eval() 해당 연산을 실행하는 방법입니다. 이는 다음과 같습니다. run() 또한 코드를 더 읽기 쉽게 만들어줍니다.

세션을 생성하고 지금까지 생성한 텐서 내부의 값을 볼 수 있습니다.

## Check the tensors created before
sess = tf.Session()
print(sess.run(r1))
print(sess.run(r2_matrix))
print(sess.run(r3_matrix))

산출

1
[[1 2] 
 [3 4]]
[[[1 2]  
  [3 4]  
  [5 6]]]

변수는 텐서를 생성한 후에도 기본적으로 비어 있습니다. 변수를 사용하려면 먼저 초기화해야 합니다. tf.global_variables_initializer() 이 함수는 모든 변수의 값을 한 번에 초기화하기 위해 호출되며, 모델 학습 전에 유용합니다.

이전에 생성한 변수들의 값을 확인할 수 있습니다. 텐서를 평가하려면 `run` 명령어를 사용해야 한다는 점에 유의하세요.

sess.run(tf.global_variables_initializer())
print(sess.run(var))
print(sess.run(var_init_1))
print(sess.run(var_init_2))

산출

[[-0.05356491  0.75867283]]
[[0 0]]
[[10 20] 
 [30 40]]

이전에 생성한 플레이스홀더에 실제 값을 입력할 수 있습니다. 데이터를 전달해야 합니다. feed_dict 논의.

예를 들어, 자리 표시자 data_placeholder_a의 2제곱을 사용합니다.

import numpy as np
power_a = tf.pow(data_placeholder_a, 2)
with tf.Session() as sess:
    data = np.random.rand(1, 10)
    print(sess.run(power_a, feed_dict={data_placeholder_a: data}))  # Will succeed.

Code 설명

  • import numpy as np: 가져오기 눔 파이 데이터를 생성하는 라이브러리
  • tf.pow(data_placeholder_a, 2): 운영을 생성합니다
  • np.random.rand(1, 10)무작위 데이터 배열을 생성합니다.
  • feed_dict={data_placeholder_a: data}플레이스홀더에 데이터를 입력하세요.

산출

[[0.05478134 0.27213147 0.8803037  0.0398424  0.21172127 0.01444725  0.02584014 0.3763949  0.66022706 0.7565559 ]]

그래프

TensorFlow는 모든 연산을 데이터플로우 방식으로 표현합니다. 데이터플로우 그래프는 개별 연산 간의 데이터 의존성을 드러내도록 설계되었습니다. 수학 공식이나 알고리즘은 여러 개의 연속적인 연산으로 구성되며, 그래프는 이러한 계산들이 어떻게 서로 연관되어 있는지 시각화하는 편리한 방법입니다.

이 그래프는 노드와 에지를 보여줍니다. 노드는 연산, 즉 계산 단위를 나타냅니다. 에지는 텐서를 나타내며, 개별 연산 간의 의존성에 따라 새로운 텐서를 생성하거나 입력 데이터를 소비할 수 있습니다.

그래프의 구조는 연산(즉, 노드)들을 서로 연결하고 각 연산에 ​​데이터가 어떻게 공급되는지를 보여줍니다. 그래프는 연산의 출력값을 보여주는 것이 아니라, 연산들 간의 연결 관계를 시각화하는 데 도움을 주는 도구일 뿐입니다.

예를 들어 보겠습니다. 다음 함수를 평가하고 싶다고 가정해 보세요.

공식 f(x와 z) = x 곱하기 z + x² + z + 5

TensorFlow는 함수를 실행하기 위한 그래프를 구축합니다. 그래프는 다음과 같습니다.

X와 Z 변수 노드가 Mul, Pow 및 세 가지 덧셈 연산에 입력되는 TensorFlow 그래프

텐서가 최종 목적지에 도달하기 위해 택할 경로를 쉽게 확인할 수 있습니다.

예를 들어, add 노드는 두 가지 조건이 모두 충족되기 전에 실행될 수 없습니다. Mul Pow 결과를 도출했습니다. 그래프는 TensorFlow가 다음과 같은 결과를 보여줄 것임을 나타냅니다.

  1. x·z를 계산합니다. Mul 노드와 x²에서 Pow 노드
  2. 두 결과를 합산하면 다음과 같습니다. add 노드
  3. 그 합계에 z를 더하세요 add_1 노드
  4. 상수 5를 더하세요 add_2 노드
x = tf.get_variable("x", dtype=tf.int32,  initializer=tf.constant([5]))
z = tf.get_variable("z", dtype=tf.int32,  initializer=tf.constant([6]))
c = tf.constant([5], name =	"constant")
square = tf.constant([2], name =	"square")
f = tf.multiply(x, z) + tf.pow(x, square) + z + c

Code 설명

  • x: 상수 값 5로 x라는 변수를 초기화합니다.
  • z: 상수 값 6으로 z라는 변수를 초기화합니다.
  • c: 상수 값 5를 사용하여 c라는 상수 텐서를 초기화합니다.
  • square: 상수 값 2를 사용하여 square라는 상수 텐서를 초기화합니다.
  • f: 연산자를 구성하세요

이 예제에서는 변수 값이 고정되어 있습니다. 상수 텐서 c는 함수 f의 상수 매개변수이며 5라는 고정 값을 가집니다. 그래프에서 이 매개변수가 constant라는 이름의 텐서에 포함되어 있는 것을 확인할 수 있습니다.

연산자의 거듭제곱에 대한 상수 텐서도 생성되었습니다. tf.pow()필수적인 것은 아니지만, 그래프에서 지수가 사각형이라고 불리는 원으로 표시된다는 의미입니다.

그래프를 통해 텐서에 어떤 변화가 생기는지, 그리고 함수가 66을 반환하는 이유(5 × 6 + 5² + 6 + 5 = 66)를 알 수 있습니다.

아래 코드는 세션 내부에서 함수를 평가합니다.

init = tf.global_variables_initializer() # prepare to initialize all variables
with tf.Session() as sess:
    init.run() # Initialize x and y
    function_result = f.eval()
print(function_result)

산출

[66]

TensorFlow 기본 사항 빠른 참조

아래 네 개의 표에는 이 튜토리얼에서 사용된 모든 명령어가 정리되어 있으므로 예제를 스크롤하지 않고도 원하는 명령어를 찾아볼 수 있습니다.

상수 텐서 생성

상수 대상
D0 tf.constant(1, tf.int16)
D1 tf.constant([1,3,5], tf.int16)
D2 tf.constant([ [1, 2], [3, 4] ],tf.int16)
D3 tf.constant([ [[1, 2],[3, 4], [5, 6]] ], tf.int16)

연산자 생성

연산자 생성 목적
a + b tf.add(a, b)
a * b tf.multiply(a, b)

변수 텐서 생성

변수 만들기 대상
무작위 값 tf.get_variable("var", [1, 2])
초기화된 첫 번째 값 tf.get_variable("var_init_2", dtype=tf.int32, initializer=[ [1, 2], [3, 4] ])

세션 열기

세션 대상
세션 만들기 tf.Session()
세션 실행 tf.Session.run()
텐서 평가 variable_name.eval()
세션 닫기 sess.close()
블록별 세션 with tf.Session() as sess:

자주 묻는 질문

접미사는 텐서를 생성한 연산의 출력 인덱스입니다. Const:0은 Const라는 이름의 연산의 첫 번째 출력을 의미합니다. 출력이 여러 개인 연산은 :0, :1 등으로 번호가 매겨집니다.

즉시 실행 모드에서는 텐서의 numpy() 메서드를 호출하거나 np.array()에 전달합니다. 여기에 제시된 그래프 및 세션 스타일에서는 sess.run()이 반환하는 값이 이미 텐서입니다. 눔 파이 정렬.

래그드 텐서는 일반 텐서와 달리 길이가 서로 다른 행을 저장할 수 있습니다. `tf.ragged.constant`를 사용하여 생성되며, 문장과 같이 길이가 가변적인 데이터에 적합합니다. 이러한 경우 모든 행의 너비를 하나로 채우면 메모리가 낭비되기 때문입니다.

TensorFlow는 브로드캐스팅을 적용합니다. 즉, 가장 뒤쪽 차원부터 역순으로 도형을 비교하고 길이가 1인 축을 늘려 일치시킵니다. 이러한 방식으로 정렬할 수 없는 도형은 추측하는 대신 InvalidArgumentError를 발생시킵니다.

TensorFlow는 연산을 자동으로 가시적인 GPU에 배치합니다. 특정 장치를 강제로 지정하려면 코드를 `tf.device('/GPU:0')` 블록으로 감싸세요. 먼저 `tf.config.list_physical_devices('GPU')`를 사용하여 장치가 실제로 감지되었는지 확인하세요.

둘 다 타입이 지정된 n차원 데이터를 저장하지만, 텐서는 불변이며 GPU나 TPU에서 사용할 수 있고, 적용된 연산 내역을 기록하여 기울기를 계산할 수 있도록 합니다. 반면 NumPy 배열은 이 세 가지 기능을 모두 제공하지 않습니다.

정적 타입 검사기와 셰이프 어노테이션 라이브러리는 선언된 셰이프를 코드의 연산과 비교하여 실행 전에 불일치를 표시합니다. 에디터 도우미는 동일한 경고를 코드 내에 표시하여 시행착오를 최소화합니다.ping.

GitHub 부조종사 세션 및 플레이스홀더 코드의 빠른 재작성을 제안합니다. 각 제안을 검증하십시오. 실제 TensorFlow 2 대체 기능이 있는 경우에도 tf.compat.v1 shim을 제안하는 경우가 많습니다.

이 게시물을 요약하면 다음과 같습니다.