본문 바로가기
Machine Learning/Tensorflow & Keras

[Keras] model.predict(x) vs model(x)

by devson 2024. 5. 12.

model.predict(x)

  • batch로 데이터를 처리하기 때문에 큰 데이터에 대해서도 확장(scale)할 수 있는 방법이다.
  • 출력을 NumPy 배열로 리턴한다.
    • 코드는 대략적으로 아래와 같은 형태라고 볼 수 있다.
def predict(x):
    y_batches = [] # batch 처리
    for x_batch in get_batches(x):
        y_batch = model(x).numpy() # <= NumPy 배열로 변환
        y_batches.append(y_batch)
    return np.concatenate(y_batches)
  • 미분이 불가능하다.
    • 그렇기에 GradientTape scope에서 gradient를 구할 수 없다.
    • 출력만 필요한 경우엔 model.predict(x)를 사용하도록 한다.

 

model(x)

  • tf.Tensor로 리턴한다.
  • 미분이 가능하며 model(x) 를 통해 gradient를 구할 수 있다. 
    • model 학습 시에 사용하도록 한다.

 

코드 예제

이 차이를 코드로 직접 확인해보자.

  • 먼저 model과 사용할 데이터를 가져온다.
import tensorflow as tf
import numpy as np

# load model
model = tf.keras.applications.xception.Xception(
    weights="imagenet",
    include_top=False,
)

# load image data
image_file_path = tf.keras.utils.get_file(
    fname="cat.jpg",
    origin="https://img-datasets.s3.amazonaws.com/cat.jpg")
image_file = tf.keras.utils.load_img(image_file_path, target_size=(180, 180))
x = tf.keras.utils.img_to_array(image_file)
x = np.expand_dims(x, axis=0) # batch data 형태로 변경 | shape (180, 180, 3) -> (1, 180, 180, 3)

 

  • 그리고 각 방법에 따른 리턴 타입을 비교해본다.
# compare return type
print(type(model.predict(x))) # numpy.ndarray
print(type(model(x))) # tensorflow.python.framework.ops.EagerTensor

 

  • 또한 GradientTape을 사용하여 gradient를 구할 수 있는지 비교해본다.
# compare differentiability
x = tf.convert_to_tensor(x)

with tf.GradientTape() as tape:
  y = model.predict(x)
tape.gradient(y, x) # occurs LookupError: No gradient defined for operation'IteratorGetNext'

with tf.GradientTape() as tape:
  y = model(x)
tape.gradient(y, x) # works fine

 


 

참고

- https://keras.io/getting_started/faq/#whats-the-difference-between-model-methods-predict-and-call

- https://stackoverflow.com/questions/60837962/confusion-about-keras-model-call-vs-call-vs-predict-methods

 

댓글