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
댓글