TensorFlow 기본 사항: Tensor, 형태, 유형, 세션 및 Opera토르

텐서란 무엇입니까?

Tensorflow의 이름은 핵심 프레임워크인 Tensor에서 직접 파생되었습니다. Tensorflow에서는 모든 계산에 텐서가 포함됩니다. 텐서는 모든 유형의 데이터를 나타내는 n차원의 벡터 또는 행렬입니다. 텐서의 모든 값은 알려진(또는 부분적으로 알려진) 모양과 동일한 데이터 유형을 유지합니다. 데이터의 모양은 행렬이나 배열의 차원입니다.

텐서는 입력 데이터 또는 계산 결과에서 시작될 수 있습니다. TensorFlow에서 모든 연산은 그래프 내부에서 수행됩니다. 그래프는 연속적으로 수행되는 계산 집합입니다. 각 연산은 op 노드라고 하며 서로 연결되어 있습니다.

그래프는 노드 간의 ops와 연결을 간략하게 설명합니다. 그러나 값은 표시하지 않습니다. 노드의 에지는 텐서, 즉 ​​데이터로 작업을 채우는 방법입니다.

머신 러닝에서 모델은 피처 벡터라고 하는 객체 목록으로 피드됩니다. 피처 벡터는 모든 데이터 유형일 수 있습니다. 피처 벡터는 일반적으로 텐서를 채우는 기본 입력이 됩니다. 이러한 값은 텐서를 통해 연산 노드로 흐르고 이 연산/계산의 결과는 새 텐서를 생성하여 새 연산에 사용됩니다. 이러한 모든 연산은 그래프에서 볼 수 있습니다.

텐서의 표현

TensorFlow에서 텐서는 n차원의 특징 벡터(즉, 배열) 모음입니다. 예를 들어, 2부터 3까지의 값을 갖는 1×6 행렬이 있다면 다음과 같이 씁니다.

텐서의 표현
텐서의 표현

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

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

1부터 8까지의 값을 갖는 XNUMX차원 행렬을 생성하면 다음과 같습니다.

텐서의 표현

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

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

참고 : 텐서는 스칼라로 표현될 수도 있고 XNUMX차원 이상의 모양을 가질 수도 있습니다. 더 높은 차원 수준을 시각화하는 것은 더 복잡합니다.

텐서의 유형

TensorFlow에서 모든 계산은 하나 이상의 텐서를 통과합니다. tf.tensor는 세 가지 속성을 가진 객체입니다:

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

TensorFlow로 수행하는 각 작업에는 텐서 조작이 포함됩니다. 생성할 수 있는 주요 텐서 유형은 네 가지가 있습니다.

  • tf.변수
  • tf.상수
  • tf.자리 표시자
  • tf.Sparse텐서

이 튜토리얼에서는 tf.constant와 tf.Variable을 생성하는 방법을 배웁니다.

튜토리얼을 진행하기 전에 TensorFlow로 conda 환경을 활성화했는지 확인하세요. 우리는 이 환경의 이름을 hello-tf로 지정했습니다.

MacOS 사용자의 경우:

source activate hello-tf

럭셔리 Windows 사용자:

activate hello-tf

이 작업을 완료하면 텐서플로우를 가져올 준비가 된 것입니다.

# Import tf
import tensorflow as tf

n차원의 텐서 생성

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

텐서를 생성하려면 아래 TensorFlow 텐서 모양 예와 같이 tf.constant()를 사용할 수 있습니다.

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)

n차원의 텐서 생성

# 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 1r1_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 모양은 1개의 열로만 구성되어 있음을 알 수 있습니다.

2개의 텐서 차원 배열을 만들려면 각 행 뒤에 괄호를 닫아야 합니다. 아래의 Keras 텐서 모양 예제를 확인하세요.

## 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)

매트릭스는 그림 XNUMX와 같습니다.

텐서의 모양

텐서를 인쇄하면 TensorFlow가 모양을 추측합니다. 그러나 TensorFlow 모양 속성을 사용하면 텐서의 모양을 얻을 수 있습니다.

아래에서는 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)

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

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

산출

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

주어진 행렬의 모양을 사용하여 3의 벡터를 만들 수 있습니다. 행렬 m_shape는 2×3 차원입니다. 다음 코드로 XNUMX로 채워진 XNUMX개의 행이 있는 텐서를 만들 수 있습니다.

# 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을 전달하면 m_shape 행렬의 열 수와 동일한 XNUMX의 벡터를 구성할 수 있습니다.

# 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)

마지막으로, 3개의 행렬만으로 2×XNUMX 행렬을 만들 수 있습니다.

print(tf.ones(m_shape.shape))

산출

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

데이터 유형

텐서의 두 번째 속성은 데이터 유형입니다. 텐서는 한 번에 한 가지 유형의 데이터만 가질 수 있습니다. 텐서는 한 가지 유형의 데이터만 가질 수 있습니다. dtype 속성을 사용하여 유형을 반환할 수 있습니다.

print(m_shape.dtype)

산출

<dtype: 'int32'>

어떤 경우에는 데이터 유형을 변경하고 싶을 때가 있습니다. TensorFlow에서는 tf.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: 'float32'>
<dtype: 'int32'>

TensorFlow는 텐서 생성 중에 인수가 지정되지 않은 경우 자동으로 데이터 유형을 선택합니다. TensorFlow는 가장 가능성이 높은 데이터 유형이 무엇인지 추측합니다. 예를 들어, 텍스트를 전달하면 그것이 문자열이라고 추측하고 문자열로 변환합니다.

연산자 생성

유용한 TensorFlow 연산자

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

TensorFlow에는 모든 기본 연산이 들어 있습니다. 간단한 연산부터 시작할 수 있습니다. TensorFlow 메서드를 사용하여 숫자의 제곱을 계산합니다. 이 연산은 텐서를 구성하는 데 인수가 하나만 필요하기 때문에 간단합니다.

숫자의 제곱은 x를 부동 숫자로 사용하여 tf.sqrt(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.substract(a, b)
  • tf.곱하기(a, b)
  • tf.div(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.

예를 들어, 아래 코드는 두 개의 임의 값이 있는 XNUMX차원 변수를 생성합니다. 기본적으로 TensorFlow는 임의의 값을 반환합니다. 변수 이름을 var로 지정합니다.

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

산출

(1, 2)

두 번째 예에서는 행 1,2개와 열 XNUMX개가 있는 변수를 만듭니다. 변수의 차원을 생성하려면 [XNUMX]를 사용해야 합니다.

이 텐서의 초기 값은 XNUMX입니다. 예를 들어 모델을 학습할 때 특성의 가중치를 계산하려면 초기 값이 필요합니다. 아래에서는 이러한 초기 값을 XNUMX으로 설정합니다.

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 matrixtensor_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에서 기본입니다. 모든 수학적 연산(ops)은 그래프 내부에서 수행됩니다. 그래프를 모든 연산이 수행되는 프로젝트로 생각할 수 있습니다. 노드는 이러한 ops를 나타내며, 새로운 텐서를 흡수하거나 생성할 수 있습니다.
텐서 텐서는 연산 간에 진행되는 데이터를 나타냅니다. 이전에 텐서를 초기화하는 방법을 살펴보았습니다. 상수와 변수의 차이점은 변수의 초기 값이 시간이 지남에 따라 변경된다는 것입니다.
세션 세션은 그래프에서 연산을 실행합니다. 그래프에 텐서 값을 공급하려면 세션을 열어야 합니다. 세션 내부에서 연산자를 실행하여 출력을 생성해야 합니다.

그래프와 세션은 독립적입니다. 세션을 실행하고 나중에 추가 계산에 사용할 값을 얻을 수 있습니다.

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

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

단계 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(곱하기): 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 설명

  • numpy를 np로 가져오기: 가져오기 numpy 라이브러리 데이터를 생성하기 위해
  • 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는 연산을 렌더링하기 위해 천재적 접근 방식에 의존합니다. 모든 계산은 데이터 흐름 체계로 표현됩니다. 데이터 흐름 그래프는 개별 연산 간의 데이터 종속성을 확인하기 위해 개발되었습니다. 수학 공식이나 알고리즘은 여러 개의 연속적인 연산으로 구성됩니다. 그래프는 계산이 어떻게 조정되는지 시각화하는 편리한 방법입니다.

그래프는 노드가장자리. 노드는 연산의 표현, 즉 계산의 단위입니다. 에지는 텐서이며, 새로운 텐서를 생성하거나 입력 데이터를 소비할 수 있습니다. 개별 연산 간의 종속성에 따라 달라집니다.

그래프의 구조는 연산(즉, 노드)을 서로 연결하고, 연산이 어떻게 공급되는지를 보여줍니다. 그래프는 연산의 출력을 표시하지 않고, 개별 연산 간의 연결을 시각화하는 데만 도움이 됩니다.

예를 봅시다.

다음 함수를 평가하고 싶다고 가정해 보겠습니다.

그래프

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

TensorFlow 그래프 예

TensorFlow 그래프 예

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

예를 들어, add 연산은 and 전에는 할 수 없다는 것을 알 수 있습니다. 그래프는 다음과 같이 설명합니다.

  1. 계산하고 :
  2. 1)을 함께 추가
  3. 2)에 추가
  4. 3)을 추가하세요
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: 연산자를 구성하세요

이 예에서는 변수 값을 고정된 상태로 유지하도록 선택했습니다. 또한 함수 f의 상수 매개변수인 c라는 상수 텐서를 만들었습니다. 고정된 값 5를 사용합니다. 그래프에서 상수라는 텐서에서 이 매개변수를 볼 수 있습니다.

우리는 또한 연산자 tf.pow()의 거듭제곱에 대한 상수 텐서를 구성했습니다. 반드시 그럴 필요는 없습니다. 그래프에서 텐서의 이름을 볼 수 있도록 했습니다. 그것은 square라고 불리는 원입니다.

그래프를 통해 텐서에서 어떤 일이 발생하고 어떻게 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.곱하기(a, b)

변수 텐서 생성

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

세션 열기

세션 대상
세션 만들기 tf.세션()
세션 실행 tf.Session.run()
텐서 평가 변수_이름.eval()
세션 닫기 sess.close()
블록별 세션 tf.Session()을 sess로 사용:

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