Google I/O는 끝입니다! TensorFlow 세션 확인하기 세션 보기

TensorFlow 기본 사항

TensorFlow.org에서 보기 Google Colab에서 실행 GitHub에서 소스 보기 노트북 다운로드

이 가이드는 TensorFlow 기본 사항 에 대한 간략한 개요를 제공합니다. 이 문서의 각 섹션은 더 큰 주제의 개요입니다. 각 섹션의 끝에 전체 가이드에 대한 링크를 찾을 수 있습니다.

TensorFlow는 기계 학습을 위한 종단 간 플랫폼입니다. 다음을 지원합니다.

  • 다차원 배열 기반 숫자 계산( NumPy 와 유사)
  • GPU 및 분산 처리
  • 자동 미분
  • 모델 구성, 교육 및 내보내기
  • 그리고 더

텐서

TensorFlow는 tf.Tensor 객체로 표현되는 다차원 배열 또는 텐서 에서 작동합니다. 다음은 2차원 텐서입니다.

import tensorflow as tf

x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.]])

print(x)
print(x.shape)
print(x.dtype)
tf.Tensor(
[[1. 2. 3.]
 [4. 5. 6.]], shape=(2, 3), dtype=float32)
(2, 3)
<dtype: 'float32'>

tf.Tensor 의 가장 중요한 속성은 shapedtype .

  • Tensor.shape : 각 축을 따라 텐서의 크기를 알려줍니다.
  • Tensor.dtype : 텐서에 있는 모든 요소의 유형을 알려줍니다.

TensorFlow는 텐서에 대한 표준 수학 연산과 머신 러닝에 특화된 많은 연산을 구현합니다.

예를 들어:

x + x
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[ 2.,  4.,  6.],
       [ 8., 10., 12.]], dtype=float32)>
5 * x
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[ 5., 10., 15.],
       [20., 25., 30.]], dtype=float32)>
x @ tf.transpose(x)
<tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[14., 32.],
       [32., 77.]], dtype=float32)>
tf.concat([x, x, x], axis=0)
<tf.Tensor: shape=(6, 3), dtype=float32, numpy=
array([[1., 2., 3.],
       [4., 5., 6.],
       [1., 2., 3.],
       [4., 5., 6.],
       [1., 2., 3.],
       [4., 5., 6.]], dtype=float32)>
tf.nn.softmax(x, axis=-1)
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[0.09003057, 0.24472848, 0.6652409 ],
       [0.09003057, 0.24472848, 0.6652409 ]], dtype=float32)>
tf.reduce_sum(x)
<tf.Tensor: shape=(), dtype=float32, numpy=21.0>

CPU에서 대규모 계산을 실행하면 느릴 수 있습니다. 적절하게 구성되면 TensorFlow는 GPU와 같은 가속기 하드웨어를 사용하여 작업을 매우 빠르게 실행할 수 있습니다.

if tf.config.list_physical_devices('GPU'):
  print("TensorFlow **IS** using the GPU")
else:
  print("TensorFlow **IS NOT** using the GPU")
TensorFlow **IS** using the GPU

자세한 내용은 텐서 가이드 를 참조하세요.

변수

일반 tf.Tensor 객체는 변경할 수 없습니다. TensorFlow에 모델 가중치(또는 기타 변경 가능한 상태)를 저장하려면 tf.Variable 을 사용하세요.

var = tf.Variable([0.0, 0.0, 0.0])
var.assign([1, 2, 3])
<tf.Variable 'UnreadVariable' shape=(3,) dtype=float32, numpy=array([1., 2., 3.], dtype=float32)>
var.assign_add([1, 1, 1])
<tf.Variable 'UnreadVariable' shape=(3,) dtype=float32, numpy=array([2., 3., 4.], dtype=float32)>

자세한 내용은 변수 가이드 를 참조하세요.

자동 미분

경사하강 법 및 관련 알고리즘은 현대 기계 학습의 초석입니다.

이를 활성화하기 위해 TensorFlow는 미적분을 사용하여 기울기를 계산하는 자동 미분(autodiff)을 구현합니다. 일반적으로 이것을 사용하여 가중치에 대한 모델 오류 또는 손실 의 기울기를 계산합니다.

x = tf.Variable(1.0)

def f(x):
  y = x**2 + 2*x - 5
  return y
f(x)
<tf.Tensor: shape=(), dtype=float32, numpy=-2.0>

x = 1.0 에서 y = f(x) = (1**2 + 2*1 - 5) = -2

y의 도함수는 y y' = f'(x) = (2*x + 2) = 4 입니다. TensorFlow는 이를 자동으로 계산할 수 있습니다.

with tf.GradientTape() as tape:
  y = f(x)

g_x = tape.gradient(y, x)  # g(x) = dy/dx

g_x
<tf.Tensor: shape=(), dtype=float32, numpy=4.0>

이 단순화된 예는 단일 스칼라( x )에 대한 도함수만 취하지만 TensorFlow는 임의의 수의 비 스칼라 텐서에 대한 기울기를 동시에 계산할 수 있습니다.

자세한 내용은 Autodiff 가이드 를 참조하세요.

그래프 및 tf.function

다른 Python 라이브러리처럼 TensorFlow를 대화식으로 사용할 수 있지만 TensorFlow는 다음을 위한 도구도 제공합니다.

  • 성능 최적화 : 훈련 및 추론 속도를 높입니다.
  • 내보내기 : 학습이 완료되면 모델을 저장할 수 있습니다.

이를 위해서는 tf.function 을 사용하여 Python에서 순수 TensorFlow 코드를 분리해야 합니다.

@tf.function
def my_func(x):
  print('Tracing.\n')
  return tf.reduce_sum(x)

tf.function 을 처음 실행하면 Python에서 실행되지만 함수 내에서 수행된 TensorFlow 계산을 나타내는 최적화된 완전 그래프를 캡처합니다.

x = tf.constant([1, 2, 3])
my_func(x)
Tracing.
<tf.Tensor: shape=(), dtype=int32, numpy=6>

후속 호출에서 TensorFlow는 최적화된 그래프만 실행하고 TensorFlow가 아닌 ​​단계는 건너뜁니다. 아래에서 my_funcprint 가 TensorFlow 함수가 아니라 Python 함수이기 때문에 추적 을 인쇄하지 않습니다.

x = tf.constant([10, 9, 8])
my_func(x)
<tf.Tensor: shape=(), dtype=int32, numpy=27>

그래프는 서명 이 다른 입력( shapedtype )에 대해 재사용할 수 없으므로 대신 새 그래프가 생성됩니다.

x = tf.constant([10.0, 9.1, 8.2], dtype=tf.float32)
my_func(x)
Tracing.
<tf.Tensor: shape=(), dtype=float32, numpy=27.3>

이러한 캡처된 그래프는 두 가지 이점을 제공합니다.

  • 많은 경우에 실행 속도가 크게 향상됩니다(이 사소한 예는 아님).
  • tf.saved_model 을 사용하여 이러한 그래프를 내보내 서버모바일 장치 와 같은 다른 시스템에서 실행할 수 있으며 Python 설치가 필요하지 않습니다.

자세한 내용 은 그래프 소개를 참조하세요.

모듈, 레이어 및 모델

tf.Moduletf.function tf.Variable 를 관리하기 위한 클래스입니다. tf.Module 클래스는 두 가지 중요한 기능을 지원하는 데 필요합니다.

  1. tf.train.Checkpoint 를 사용하여 변수 값을 저장하고 복원할 수 있습니다. 모델의 상태를 빠르게 저장하고 복원할 수 있으므로 훈련 중에 유용합니다.
  2. tf.saved_model 을 사용하여 tf.Variable tf.function 그래프를 가져오고 내보낼 수 있습니다. 이를 통해 모델을 생성한 Python 프로그램과 독립적으로 모델을 실행할 수 있습니다.

다음은 간단한 tf.Module 객체를 내보내는 완전한 예입니다.

class MyModule(tf.Module):
  def __init__(self, value):
    self.weight = tf.Variable(value)

  @tf.function
  def multiply(self, x):
    return x * self.weight
mod = MyModule(3)
mod.multiply(tf.constant([1, 2, 3]))
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([3, 6, 9], dtype=int32)>

Module 저장:

save_path = './saved'
tf.saved_model.save(mod, save_path)
INFO:tensorflow:Assets written to: ./saved/assets
2022-01-19 02:29:48.135588: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.

결과로 생성된 SavedModel은 생성한 코드와 무관합니다. Python, 다른 언어 바인딩 또는 TensorFlow Serving 에서 저장된 모델을 로드할 수 있습니다. TensorFlow Lite 또는 TensorFlow JS 와 함께 실행되도록 변환할 수도 있습니다.

reloaded = tf.saved_model.load(save_path)
reloaded.multiply(tf.constant([1, 2, 3]))
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([3, 6, 9], dtype=int32)>

tf.keras.layers.Layertf.keras.Model 클래스는 tf.Module 을 기반으로 빌드, 모델 구축, 교육 및 저장을 위한 추가 기능 및 편리한 방법을 제공합니다. 이들 중 일부는 다음 섹션에서 설명합니다.

자세한 내용 은 모듈 소개를 참조하세요.

훈련 루프

이제 이 모든 것을 결합하여 기본 모델을 만들고 처음부터 훈련시키십시오.

먼저 몇 가지 예제 데이터를 만듭니다. 이것은 2차 곡선을 느슨하게 따르는 점 구름을 생성합니다.

import matplotlib
from matplotlib import pyplot as plt

matplotlib.rcParams['figure.figsize'] = [9, 6]
x = tf.linspace(-2, 2, 201)
x = tf.cast(x, tf.float32)

def f(x):
  y = x**2 + 2*x - 5
  return y

y = f(x) + tf.random.normal(shape=[201])

plt.plot(x.numpy(), y.numpy(), '.', label='Data')
plt.plot(x, f(x),  label='Ground truth')
plt.legend();

png

모델 만들기:

class Model(tf.keras.Model):
  def __init__(self, units):
    super().__init__()
    self.dense1 = tf.keras.layers.Dense(units=units,
                                        activation=tf.nn.relu,
                                        kernel_initializer=tf.random.normal,
                                        bias_initializer=tf.random.normal)
    self.dense2 = tf.keras.layers.Dense(1)

  def call(self, x, training=True):
    # For Keras layers/models, implement `call` instead of `__call__`.
    x = x[:, tf.newaxis]
    x = self.dense1(x)
    x = self.dense2(x)
    return tf.squeeze(x, axis=1)
model = Model(64)
plt.plot(x.numpy(), y.numpy(), '.', label='data')
plt.plot(x, f(x),  label='Ground truth')
plt.plot(x, model(x), label='Untrained predictions')
plt.title('Before training')
plt.legend();

png

기본 훈련 루프 작성:

variables = model.variables

optimizer = tf.optimizers.SGD(learning_rate=0.01)

for step in range(1000):
  with tf.GradientTape() as tape:
    prediction = model(x)
    error = (y-prediction)**2
    mean_error = tf.reduce_mean(error)
  gradient = tape.gradient(mean_error, variables)
  optimizer.apply_gradients(zip(gradient, variables))

  if step % 100 == 0:
    print(f'Mean squared error: {mean_error.numpy():0.3f}')
Mean squared error: 16.123
Mean squared error: 0.997
Mean squared error: 0.964
Mean squared error: 0.946
Mean squared error: 0.932
Mean squared error: 0.921
Mean squared error: 0.913
Mean squared error: 0.907
Mean squared error: 0.901
Mean squared error: 0.897
plt.plot(x.numpy(),y.numpy(), '.', label="data")
plt.plot(x, f(x),  label='Ground truth')
plt.plot(x, model(x), label='Trained predictions')
plt.title('After training')
plt.legend();

png

그것은 작동하지만 tf.keras 모듈에서 일반적인 교육 유틸리티의 구현을 사용할 수 있음을 기억하십시오. 따라서 직접 작성하기 전에 사용하는 것을 고려하십시오. 먼저 Model.compileModel.fit 메서드는 다음과 같은 훈련 루프를 구현합니다.

new_model = Model(64)
new_model.compile(
    loss=tf.keras.losses.MSE,
    optimizer=tf.optimizers.SGD(learning_rate=0.01))

history = new_model.fit(x, y,
                        epochs=100,
                        batch_size=32,
                        verbose=0)

model.save('./my_model')
INFO:tensorflow:Assets written to: ./my_model/assets
plt.plot(history.history['loss'])
plt.xlabel('Epoch')
plt.ylim([0, max(plt.ylim())])
plt.ylabel('Loss [Mean Squared Error]')
plt.title('Keras training progress');

png

자세한 내용은 기본 교육 루프Keras 가이드 를 참조하세요.