이 Techtalk에서는 TensorFlow 2.0으로 이전시 tf.estimator 에서 tf.keras로 이전해야 하는 이유에 대하여 설명합니다.
This Techtalk explains why you need to migrate from tf.estimator to tf.keras when moving to TensorFlow 2.0.
19. 누구나
Concept of tf.estimator is actually Good!!
❖ 딥러닝 코딩 에서 해야할 것 들
– 데이터 구현 →
– 을 위한 구현 →
– 루프 구현 → 으로 제공
– 모델 하는 부분을 구현 → 제공
– → 자동 제공
20. 누구나
Concept of tf.estimator is actually Good!!
❖ 딥러닝 코딩 에서 해야할 것 들
– 데이터 구현 →
– 을 위한 구현 →
– 루프 구현 → 으로 제공
– 모델 하는 부분을 구현 → 제공
– → 자동 제공
→ tf.estimator는
“One day, One model”을 위한 생산성 개선에 도움이
될께
분명할텐데...
21. Concept of tf.estimator is actually Good!!
from model import build_model
from dataloader import Dataloader # using tf.data.Dataset
def model_fn(features, labels, mode, params):
# Define the model to construct the logits
logits = build_model(features)
loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
def main():
config = tf.estimator.RunConfig(#...)
train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training)
estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config)
estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps)
estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt)
estimator.export_savedmodel(#...)
22. Concept of tf.estimator is actually Good!!
from model import build_model
from dataloader import Dataloader # using tf.data.Dataset
def model_fn(features, labels, mode, params):
# Define the model to construct the logits
logits = build_model(features)
loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
def main():
config = tf.estimator.RunConfig(#...)
train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training)
estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config)
estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps)
estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt)
estimator.export_savedmodel(#...)
23. Concept of tf.estimator is actually Good!!
from model import build_model
from dataloader import Dataloader # using tf.data.Dataset
def model_fn(features, labels, mode, params):
# Define the model to construct the logits
logits = build_model(features)
loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
train_op = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
def main():
config = tf.estimator.RunConfig(#...)
train_dataset = Dataloader(data_dir = traindata_dir, is_training = is_training)
estimator = tf.estimator.Estimator(model_dir=model_dir,model_fn=model_fn,config=config)
estimator.train(input_fn=train_dataset.input_fn, max_steps=train_steps)
estimator.eval(input_fn=train_dataset.input_fn, steps=eval_steps, checkpoint_path=ckpt)
estimator.export_savedmodel(#...)
사실 Dataloader도 한번
개발해 놓으면 재활용
가능하고
build_model()에만 집중하면
됨
24. 누구나
Concept of tf.estimator is actually Good!!
❖ 사실 컨셉은 와 같음
- 훌륭하게 잘 설계된
-
tf.Estimator.estimator tf.keras
loss / opt /
eval_metric
config
model_fn() model.compile()
train /eval estimator.train()
/estimator.eval()
model.fit()
predict estimator.predict() model.predict()
savedmodel
export
estimator.export_savedmodel() tf.contrib.saved_model.save
.keras_model()
26. 누구나
Concept of tf.estimator is actually Good!!
❖ 그럼에도 불구하고 가 잘 사용되지 않는 이유
– 너무나 빠른 변화에 지친 사용자
• 이제 방식에 익숙해진 유저에게 다시 또 새로운
스타일을 강제함
– 반드시 같이 써야하는 의 사용 난이도
• 한번 읽어 보시길 ㅠㅠ
https://www.tensorflow.org/guide/performance/datasets )
27. 누구나
Concept of tf.estimator is actually Good!!
❖ 그럼에도 불구하고 가 잘 사용되지 않는 이유
– 코드를 굳이 로
• 코드를 굳이 새로운 인 로 짤이유 없음
• 문법이 더 익숙한데
• 기능이 추가됨에 따라서 점점 복잡
– 가독성이 떨어짐
28. 누구나
Concept of tf.estimator is actually Good!!
❖ 요약하면…
❖ 는 아주 기술적으로 완성도 높은 였다
• 숙련된 개발자들이 사용하기에는 손색없음
❖ 하지만 다음과 같은 이유로 에서 되게 되었다
– 하지만 넓은 사용자 층에 대한 이해 부족 → 그들만의 리그
– 다른 프레임워크의 상황인식이 부족
31. ❖ 로 구현된 내 프로젝트를 어떻게 최소한의
노력으로 로 옮길 수 있을까
– → 는 구글이 로 제공함
• https://www.tensorflow.org/api_docs/python/tf/keras/estima
tor/model_to_estimator
– How about estimator → keras?
39. 로 다음과 같은 구조로
가능할까
build_model() 입출력을
- get_keras_model()에서
tf.keras.models.Model로
packaging
40. Packaging MyModel as a tf.keras.models.Model
class MyModel(object):
def __init__(self, args):
# Keras model에서 사용할 파라미터를 정의하는 부분
def build_model(self, inputs):
# model을 정의하는 부분
def build_model(self, inputs):
# tf.keras.models.Model로 packaging 하는 부분
41. Packaging MyModel as a tf.keras.models.Model
class MyModel(object):
def __init__(self, args):
self.model = None
def build_model(self, inputs):
net = tf.keras.layers.Embedding()(inputs)
…
return outputs = tf.keras.layers.Dense()(net)
def get_keras_model (self):
input = tf.keras.layers.Input(shape=...)
output = self.get_keras_model(input)
self.model = tf.keras.models.Model(inputs=input,outputs=output)
return self.model
42. 해야 할일을 정리하면
❖ 안되있는 경우 파트를 독립적으로 분리한다
❖ 안되있는 경우 를 분리한다
❖ 으로 모델 인스턴스 생성
–
–
❖ 와 으로 훈련한다
43. 주의 사항
❖ 몇가지
– 로 구현한 코드와는 호환되지 않음
•
• 호환
– 대부분의 와는 호환할듯 전부 미확인
• 의 대부분과 호환
• 도 호환될듯 미확인
– 아직 이 동일 하게 생성됐는지 미확인
44. 주의 사항
❖ 몇가지
– 로 구현한 코드와는 호환되지 않음
•
• 호환
– 대부분의 와는 호환할듯 전부 미확인
• 의 대부분과 호환
• 도 호환될듯 미확인
– 아직 이 동일 하게 생성됐는지 미확인
45. 그럼 로 구현한 모델은 어떻하나요
❖ 일단 로는 변환이 어려움
– → 의
프로토콜은 적용 불가능
46. 그럼 로 구현한 모델은 어떻하나요
❖ 에서 다른 훈련 방법도 제공
– 로 가능
– 변화 때문에 날 수도 있음
@ tf.function
def train(model,dataset,optimizer):
for x, y in dataset:
with tf.GradientTape() as tape:
prediction = model(x)
loss = loss_fn(prediction,y)
grads = tape.gradient(target=tr_loss, sources=dnn.variables)
opt.apply_gradients(grads, model.variables)
47. 정리하면
❖ 로 구현된 모델
→ 로 변환 기존 프로젝트 구조 사용 가능
❖ 로 구현된 모델
– 로 변환 불가능
– 방식으로 진행
• 하지만 이경우도 의 변동 때문에 코드 수정 불가피
❖ 가장 좋은 것은 에서 로 저장해 놓고
불러오는것
– 이경우 코드 재사용 불가ㅠㅠ
48. 누구나
마치며
• 일부 엔지니어 개발자들만 잘 쓸 수 있는 오픈소스는 완성도에
상관없이 대중화 되기 힘들다
• 오픈소스를 대중화를 위해서는 지속적인 설명과 이해를 구하면서
사용자와 신뢰 쌓아가는 시간이 필요하다
• 이것은 대중화가 된 대부분의 오픈소스들이 겪어온 과정이다
• 의 교훈에서 는 이부분을 되돌아봐야 하지
않을까