หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

ย้ายรหัส TensorFlow 1 ของคุณไปยัง TensorFlow 2

ดูใน TensorFlow.org เรียกใช้ใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก

เอกสารนี้สำหรับผู้ใช้ TensorFlow API ระดับต่ำ หากคุณใช้ API ระดับสูง ( tf.keras ) อาจมีการดำเนินการเพียงเล็กน้อยหรือไม่มีเลยที่คุณต้องดำเนินการเพื่อให้โค้ดของคุณเข้ากันได้กับ TensorFlow 2.0 อย่างสมบูรณ์:

ยังคงเป็นไปได้ที่จะเรียกใช้โค้ด 1.X โดยไม่ได้แก้ไข ( ยกเว้นการสนับสนุน ) ใน TensorFlow 2.0:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

อย่างไรก็ตามสิ่งนี้ไม่อนุญาตให้คุณใช้ประโยชน์จากการปรับปรุงมากมายที่เกิดขึ้นใน TensorFlow 2.0 คู่มือนี้จะช่วยให้คุณอัปเกรดโค้ดของคุณทำให้ง่ายขึ้นมีประสิทธิภาพมากขึ้นและดูแลรักษาง่ายขึ้น

สคริปต์การแปลงอัตโนมัติ

ขั้นตอนแรกก่อนที่จะพยายามใช้การเปลี่ยนแปลงที่อธิบายไว้ในเอกสารนี้คือการลองรัน สคริปต์การอัพเกรด

การดำเนินการนี้จะส่งผ่านขั้นต้นในการอัปเกรดโค้ดของคุณเป็น TensorFlow 2.0 แต่มันไม่สามารถทำให้รหัสสำนวนของคุณเป็น 2.0 ได้ โค้ดของคุณอาจยังคงใช้ประโยชน์จากปลายทาง tf.compat.v1 เพื่อเข้าถึงตัวยึดเซสชันคอลเลกชันและฟังก์ชันรูปแบบ 1.x อื่น ๆ

การเปลี่ยนแปลงพฤติกรรมระดับบนสุด

หากโค้ดของคุณทำงานใน TensorFlow 2.0 โดยใช้ tf.compat.v1.disable_v2_behavior() ว่ายังมีการเปลี่ยนแปลงพฤติกรรมทั่วโลกที่คุณอาจต้องแก้ไข การเปลี่ยนแปลงที่สำคัญ ได้แก่

  • การดำเนินการอย่างกระตือรือร้น v1.enable_eager_execution() : โค้ดใด ๆ ที่ใช้ tf.Graph โดยปริยายจะล้มเหลว อย่าลืมใส่โค้ดนี้ with tf.Graph().as_default()

  • ตัวแปรทรัพยากร v1.enable_resource_variables() : โค้ดบางตัวอาจขึ้นอยู่กับพฤติกรรมที่ไม่ใช่ปัจจัยที่เปิดใช้งานโดยตัวแปรอ้างอิง TF ตัวแปรทรัพยากรจะถูกล็อคในขณะที่เขียนถึงดังนั้นจึงให้การรับประกันความสอดคล้องที่ใช้งานง่ายมากขึ้น

    • สิ่งนี้อาจเปลี่ยนพฤติกรรมในกรณีขอบ
    • ซึ่งอาจสร้างสำเนาเพิ่มเติมและสามารถใช้หน่วยความจำได้สูงขึ้น
    • สามารถปิดใช้งานได้โดยส่ง use_resource=False ไปยัง tf.Variable constructor
  • รูปร่างของเทนเซอร์ v1.enable_v2_tensorshape() : TF 2.0 ช่วยลดความซับซ้อนของรูปทรงของเทนเซอร์ แทน t.shape[0].value t.shape[0] คุณสามารถพูดว่า t.shape[0] การเปลี่ยนแปลงเหล่านี้ควรมีขนาดเล็กและควรแก้ไขทันที ดู TensorShape สำหรับตัวอย่าง

  • โฟลว์การควบคุม v1.enable_control_flow_v2() : การนำโฟลว์การควบคุม TF 2.0 ไปใช้งานได้ง่ายขึ้นและสร้างการแสดงกราฟที่แตกต่างกัน โปรดส่ง ข้อบกพร่อง สำหรับปัญหาใด ๆ

สร้างรหัส 2.0-native

คู่มือนี้จะอธิบายถึงตัวอย่างต่างๆของการแปลงรหัส TensorFlow 1.x เป็น TensorFlow 2.0 การเปลี่ยนแปลงเหล่านี้จะช่วยให้โค้ดของคุณใช้ประโยชน์จากการเพิ่มประสิทธิภาพและการเรียก API ที่ง่ายขึ้น

ในแต่ละกรณีรูปแบบคือ:

1. แทนที่การโทร v1.Session.run

ทุกการเรียก v1.Session.run ควรถูกแทนที่ด้วยฟังก์ชัน Python

  • feed_dict และ v1.placeholder กลายเป็นอาร์กิวเมนต์ของฟังก์ชัน
  • การ fetches จะกลายเป็นค่าส่งกลับของฟังก์ชัน
  • ในระหว่างการดำเนินการแปลงอย่างกระตือรือร้นช่วยให้สามารถแก้ไขจุดบกพร่องได้ง่ายด้วยเครื่องมือ Python มาตรฐานเช่น pdb

หลังจากนั้นเพิ่มมัณฑนากร tf.function เพื่อให้ทำงานได้อย่างมีประสิทธิภาพในกราฟ ดู คู่มือ Autograph สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงาน

โปรดทราบว่า:

  • ซึ่งแตกต่างจาก v1.Session.run tf.function มีลายเซ็นส่งคืนคงที่และส่งกลับผลลัพธ์ทั้งหมด หากสิ่งนี้ทำให้เกิดปัญหาด้านประสิทธิภาพให้สร้างฟังก์ชันแยกกันสองฟังก์ชัน

  • ไม่จำเป็นต้องมี tf.control_dependencies หรือการดำเนินการที่คล้ายกัน: tf.function จะทำงานเหมือนกับว่ามีการรันตามลำดับที่เขียนไว้ tf.Variable assignments และ tf.assert s เป็นต้นจะดำเนินการโดยอัตโนมัติ

ส่วนรูปแบบการแปลง มีตัวอย่างการทำงานของกระบวนการแปลงนี้

2. ใช้วัตถุ Python เพื่อติดตามตัวแปรและการสูญเสีย

ไม่แนะนำให้ใช้การติดตามตัวแปรตามชื่อทั้งหมดใน TF 2.0 ใช้วัตถุ Python เพื่อติดตามตัวแปร

ใช้ tf.Variable แทน v1.get_variable

ทุก v1.variable_scope ควรถูกแปลงเป็นวัตถุ Python โดยทั่วไปแล้วจะเป็นหนึ่งใน:

หากคุณต้องการรายชื่อรวมของตัวแปร (เช่น tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ) ให้ใช้ .variables และ .trainable_variables แอตทริบิวต์ของ Layer และ Model วัตถุ

คลาส Layer และ Model เหล่านี้ใช้คุณสมบัติอื่น ๆ อีกมากมายที่ขจัดความจำเป็นในการรวบรวมส่วนกลาง คุณสมบัติ. .losses ของพวกเขาสามารถทดแทนการใช้คอลเลกชัน tf.GraphKeys.LOSSES

ดู คำแนะนำ Keras สำหรับรายละเอียด

3. อัปเกรดลูปการฝึกของคุณ

ใช้ API ระดับสูงสุดที่เหมาะกับกรณีการใช้งานของคุณ ชอบ tf.keras.Model.fit มากกว่าสร้างลูปการฝึกของคุณเอง

ฟังก์ชันระดับสูงเหล่านี้จัดการรายละเอียดระดับต่ำจำนวนมากซึ่งอาจพลาดได้ง่ายหากคุณเขียนลูปการฝึกอบรมของคุณเอง ตัวอย่างเช่นพวกเขารวบรวมการสูญเสียการทำให้เป็นมาตรฐานโดยอัตโนมัติและตั้งค่าอาร์กิวเมนต์ training=True เมื่อเรียกใช้โมเดล

4. อัพเกรดท่อป้อนข้อมูลของคุณ

ใช้ชุดข้อมูล tf.data สำหรับการป้อนข้อมูล วัตถุเหล่านี้มีประสิทธิภาพแสดงออกและรวมเข้ากับเทนเซอร์โฟลว์ได้ดี

สามารถส่งผ่านไปยังเมธอด tf.keras.Model.fit ได้โดยตรง

model.fit(dataset, epochs=5)

สามารถทำซ้ำผ่าน Python มาตรฐานโดยตรง:

for example_batch, label_batch in dataset:
    break

5. ย้ายสัญลักษณ์ compat.v1 ออก

โมดูล tf.compat.v1 มี TensorFlow 1.x API ที่สมบูรณ์พร้อมความหมายดั้งเดิม

สคริปต์อัปเกรด TF2 จะแปลงสัญลักษณ์เป็น 2.0 ที่เทียบเท่าหากการแปลงดังกล่าวปลอดภัยกล่าวคือหากสามารถระบุได้ว่าลักษณะการทำงานของเวอร์ชัน 2.0 นั้นเทียบเท่ากันทุก v1.arg_max (ตัวอย่างเช่นจะเปลี่ยนชื่อ v1.arg_max เป็น tf.argmax ตั้งแต่ ซึ่งเป็นฟังก์ชันเดียวกัน)

หลังจากสคริปต์อัปเกรดเสร็จสิ้นด้วยโค้ดชิ้นหนึ่งมีแนวโน้มว่าจะมีการกล่าวถึง compat.v1 มากมาย มันคุ้มค่าที่จะผ่านรหัสและแปลงสิ่งเหล่านี้ด้วยตนเองให้เทียบเท่า 2.0 (ควรระบุไว้ในบันทึกหากมี)

การแปลงโมเดล

ตัวแปรระดับต่ำและการดำเนินการของตัวดำเนินการ

ตัวอย่างการใช้ API ระดับต่ำ ได้แก่ :

  • โดยใช้ขอบเขตตัวแปรเพื่อควบคุมการใช้ซ้ำ
  • การสร้างตัวแปรด้วย v1.get_variable
  • เข้าถึงคอลเล็กชันอย่างชัดเจน
  • การเข้าถึงคอลเลกชันโดยปริยายด้วยวิธีการเช่น:

  • ใช้ v1.placeholder เพื่อตั้งค่าอินพุตกราฟ

  • เรียกใช้กราฟด้วย Session.run

  • เริ่มต้นตัวแปรด้วยตนเอง

ก่อนที่จะแปลง

นี่คือลักษณะของรูปแบบเหล่านี้ในโค้ดโดยใช้ TensorFlow 1.x

import tensorflow as tf
import tensorflow.compat.v1 as v1

import tensorflow_datasets as tfds
g = v1.Graph()

with g.as_default():
  in_a = v1.placeholder(dtype=v1.float32, shape=(2))
  in_b = v1.placeholder(dtype=v1.float32, shape=(2))

  def forward(x):
    with v1.variable_scope("matmul", reuse=v1.AUTO_REUSE):
      W = v1.get_variable("W", initializer=v1.ones(shape=(2,2)),
                          regularizer=lambda x:tf.reduce_mean(x**2))
      b = v1.get_variable("b", initializer=v1.zeros(shape=(2)))
      return W * x + b

  out_a = forward(in_a)
  out_b = forward(in_b)
  reg_loss=v1.losses.get_regularization_loss(scope="matmul")

with v1.Session(graph=g) as sess:
  sess.run(v1.global_variables_initializer())
  outs = sess.run([out_a, out_b, reg_loss],
                feed_dict={in_a: [1, 0], in_b: [0, 1]})

print(outs[0])
print()
print(outs[1])
print()
print(outs[2])
[[1. 0.]
 [1. 0.]]

[[0. 1.]
 [0. 1.]]

1.0

หลังจากแปลง

ในรหัสที่แปลงแล้ว:

  • ตัวแปรคือวัตถุ Python ในเครื่อง
  • ฟังก์ชัน forward ยังคงกำหนดการคำนวณ
  • การเรียก Session.run จะถูกแทนที่ด้วยการโทรเพื่อ forward
  • สามารถเพิ่มมัณฑนากร tf.function เสริมเพื่อประสิทธิภาพ
  • การจัดลำดับจะคำนวณด้วยตนเองโดยไม่อ้างถึงคอลเล็กชันส่วนกลางใด ๆ
  • ไม่มีเซสชันหรือตัวยึด
W = tf.Variable(tf.ones(shape=(2,2)), name="W")
b = tf.Variable(tf.zeros(shape=(2)), name="b")

@tf.function
def forward(x):
  return W * x + b

out_a = forward([1,0])
print(out_a)
tf.Tensor(
[[1. 0.]
 [1. 0.]], shape=(2, 2), dtype=float32)

out_b = forward([0,1])

regularizer = tf.keras.regularizers.l2(0.04)
reg_loss=regularizer(W)

โมเดลตาม tf.layers

โมดูล v1.layers ใช้เพื่อบรรจุฟังก์ชันเลเยอร์ที่อาศัย v1.variable_scope เพื่อกำหนดและนำตัวแปรกลับมาใช้ใหม่

ก่อนที่จะแปลง

def model(x, training, scope='model'):
  with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
    x = v1.layers.conv2d(x, 32, 3, activation=v1.nn.relu,
          kernel_regularizer=lambda x:0.004*tf.reduce_mean(x**2))
    x = v1.layers.max_pooling2d(x, (2, 2), 1)
    x = v1.layers.flatten(x)
    x = v1.layers.dropout(x, 0.1, training=training)
    x = v1.layers.dense(x, 64, activation=v1.nn.relu)
    x = v1.layers.batch_normalization(x, training=training)
    x = v1.layers.dense(x, 10)
    return x
train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

print(train_out)
print()
print(test_out)
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:4: conv2d (from tensorflow.python.keras.legacy_tf_layers.convolutional) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.keras.layers.Conv2D` instead.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:424: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.__call__` method instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:5: max_pooling2d (from tensorflow.python.keras.legacy_tf_layers.pooling) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.MaxPooling2D instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:6: flatten (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Flatten instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:7: dropout (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.dropout instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:8: dense (from tensorflow.python.keras.legacy_tf_layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Dense instead.
WARNING:tensorflow:From <ipython-input-1-1c8189d0d453>:9: batch_normalization (from tensorflow.python.keras.legacy_tf_layers.normalization) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.BatchNormalization instead.  In particular, `tf.control_dependencies(tf.GraphKeys.UPDATE_OPS)` should not be used (consult the `tf.keras.layers.BatchNormalization` documentation).
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

tf.Tensor(
[[ 0.07562444 -0.27538717  0.21692204  0.2411264  -0.01209673 -0.0923705
   0.19058049 -0.00468709 -0.17215249 -0.07528099]], shape=(1, 10), dtype=float32)

หลังจากแปลง

ข้อโต้แย้งส่วนใหญ่ยังคงเหมือนเดิม แต่สังเกตความแตกต่าง:

  • อาร์กิวเมนต์ training จะถูกส่งผ่านไปยังแต่ละเลเยอร์โดยโมเดลเมื่อรัน
  • อาร์กิวเมนต์แรกของฟังก์ชัน model ดั้งเดิม (อินพุต x ) หายไป เนื่องจากเลเยอร์อ็อบเจ็กต์แยกการสร้างโมเดลออกจากการเรียกโมเดล

โปรดทราบว่า:

  • หากคุณใช้ Regularizers ของ initializers จาก tf.contrib สิ่งเหล่านี้จะมีการเปลี่ยนแปลงอาร์กิวเมนต์มากกว่าตัวอื่น ๆ
  • โค้ดจะไม่เขียนลงในคอลเลกชันอีกต่อไปดังนั้นฟังก์ชันเช่น v1.losses.get_regularization_loss จะไม่คืนค่าเหล่านี้อีกต่อไปซึ่งอาจทำลายลูปการฝึกของคุณได้
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.04),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))
train_out = model(train_data, training=True)
print(train_out)
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

test_out = model(test_data, training=False)
print(test_out)
tf.Tensor(
[[-0.32132083  0.22252844 -0.11330387 -0.4613616  -0.08817139 -0.52697927
  -0.1538124   0.23069203 -0.15860984 -0.453844  ]], shape=(1, 10), dtype=float32)

# Here are all the trainable variables.
len(model.trainable_variables)
8
# Here is the regularization loss.
model.losses
[<tf.Tensor: shape=(), dtype=float32, numpy=0.08671833>]

ตัวแปรผสม & v1.layers

โค้ดที่มีอยู่มักจะผสมตัวแปร TF 1.x ระดับล่างและการดำเนินการกับ v1.layers ระดับที่สูงกว่า

ก่อนที่จะแปลง

def model(x, training, scope='model'):
  with v1.variable_scope(scope, reuse=v1.AUTO_REUSE):
    W = v1.get_variable(
      "W", dtype=v1.float32,
      initializer=v1.ones(shape=x.shape),
      regularizer=lambda x:0.004*tf.reduce_mean(x**2),
      trainable=True)
    if training:
      x = x + W
    else:
      x = x + W * 0.5
    x = v1.layers.conv2d(x, 32, 3, activation=tf.nn.relu)
    x = v1.layers.max_pooling2d(x, (2, 2), 1)
    x = v1.layers.flatten(x)
    return x

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

หลังจากแปลง

ในการแปลงรหัสนี้ให้ทำตามรูปแบบของการแมปเลเยอร์เป็นเลเยอร์ดังตัวอย่างก่อนหน้านี้

รูปแบบทั่วไปคือ:

  • รวบรวมพารามิเตอร์เลเยอร์ใน __init__
  • สร้างตัวแปรในการ build
  • ดำเนินการคำนวณในการ call และส่งคืนผลลัพธ์

v1.variable_scope นั้นเป็นเลเยอร์ของมันเอง ดังนั้นเขียนใหม่เป็น tf.keras.layers.Layer ดู คู่มือ สำหรับรายละเอียด

# Create a custom layer for part of the model
class CustomLayer(tf.keras.layers.Layer):
  def __init__(self, *args, **kwargs):
    super(CustomLayer, self).__init__(*args, **kwargs)

  def build(self, input_shape):
    self.w = self.add_weight(
        shape=input_shape[1:],
        dtype=tf.float32,
        initializer=tf.keras.initializers.ones(),
        regularizer=tf.keras.regularizers.l2(0.02),
        trainable=True)

  # Call method will sometimes get used in graph mode,
  # training will get turned into a tensor
  @tf.function
  def call(self, inputs, training=None):
    if training:
      return inputs + self.w
    else:
      return inputs + self.w * 0.5
custom_layer = CustomLayer()
print(custom_layer([1]).numpy())
print(custom_layer([1], training=True).numpy())
[1.5]
[2.]

train_data = tf.ones(shape=(1, 28, 28, 1))
test_data = tf.ones(shape=(1, 28, 28, 1))

# Build the model including the custom layer
model = tf.keras.Sequential([
    CustomLayer(input_shape=(28, 28, 1)),
    tf.keras.layers.Conv2D(32, 3, activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
])

train_out = model(train_data, training=True)
test_out = model(test_data, training=False)

สิ่งที่ควรทราบ:

  • โมเดลและเลเยอร์ของ Keras ย่อยต้องทำงานในกราฟ v1 ทั้งสอง (ไม่มีการพึ่งพาการควบคุมอัตโนมัติ) และในโหมดกระตือรือร้น

    • ตัดการ call() ใน tf.function() เพื่อรับลายเซ็นและการอ้างอิงการควบคุมอัตโนมัติ
  • อย่าลืมยอมรับข้อโต้แย้ง training เพื่อ call

    • บางครั้งก็เป็น tf.Tensor
    • บางครั้งก็เป็นบูลีน Python
  • สร้างตัวแปรโมเดลในตัวสร้างหรือ Model.build โดยใช้ self.add_weight()

    • ใน Model.build คุณสามารถเข้าถึงรูปร่างอินพุตได้ดังนั้นจึงสามารถสร้างน้ำหนักที่มีรูปร่างที่ตรงกันได้
    • การใช้ tf.keras.layers.Layer.add_weight ช่วยให้ Keras ติดตามตัวแปรและการสูญเสียการทำให้เป็นมาตรฐาน
  • อย่าเก็บ tf.Tensors ไว้ในวัตถุของคุณ

    • อาจถูกสร้างขึ้นใน tf.function หรือในบริบทที่กระตือรือร้นและเทนเซอร์เหล่านี้ทำงานแตกต่างกัน
    • ใช้ tf.Variable s สำหรับสถานะซึ่งสามารถใช้งานได้จากทั้งสองบริบทเสมอ
    • tf.Tensors ใช้สำหรับค่ากลางเท่านั้น

หมายเหตุเกี่ยวกับ Slim & Contrib.layers

โค้ด TensorFlow 1.x รุ่นเก่าจำนวนมากใช้ไลบรารี Slim ซึ่งมาพร้อมกับ TensorFlow 1.x เป็น tf.contrib.layers ในฐานะที่เป็น contrib โมดูลนี้ไม่สามารถใช้ได้อีกใน TensorFlow 2.0 แม้ใน tf.compat.v1 การแปลงโค้ดโดยใช้ Slim เป็น TF 2.0 เกี่ยวข้องมากกว่าการแปลงที่เก็บที่ใช้ v1.layers ในความเป็นจริงการแปลงรหัส Slim ของคุณเป็น v1.layers ก่อนจากนั้นจึงแปลงเป็น Keras

  • ลบ arg_scopes อาร์กิวเมนต์ทั้งหมดต้องชัดเจน
  • หากคุณใช้มันให้แบ่ง normalizer_fn และ activation_fn เป็นเลเยอร์ของตัวเอง
  • เลเยอร์ Conv ที่แยกออกได้จะจับคู่กับเลเยอร์ Keras ที่แตกต่างกันอย่างน้อยหนึ่งชั้น (เลเยอร์ Keras เชิงลึกชี้และแยกกันได้)
  • Slim และ v1.layers มีชื่ออาร์กิวเมนต์และค่าเริ่มต้นที่แตกต่างกัน
  • บางอาร์กมีเกล็ดที่แตกต่างกัน
  • หากคุณใช้โมเดลที่ผ่านการฝึกอบรมมาแล้วของ Slim ให้ลองใช้โมเดลสำเร็จรูปของ Keras จาก tf.keras.applications หรือ TF2 SavedModels ของ TF Hub ที่ ส่งออกจากโค้ด Slim ดั้งเดิม

เลเยอร์ tf.contrib บางชั้นอาจไม่ได้ถูกย้ายไปที่ core TensorFlow แต่ถูกย้ายไปที่ แพ็กเกจเสริม TF แทน

การฝึกอบรม

มีหลายวิธีในการป้อนข้อมูลไปยังโมเดล tf.keras พวกเขาจะยอมรับตัวสร้าง Python และอาร์เรย์ Numpy เป็นอินพุต

วิธีที่แนะนำในการฟีดข้อมูลไปยังโมเดลคือการใช้แพ็กเกจ tf.data ซึ่งมีคอลเล็กชันคลาสประสิทธิภาพสูงสำหรับจัดการข้อมูล

หากคุณยังคงใช้ tf.queue ตอนนี้สิ่งเหล่านี้ได้รับการสนับสนุนเป็นโครงสร้างข้อมูลเท่านั้นไม่ใช่เป็นไปป์ไลน์อินพุต

การใช้ชุดข้อมูล

แพ็คเกจ TensorFlow Datasets ( tfds ) มียูทิลิตี้สำหรับการโหลดชุดข้อมูลที่กำหนดไว้ล่วงหน้าเป็นวัตถุ tf.data.Dataset

สำหรับตัวอย่างนี้โหลด MNISTdataset โดยใช้ tfds :

datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']
Downloading and preparing dataset mnist/3.0.1 (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1...

Warning:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead pass
`try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`.


Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data.

จากนั้นเตรียมข้อมูลสำหรับการฝึกอบรม:

  • ปรับขนาดแต่ละภาพใหม่
  • สลับลำดับของตัวอย่าง
  • รวบรวมชุดภาพและป้ายกำกับ
BUFFER_SIZE = 10 # Use a much larger value for real code.
BATCH_SIZE = 64
NUM_EPOCHS = 5


def scale(image, label):
  image = tf.cast(image, tf.float32)
  image /= 255

  return image, label

หากต้องการให้ตัวอย่างสั้นให้ตัดชุดข้อมูลเพื่อส่งคืน 5 แบทช์เท่านั้น:

train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
test_data = mnist_test.map(scale).batch(BATCH_SIZE)

STEPS_PER_EPOCH = 5

train_data = train_data.take(STEPS_PER_EPOCH)
test_data = test_data.take(STEPS_PER_EPOCH)
image_batch, label_batch = next(iter(train_data))

ใช้ Keras training loops

หากคุณไม่ต้องการการควบคุมขั้นตอนการฝึกในระดับต่ำขอแนะนำให้ใช้วิธีการ fit evaluate และ predict ในตัวของ Keras วิธีการเหล่านี้มีอินเทอร์เฟซที่เหมือนกันเพื่อฝึกโมเดลโดยไม่คำนึงถึงการนำไปใช้งาน (ตามลำดับฟังก์ชันหรือคลาสย่อย)

ข้อดีของวิธีการเหล่านี้ ได้แก่ :

  • พวกเขายอมรับอาร์เรย์ Numpy ตัวสร้าง Python และ tf.data.Datasets
  • พวกเขาใช้การทำให้เป็นมาตรฐานและการสูญเสียการเปิดใช้งานโดยอัตโนมัติ
  • สนับสนุน tf.distribute สำหรับการฝึกอบรมหลายอุปกรณ์
  • พวกเขาสนับสนุนการโทรตามอำเภอใจเป็นการสูญเสียและเมตริก
  • รองรับการโทรกลับเช่น tf.keras.callbacks.TensorBoard และการโทรกลับที่กำหนดเอง
  • มีประสิทธิภาพโดยอัตโนมัติโดยใช้กราฟ TensorFlow

นี่คือตัวอย่างของการฝึกโมเดลโดยใช้ Dataset (สำหรับรายละเอียดเกี่ยวกับวิธีการทำงานดู บทช่วยสอน )

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

# Model is the full model w/o custom layers
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(train_data, epochs=NUM_EPOCHS)
loss, acc = model.evaluate(test_data)

print("Loss {}, Accuracy {}".format(loss, acc))
Epoch 1/5
5/5 [==============================] - 0s 6ms/step - loss: 1.5665 - accuracy: 0.4969
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.5249 - accuracy: 0.8656
Epoch 3/5
5/5 [==============================] - 0s 5ms/step - loss: 0.3246 - accuracy: 0.9438
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.2407 - accuracy: 0.9719
Epoch 5/5
5/5 [==============================] - 0s 5ms/step - loss: 0.1841 - accuracy: 0.9906
5/5 [==============================] - 0s 4ms/step - loss: 1.5957 - accuracy: 0.5375
Loss 1.5956770181655884, Accuracy 0.5375000238418579

เขียนวนซ้ำของคุณเอง

หากขั้นตอนการฝึกของโมเดล Keras เหมาะกับคุณ แต่คุณต้องการการควบคุมเพิ่มเติมนอกขั้นตอนนั้นให้พิจารณาใช้เมธอด tf.keras.Model.train_on_batch ในการวนซ้ำข้อมูล

ข้อควรจำ: หลายสิ่งสามารถนำมาใช้เป็น tf.keras.callbacks.Callback

วิธีนี้มีข้อดีหลายประการของวิธีการที่กล่าวถึงในหัวข้อก่อนหน้านี้ แต่ให้ผู้ใช้ควบคุมวงนอกได้

คุณยังสามารถใช้ tf.keras.Model.test_on_batch หรือ tf.keras.Model.evaluate เพื่อตรวจสอบประสิทธิภาพระหว่างการฝึก

หากต้องการฝึกโมเดลข้างต้นต่อไป:

# Model is the full model w/o custom layers
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

for epoch in range(NUM_EPOCHS):
  #Reset the metric accumulators
  model.reset_metrics()

  for image_batch, label_batch in train_data:
    result = model.train_on_batch(image_batch, label_batch)
    metrics_names = model.metrics_names
    print("train: ",
          "{}: {:.3f}".format(metrics_names[0], result[0]),
          "{}: {:.3f}".format(metrics_names[1], result[1]))
  for image_batch, label_batch in test_data:
    result = model.test_on_batch(image_batch, label_batch,
                                 # return accumulated metrics
                                 reset_metrics=False)
  metrics_names = model.metrics_names
  print("\neval: ",
        "{}: {:.3f}".format(metrics_names[0], result[0]),
        "{}: {:.3f}".format(metrics_names[1], result[1]))
train:  loss: 0.145 accuracy: 1.000
train:  loss: 0.183 accuracy: 0.984
train:  loss: 0.216 accuracy: 0.953
train:  loss: 0.229 accuracy: 0.938
train:  loss: 0.201 accuracy: 0.969

eval:  loss: 1.588 accuracy: 0.628
train:  loss: 0.097 accuracy: 1.000
train:  loss: 0.101 accuracy: 1.000
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.130 accuracy: 0.984
train:  loss: 0.127 accuracy: 1.000

eval:  loss: 1.580 accuracy: 0.766
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.081 accuracy: 1.000
train:  loss: 0.079 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.077 accuracy: 1.000

eval:  loss: 1.542 accuracy: 0.809
train:  loss: 0.067 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.063 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000

eval:  loss: 1.503 accuracy: 0.816
train:  loss: 0.055 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000

eval:  loss: 1.482 accuracy: 0.828

ปรับแต่งขั้นตอนการฝึกอบรม

หากคุณต้องการความยืดหยุ่นและการควบคุมที่มากขึ้นคุณสามารถมีได้โดยใช้ห่วงการฝึกของคุณเอง มีสามขั้นตอน:

  1. ทำซ้ำบนตัวสร้าง Python หรือ tf.data.Dataset เพื่อรับชุดตัวอย่าง
  2. ใช้ tf.GradientTape เพื่อรวบรวมการไล่ระดับสี
  3. ใช้ tf.keras.optimizers ใดตัวหนึ่งเพื่อใช้การอัปเดตน้ำหนักกับตัวแปรของโมเดล

จำไว้ว่า:

  • รวมอาร์กิวเมนต์ training ไว้ในวิธีการ call ของเลเยอร์และโมเดลย่อยเสมอ
  • ตรวจสอบให้แน่ใจว่าได้เรียกโมเดลด้วยอาร์กิวเมนต์ training ถูกต้อง
  • ตัวแปรของโมเดลอาจไม่มีอยู่จนกว่าโมเดลจะรันบนชุดข้อมูลทั้งนี้ขึ้นอยู่กับการใช้งาน
  • คุณต้องจัดการสิ่งต่างๆด้วยตนเองเช่นการสูญเสียการทำให้เป็นมาตรฐานสำหรับโมเดล

สังเกตความเรียบง่ายที่สัมพันธ์กับ v1:

  • ไม่จำเป็นต้องเรียกใช้ตัวเริ่มต้นตัวแปร ตัวแปรเริ่มต้นในการสร้าง
  • ไม่จำเป็นต้องเพิ่มการพึ่งพาการควบคุมด้วยตนเอง แม้ในการทำงานของ tf.function ทำหน้าที่ในโหมดกระตือรือร้น
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

optimizer = tf.keras.optimizers.Adam(0.001)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss=tf.math.add_n(model.losses)
    pred_loss=loss_fn(labels, predictions)
    total_loss=pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

for epoch in range(NUM_EPOCHS):
  for inputs, labels in train_data:
    train_step(inputs, labels)
  print("Finished epoch", epoch)

Finished epoch 0
Finished epoch 1
Finished epoch 2
Finished epoch 3
Finished epoch 4

เมตริกและการสูญเสียรูปแบบใหม่

ใน TensorFlow 2.0 เมตริกและการสูญเสียเป็นวัตถุ สิ่งเหล่านี้ทำงานทั้งอย่างกระตือรือร้นและใน tf.function s

ออบเจ็กต์การสูญเสียสามารถเรียกใช้ได้และคาดว่า (y_true, y_pred) เป็นอาร์กิวเมนต์:

cce = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
cce([[1, 0]], [[-1.0,3.0]]).numpy()
4.01815

วัตถุเมตริกมีวิธีการดังต่อไปนี้:

  • Metric.update_state() - เพิ่มข้อสังเกตใหม่
  • Metric.result() - รับผลลัพธ์ปัจจุบันของเมตริกโดยให้ค่าที่สังเกตได้
  • Metric.reset_states() - ล้างการสังเกตทั้งหมด

วัตถุนั้นสามารถเรียกใช้ได้ การโทรจะอัปเดตสถานะด้วยการสังเกตใหม่เช่นเดียวกับ update_state และส่งกลับผลลัพธ์ใหม่ของเมตริก

คุณไม่จำเป็นต้องเริ่มต้นตัวแปรของเมตริกด้วยตนเองและเนื่องจาก TensorFlow 2.0 มีการพึ่งพาการควบคุมอัตโนมัติคุณจึงไม่จำเป็นต้องกังวลเกี่ยวกับตัวแปรเหล่านี้

โค้ดด้านล่างใช้เมตริกเพื่อติดตามการสูญเสียค่าเฉลี่ยที่สังเกตได้ภายในลูปการฝึกที่กำหนดเอง

# Create the metrics
loss_metric = tf.keras.metrics.Mean(name='train_loss')
accuracy_metric = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss=tf.math.add_n(model.losses)
    pred_loss=loss_fn(labels, predictions)
    total_loss=pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  # Update the metrics
  loss_metric.update_state(total_loss)
  accuracy_metric.update_state(labels, predictions)


for epoch in range(NUM_EPOCHS):
  # Reset the metrics
  loss_metric.reset_states()
  accuracy_metric.reset_states()

  for inputs, labels in train_data:
    train_step(inputs, labels)
  # Get the metric results
  mean_loss=loss_metric.result()
  mean_accuracy = accuracy_metric.result()

  print('Epoch: ', epoch)
  print('  loss:     {:.3f}'.format(mean_loss))
  print('  accuracy: {:.3f}'.format(mean_accuracy))

Epoch:  0
  loss:     0.207
  accuracy: 0.991
Epoch:  1
  loss:     0.167
  accuracy: 0.994
Epoch:  2
  loss:     0.147
  accuracy: 0.997
Epoch:  3
  loss:     0.123
  accuracy: 0.997
Epoch:  4
  loss:     0.109
  accuracy: 0.997

ชื่อเมตริก Keras

ในโมเดล Keras ของ TensorFlow 2.0 มีความสอดคล้องกันมากขึ้นเกี่ยวกับการจัดการชื่อเมตริก

ตอนนี้เมื่อคุณส่งสตริงในรายการเมตริกสตริง ที่แน่นอน นั้นจะถูกใช้เป็น name ของเมตริก ชื่อเหล่านี้จะปรากฏในออบเจ็กต์ประวัติที่ส่งคืนโดย model.fit และในบันทึกถูกส่งไปยัง keras.callbacks ถูกตั้งค่าเป็นสตริงที่คุณส่งผ่านในรายการเมตริก

model.compile(
    optimizer = tf.keras.optimizers.Adam(0.001),
    loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics = ['acc', 'accuracy', tf.keras.metrics.SparseCategoricalAccuracy(name="my_accuracy")])
history = model.fit(train_data)
5/5 [==============================] - 0s 6ms/step - loss: 0.1233 - acc: 0.9937 - accuracy: 0.9937 - my_accuracy: 0.9937

history.history.keys()
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])

สิ่งนี้แตกต่างจากเวอร์ชันก่อนหน้าตรงที่การส่ง metrics=["accuracy"] จะทำให้เกิดคำ dict_keys(['loss', 'acc'])

เครื่องมือเพิ่มประสิทธิภาพ Keras

เครื่องมือเพิ่มประสิทธิภาพใน v1.train เช่น v1.train.AdamOptimizer และ v1.train.GradientDescentOptimizer มีค่าเทียบเท่าใน tf.keras.optimizers

แปลง v1.train เป็น keras.optimizers

สิ่งที่ควรทราบเมื่อทำการแปลงเครื่องมือเพิ่มประสิทธิภาพของคุณมีดังนี้

ค่าเริ่มต้นใหม่สำหรับ tf.keras.optimizers

ไม่มีการเปลี่ยนแปลงสำหรับ optimizers.SGD , optimizers.Adam มหรือ optimizers.RMSprop

อัตราการเรียนรู้เริ่มต้นต่อไปนี้มีการเปลี่ยนแปลง:

TensorBoard

TensorFlow 2 มีการเปลี่ยนแปลงที่สำคัญกับ tf.summary API ที่ใช้ในการเขียนข้อมูลสรุปสำหรับการแสดงภาพใน TensorBoard สำหรับคำแนะนำทั่วไปเกี่ยวกับ tf.summary ใหม่มี บทช่วยสอนมากมาย ที่ใช้ TF 2 API ซึ่งรวมถึง คู่มือการย้าย TensorBoard TF 2

กำลังบันทึกและโหลด

ความเข้ากันได้ของ Checkpoint

TensorFlow 2.0 ใช้ จุดตรวจตามวัตถุ

ด่านตามชื่อแบบเก่ายังโหลดได้ถ้าคุณระวัง ขั้นตอนการแปลงรหัสอาจส่งผลให้เกิดการเปลี่ยนแปลงชื่อตัวแปร แต่มีวิธีแก้ปัญหาชั่วคราว

วิธีที่ง่ายที่สุดในการจัดเรียงชื่อของโมเดลใหม่ด้วยชื่อในด่าน:

  • ตัวแปรยังคงมีอาร์กิวเมนต์ name คุณสามารถตั้งค่าได้
  • โมเดล Keras ยังใช้อาร์กิวเมนต์ name ซึ่งตั้งเป็นคำนำหน้าสำหรับตัวแปร
  • ฟังก์ชัน v1.name_scope สามารถใช้เพื่อตั้งค่าคำนำหน้าชื่อตัวแปร ซึ่งแตกต่างจาก tf.variable_scope มาก มีผลเฉพาะชื่อเท่านั้นและไม่ติดตามตัวแปรและใช้ซ้ำ

หากไม่ได้ผลสำหรับกรณีการใช้งานของคุณให้ลองใช้ฟังก์ชัน v1.train.init_from_checkpoint ใช้อาร์กิวเมนต์ assignment_map ซึ่งระบุการแม็ปจากชื่อเก่าเป็นชื่อใหม่

ที่ เก็บ TensorFlow Estimator มี เครื่องมือการแปลง เพื่ออัพเกรดจุดตรวจสอบสำหรับตัวประมาณค่าล่วงหน้าจาก TensorFlow 1.X เป็น 2.0 อาจใช้เป็นตัวอย่างวิธีการสร้างเครื่องมือสำหรับกรณีการใช้งานที่คล้ายกัน

ความเข้ากันได้ของโมเดลที่บันทึกไว้

ไม่มีข้อกังวลเกี่ยวกับความเข้ากันได้ที่สำคัญสำหรับรุ่นที่บันทึกไว้

  • TensorFlow 1.x save_models ทำงานใน TensorFlow 2.x.
  • TensorFlow 2.x saved_models ทำงานใน TensorFlow 1.x - หากรองรับการดำเนินการทั้งหมด

Graph.pb หรือ Graph.pbtxt

ไม่มีวิธีที่ตรงไปตรงมาในการอัปเกรดไฟล์ Graph.pb ดิบเป็น TensorFlow 2.0 ทางออกที่ดีที่สุดของคุณคืออัปเกรดรหัสที่สร้างไฟล์

แต่ถ้าคุณมี "กราฟแช่แข็ง" (ก tf.Graph ที่ตัวแปรที่ได้รับกลายเป็นค่าคงที่) จากนั้นก็เป็นไปได้ในการแปลงนี้ให้ concrete_function ใช้ v1.wrap_function :

def wrap_frozen_graph(graph_def, inputs, outputs):
  def _imports_graph_def():
    tf.compat.v1.import_graph_def(graph_def, name="")
  wrapped_import = tf.compat.v1.wrap_function(_imports_graph_def, [])
  import_graph = wrapped_import.graph
  return wrapped_import.prune(
      tf.nest.map_structure(import_graph.as_graph_element, inputs),
      tf.nest.map_structure(import_graph.as_graph_element, outputs))

ตัวอย่างเช่นนี่คือกราฟแช่แข็งสำหรับ Inception v1 จากปี 2016:

path = tf.keras.utils.get_file(
    'inception_v1_2016_08_28_frozen.pb',
    'http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz',
    untar=True)
Downloading data from http://storage.googleapis.com/download.tensorflow.org/models/inception_v1_2016_08_28_frozen.pb.tar.gz
24698880/24695710 [==============================] - 1s 0us/step

โหลด tf.GraphDef :

graph_def = tf.compat.v1.GraphDef()
loaded = graph_def.ParseFromString(open(path,'rb').read())

ห่อเป็น concrete_function :

inception_func = wrap_frozen_graph(
    graph_def, inputs='input:0',
    outputs='InceptionV1/InceptionV1/Mixed_3b/Branch_1/Conv2d_0a_1x1/Relu:0')

ส่งค่าเทนเซอร์เป็นอินพุต:

input_img = tf.ones([1,224,224,3], dtype=tf.float32)
inception_func(input_img).shape
TensorShape([1, 28, 28, 96])

ผู้ประมาณ

การฝึกอบรมกับผู้ประเมิน

ตัวประมาณได้รับการสนับสนุนใน TensorFlow 2.0

เมื่อคุณใช้ตัวประมาณค่าคุณสามารถใช้ input_fn() , tf.estimator.TrainSpec และ tf.estimator.EvalSpec จาก TensorFlow 1.x

นี่คือตัวอย่างการใช้ input_fn กับรถไฟและประเมินข้อกำหนด

การสร้างข้อมูลจำเพาะ input_fn และฝึกอบรม / ประเมิน

# Define the estimator's input_fn
def input_fn():
  datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
  mnist_train, mnist_test = datasets['train'], datasets['test']

  BUFFER_SIZE = 10000
  BATCH_SIZE = 64

  def scale(image, label):
    image = tf.cast(image, tf.float32)
    image /= 255

    return image, label[..., tf.newaxis]

  train_data = mnist_train.map(scale).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
  return train_data.repeat()

# Define train & eval specs
train_spec = tf.estimator.TrainSpec(input_fn=input_fn,
                                    max_steps=STEPS_PER_EPOCH * NUM_EPOCHS)
eval_spec = tf.estimator.EvalSpec(input_fn=input_fn,
                                  steps=STEPS_PER_EPOCH)

ใช้นิยามโมเดล Keras

มีความแตกต่างบางประการในการสร้างตัวประมาณของคุณใน TensorFlow 2.0

เราขอแนะนำให้คุณกำหนดโมเดลของคุณโดยใช้ Keras จากนั้นใช้ยูทิลิตี้ tf.keras.estimator.model_to_estimator เพื่อเปลี่ยนโมเดลของคุณให้เป็นตัวประมาณค่า โค้ดด้านล่างแสดงวิธีใช้ยูทิลิตี้นี้เมื่อสร้างและฝึกอบรมตัวประมาณค่า

def make_model():
  return tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
  ])
model = make_model()

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

estimator = tf.keras.estimator.model_to_estimator(
  keras_model = model
)

tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp333woaev

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp333woaev

INFO:tensorflow:Using the Keras model provided.

INFO:tensorflow:Using the Keras model provided.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_estimator/python/estimator/keras.py:220: set_learning_phase (from tensorflow.python.keras.backend) is deprecated and will be removed after 2020-10-11.
Instructions for updating:
Simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp333woaev', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp333woaev', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp333woaev/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={})

INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp333woaev/keras/keras_model.ckpt', vars_to_warm_start='.*', var_name_to_vocab_info={}, var_name_to_prev_var_name={})

INFO:tensorflow:Warm-starting from: /tmp/tmp333woaev/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmp333woaev/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.

INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.

INFO:tensorflow:Warm-started 8 variables.

INFO:tensorflow:Warm-started 8 variables.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.946777, step = 0

INFO:tensorflow:loss = 2.946777, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp333woaev/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_v1.py:2048: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:37Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.84716s

INFO:tensorflow:Inference Time : 0.84716s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:38

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.715625, global_step = 25, loss = 1.5356585

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp333woaev/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.52498615.

INFO:tensorflow:Loss for final step: 0.52498615.

({'accuracy': 0.715625, 'loss': 1.5356585, 'global_step': 25}, [])

ใช้ model_fn กำหนดเอง

หากคุณมี model_fn ตัวประมาณแบบกำหนดเองที่คุณต้องการบำรุงรักษาคุณสามารถแปลง model_fn ของคุณเพื่อใช้โมเดล Keras

อย่างไรก็ตามด้วยเหตุผลด้านความเข้ากันได้ model_fn กำหนดเองจะยังคงทำงานในโหมดกราฟสไตล์ 1.x ซึ่งหมายความว่าไม่มีการดำเนินการอย่างกระตือรือร้นและไม่มีการพึ่งพาการควบคุมอัตโนมัติ

model_fn ที่กำหนดเองโดยมีการเปลี่ยนแปลงน้อยที่สุด

ในการทำให้ model_fn กำหนดเองของคุณทำงานใน TF 2.0 หากคุณต้องการเปลี่ยนแปลงโค้ดที่มีอยู่เพียงเล็กน้อยสามารถใช้สัญลักษณ์ tf.compat.v1 เช่น optimizers และ metrics ได้

การใช้แบบจำลองใน Keras เอง model_fn จะคล้ายกับการใช้มันในวงการฝึกอบรมที่กำหนดเอง:

  • กำหนดขั้นตอน training เหมาะสมตามอาร์กิวเมนต์ของ mode
  • ส่งผ่าน trainable_variables ของโมเดลไปยังเครื่องมือเพิ่มประสิทธิภาพอย่างชัดเจน

แต่มีความแตกต่างที่สำคัญเมื่อเทียบกับ ลูปที่กำหนดเอง :

  • แทนที่จะใช้ Model.losses ให้แยกการสูญเสียโดยใช้ Model.get_losses_for
  • แตกการอัปเดตของโมเดลโดยใช้ Model.get_updates_for

โค้ดต่อไปนี้สร้างตัวประมาณค่าจาก model_fn กำหนดเองซึ่งแสดงถึงข้อกังวลทั้งหมดนี้

def my_model_fn(features, labels, mode):
  model = make_model()

  optimizer = tf.compat.v1.train.AdamOptimizer()
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  predictions = model(features, training=training)

  if mode == tf.estimator.ModeKeys.PREDICT:
    return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

  reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
  total_loss=loss_fn(labels, predictions) + tf.math.add_n(reg_losses)

  accuracy = tf.compat.v1.metrics.accuracy(labels=labels,
                                           predictions=tf.math.argmax(predictions, axis=1),
                                           name='acc_op')

  update_ops = model.get_updates_for(None) + model.get_updates_for(features)
  minimize_op = optimizer.minimize(
      total_loss,
      var_list=model.trainable_variables,
      global_step=tf.compat.v1.train.get_or_create_global_step())
  train_op = tf.group(minimize_op, update_ops)

  return tf.estimator.EstimatorSpec(
    mode=mode,
    predictions=predictions,
    loss=total_loss,
    train_op=train_op, eval_metric_ops={'accuracy': accuracy})

# Create the Estimator & Train
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmpnhx_c2r_

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmpnhx_c2r_

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnhx_c2r_', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpnhx_c2r_', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.7539256, step = 0

INFO:tensorflow:loss = 2.7539256, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpnhx_c2r_/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:41Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:41Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.94175s

INFO:tensorflow:Inference Time : 0.94175s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:42

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.678125, global_step = 25, loss = 1.5622549

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpnhx_c2r_/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.39462265.

INFO:tensorflow:Loss for final step: 0.39462265.

({'accuracy': 0.678125, 'loss': 1.5622549, 'global_step': 25}, [])

model_fn แบบกำหนดเองพร้อมสัญลักษณ์ TF 2.0

หากคุณต้องการกำจัดสัญลักษณ์ TF 1.x ทั้งหมดและอัปเกรด model_fn กำหนดเองของคุณเป็น TF 2.0 ดั้งเดิมคุณต้องอัปเดตเครื่องมือเพิ่มประสิทธิภาพและเมตริกเป็น tf.keras.optimizers และ tf.keras.metrics

ใน model_fn กำหนดเองนอกเหนือจากการ เปลี่ยนแปลง ข้างต้นจำเป็นต้องทำการอัพเกรดเพิ่มเติม:

  • ใช้ tf.keras.optimizers แทน v1.train.Optimizer
  • อย่างชัดเจนผ่านรูปแบบของ trainable_variables ไป tf.keras.optimizers
  • ในการคำนวณ train_op/minimize_op
    • ใช้ Optimizer.get_updates() หากการสูญเสียเป็น Tensor การสูญเสียสเกลาร์ (ไม่สามารถเรียกได้) องค์ประกอบแรกในรายการที่ส่งคืนคือ train_op/minimize_op ต้องการ
    • หากการสูญเสียเป็นสิ่งที่เรียกได้ (เช่นฟังก์ชัน) ให้ใช้ Optimizer.minimize() เพื่อรับ train_op/minimize_op
  • ใช้ tf.keras.metrics แทน tf.compat.v1.metrics สำหรับการประเมิน

สำหรับตัวอย่าง my_model_fn ข้างต้นรหัสที่โอนย้ายที่มีสัญลักษณ์ 2.0 จะแสดงเป็น:

def my_model_fn(features, labels, mode):
  model = make_model()

  training = (mode == tf.estimator.ModeKeys.TRAIN)
  loss_obj = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
  predictions = model(features, training=training)

  # Get both the unconditional losses (the None part)
  # and the input-conditional losses (the features part).
  reg_losses = model.get_losses_for(None) + model.get_losses_for(features)
  total_loss=loss_obj(labels, predictions) + tf.math.add_n(reg_losses)

  # Upgrade to tf.keras.metrics.
  accuracy_obj = tf.keras.metrics.Accuracy(name='acc_obj')
  accuracy = accuracy_obj.update_state(
      y_true=labels, y_pred=tf.math.argmax(predictions, axis=1))

  train_op = None
  if training:
    # Upgrade to tf.keras.optimizers.
    optimizer = tf.keras.optimizers.Adam()
    # Manually assign tf.compat.v1.global_step variable to optimizer.iterations
    # to make tf.compat.v1.train.global_step increased correctly.
    # This assignment is a must for any `tf.train.SessionRunHook` specified in
    # estimator, as SessionRunHooks rely on global step.
    optimizer.iterations = tf.compat.v1.train.get_or_create_global_step()
    # Get both the unconditional updates (the None part)
    # and the input-conditional updates (the features part).
    update_ops = model.get_updates_for(None) + model.get_updates_for(features)
    # Compute the minimize_op.
    minimize_op = optimizer.get_updates(
        total_loss,
        model.trainable_variables)[0]
    train_op = tf.group(minimize_op, *update_ops)

  return tf.estimator.EstimatorSpec(
    mode=mode,
    predictions=predictions,
    loss=total_loss,
    train_op=train_op,
    eval_metric_ops={'Accuracy': accuracy_obj})

# Create the Estimator & Train.
estimator = tf.estimator.Estimator(model_fn=my_model_fn)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config.

INFO:tensorflow:Using default config.

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

Warning:tensorflow:Using temporary folder as model directory: /tmp/tmp3kddt__h

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp3kddt__h', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp3kddt__h', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true
graph_options {
  rewrite_options {
    meta_optimizer_iterations: ONE
  }
}
, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Not using Distribute Coordinator.

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Running training and evaluation locally (non-distributed).

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 2.4914804, step = 0

INFO:tensorflow:loss = 2.4914804, step = 0

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 25...

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp3kddt__h/model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 25...

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:45Z

INFO:tensorflow:Starting evaluation at 2020-10-15T01:27:45Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Restoring parameters from /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [1/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [2/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [3/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [4/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Evaluation [5/5]

INFO:tensorflow:Inference Time : 0.91708s

INFO:tensorflow:Inference Time : 0.91708s

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Finished evaluation at 2020-10-15-01:27:46

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.690625, global_step = 25, loss = 1.554177

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp3kddt__h/model.ckpt-25

INFO:tensorflow:Loss for final step: 0.3999393.

INFO:tensorflow:Loss for final step: 0.3999393.

({'Accuracy': 0.690625, 'loss': 1.554177, 'global_step': 25}, [])

เครื่องมือประมาณการล่วงหน้า

เครื่องมือประมาณการ tf.estimator.DNN* ในตระกูล tf.estimator.DNN* , tf.estimator.Linear* และ tf.estimator.DNNLinearCombined* ยังคงได้รับการสนับสนุนใน TensorFlow 2.0 API อย่างไรก็ตามอาร์กิวเมนต์บางส่วนมีการเปลี่ยนแปลง:

  1. input_layer_partitioner : ลบออกใน 2.0
  2. loss_reduction : อัปเดตเป็น tf.keras.losses.Reduction แทน tf.compat.v1.losses.Reduction ค่าดีฟอลต์ยังเปลี่ยนเป็น tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE จาก tf.compat.v1.losses.Reduction.SUM
  3. optimizer dnn_optimizer และ linear_optimizer : อาร์กิวเมนต์นี้ได้รับการอัปเดตเป็น tf.keras.optimizers แทน tf.compat.v1.train.Optimizer

ในการย้ายการเปลี่ยนแปลงข้างต้น:

  1. ไม่จำเป็นต้องย้ายข้อมูลสำหรับ input_layer_partitioner เนื่องจาก Distribution Strategy จะจัดการโดยอัตโนมัติใน TF 2.0
  2. สำหรับ loss_reduction ตรวจสอบ tf.keras.losses.Reduction สำหรับตัวเลือกที่รองรับ
  3. สำหรับ optimizer args หากคุณไม่ได้ส่งผ่านเครื่องมือ optimizer dnn_optimizer หรือ linear_optimizer arg หรือถ้าคุณระบุ optimizer arg เป็น string ในโค้ดของคุณคุณก็ไม่จำเป็นต้องเปลี่ยนแปลงอะไร tf.keras.optimizers ถูกใช้โดยค่าเริ่มต้น มิฉะนั้นคุณต้องอัปเดตได้จาก tf.compat.v1.train.Optimizer จะสอดคล้องกัน tf.keras.optimizers

Checkpoint Converter

การย้ายไปยัง keras.optimizers จะทำลายจุดตรวจที่บันทึกโดยใช้ TF 1.x เนื่องจาก tf.keras.optimizers สร้างชุดตัวแปรที่แตกต่างกันเพื่อบันทึกในจุดตรวจ หากต้องการทำให้จุดตรวจเก่าสามารถนำกลับมาใช้ใหม่ได้หลังจากการย้ายไปยัง TF 2.0 ให้ลองใช้ เครื่องมือแปลงจุดตรวจสอบ

 curl -O https://raw.githubusercontent.com/tensorflow/estimator/master/tensorflow_estimator/python/estimator/tools/checkpoint_converter.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15165  100 15165    0     0  32265      0 --:--:-- --:--:-- --:--:-- 32197

เครื่องมือนี้มีความช่วยเหลือในตัว:

 python checkpoint_converter.py -h
2020-10-15 01:27:47.423752: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
usage: checkpoint_converter.py [-h]
                               {dnn,linear,combined} source_checkpoint
                               source_graph target_checkpoint

positional arguments:
  {dnn,linear,combined}
                        The type of estimator to be converted. So far, the
                        checkpoint converter only supports Canned Estimator.
                        So the allowed types include linear, dnn and combined.
  source_checkpoint     Path to source checkpoint file to be read in.
  source_graph          Path to source graph file to be read in.
  target_checkpoint     Path to checkpoint file to be written out.

optional arguments:
  -h, --help            show this help message and exit

TensorShape

คลาสนี้ถูกทำให้ง่ายขึ้นเพื่อเก็บ int s แทนที่จะเป็นวัตถุ tf.compat.v1.Dimension ดังนั้นจึงไม่จำเป็นต้องเรียก .value() เพื่อรับ int

tf.compat.v1.Dimension วัตถุ tf.compat.v1.Dimension แต่ละรายการยังคงสามารถเข้าถึงได้จาก tf.TensorShape.dims

ต่อไปนี้แสดงให้เห็นถึงความแตกต่างระหว่าง TensorFlow 1.x และ TensorFlow 2.0

# Create a shape and choose an index
i = 0
shape = tf.TensorShape([16, None, 256])
shape
TensorShape([16, None, 256])

หากคุณมีสิ่งนี้ใน TF 1.x:

value = shape[i].value

จากนั้นทำใน TF 2.0:

value = shape[i]
value
16

หากคุณมีสิ่งนี้ใน TF 1.x:

for dim in shape:
    value = dim.value
    print(value)

จากนั้นทำใน TF 2.0:

for value in shape:
  print(value)
16
None
256

หากคุณมีสิ่งนี้ใน TF 1.x (หรือใช้วิธีการมิติข้อมูลอื่น ๆ ):

dim = shape[i]
dim.assert_is_compatible_with(other_dim)

จากนั้นทำใน TF 2.0:

other_dim = 16
Dimension = tf.compat.v1.Dimension

if shape.rank is None:
  dim = Dimension(None)
else:
  dim = shape.dims[i]
dim.is_compatible_with(other_dim) # or any other dimension method
True
shape = tf.TensorShape(None)

if shape:
  dim = shape.dims[i]
  dim.is_compatible_with(other_dim) # or any other dimension method

ค่าบูลีนของ tf.TensorShape เป็น True หากทราบอันดับเป็น False อย่างอื่น

print(bool(tf.TensorShape([])))      # Scalar
print(bool(tf.TensorShape([0])))     # 0-length vector
print(bool(tf.TensorShape([1])))     # 1-length vector
print(bool(tf.TensorShape([None])))  # Unknown-length vector
print(bool(tf.TensorShape([1, 10, 100])))       # 3D tensor
print(bool(tf.TensorShape([None, None, None]))) # 3D tensor with no known dimensions
print()
print(bool(tf.TensorShape(None)))  # A tensor with unknown rank.
True
True
True
True
True
True

False

การเปลี่ยนแปลงอื่น ๆ

  • ลบ tf.colocate_with : อัลกอริธึมการจัดวางอุปกรณ์ของ TensorFlow ได้รับการปรับปรุงอย่างมีนัยสำคัญ สิ่งนี้ไม่จำเป็นอีกต่อไป หากการลบจะทำให้ประสิทธิภาพลดลง โปรดแจ้งข้อบกพร่อง

  • แทนที่การใช้งาน v1.ConfigProto ด้วยฟังก์ชันเทียบเท่าจาก tf.config

ข้อสรุป

กระบวนการโดยรวมคือ:

  1. รันสคริปต์อัพเกรด
  2. ลบสัญลักษณ์สนับสนุน
  3. เปลี่ยนโมเดลของคุณเป็นสไตล์เชิงวัตถุ (Keras)
  4. ใช้ tf.keras หรือ tf.estimator การฝึกอบรมและการประเมินผลลูปที่คุณสามารถ
  5. มิฉะนั้นให้ใช้การวนซ้ำแบบกำหนดเอง แต่อย่าลืมหลีกเลี่ยงเซสชันและคอลเล็กชัน

การแปลงรหัสเป็น TensorFlow 2.0 ใช้เวลาเล็กน้อย แต่การเปลี่ยนแปลงทุกครั้งส่งผลให้:

  • โค้ดน้อยลง
  • เพิ่มความชัดเจนและเรียบง่าย
  • การดีบักที่ง่ายขึ้น