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

โยกย้ายรหัส TensorFlow 1 ของคุณเพื่อ TensorFlow 2

ดูบน TensorFlow.org เรียกใช้ใน Google Colab ดูโค้ดบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

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

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

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

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

สคริปต์แปลงโดยอัตโนมัติ

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

นี้จะทำผ่านเริ่มต้นที่การอัพเกรดรหัสของคุณ 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 คอนสตรัค
  • รูปร่างเมตริกซ์, v1.enable_v2_tensorshape() : TF 2.0 ช่วยลดความยุ่งยากพฤติกรรมของรูปร่างเมตริกซ์ แทนที่จะ t.shape[0].value ที่คุณสามารถพูด t.shape[0] การเปลี่ยนแปลงเหล่านี้ควรมีขนาดเล็กและมันทำให้ความรู้สึกที่จะแก้ไขปัญหาได้ทันที ดู TensorShape ตัวอย่าง

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

ทำให้โค้ด 2.0 พื้นเมือง

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

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

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

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

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

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

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

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

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

2. ใช้งูหลามวัตถุตัวแปรการติดตามและการสูญเสีย

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

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

ทุก v1.variable_scope ควรจะเปลี่ยนไปยังวัตถุหลาม ซึ่งโดยปกติจะเป็นหนึ่งใน:

หากคุณต้องการรายชื่อรวมของตัวแปร (เช่น 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 ชุดข้อมูลสำหรับการป้อนข้อมูล วัตถุเหล่านี้มีประสิทธิภาพที่แสดงออกและบูรณาการได้ดีกับ tensorflow

พวกเขาสามารถส่งผ่านโดยตรงไปยัง tf.keras.Model.fit วิธี

 model.fit(dataset, epochs=5)
 

พวกเขาสามารถซ้ำกว่ามาตรฐานโดยตรงหลาม:

 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 เพื่อ tf.argmax ตั้งแต่ ผู้ที่มีฟังก์ชั่นเดียวกัน)

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

การแปลงรูปแบบ

ติดตั้ง

 import tensorflow as tf


import tensorflow_datasets as tfds
 

ตัวแปรระดับต่ำและการดำเนินการผู้ประกอบการ

ตัวอย่างการใช้งานในระดับต่ำ API รวมถึง:

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

  • ใช้ v1.placeholder การตั้งค่าปัจจัยการผลิตกราฟ

  • การดำเนินการกับกราฟ Session.run

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

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

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

 in_a = tf.placeholder(dtype=tf.float32, shape=(2))
in_b = tf.placeholder(dtype=tf.float32, shape=(2))

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

out_a = forward(in_a)
out_b = forward(in_b)

reg_loss=tf.losses.get_regularization_loss(scope="matmul")

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

 

หลังจากแปลง

ในโค้ดแปลง:

  • ตัวแปรที่เป็นวัตถุหลามท้องถิ่น
  • forward ฟังก์ชั่นยังคงกำหนดคำนวณ
  • Session.run โทรจะถูกแทนที่ด้วยการเรียกร้องให้ forward
  • ตัวเลือก tf.function มัณฑนากรที่สามารถเพิ่มประสิทธิภาพการทำงาน
  • regularizations คำนวณด้วยตนเองโดยไม่ต้องหมายถึงคอลเลกชันใด ๆ ทั่วโลก
  • ไม่มีการประชุมหรือตัวยึด
 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 tf.variable_scope(scope, reuse=tf.AUTO_REUSE):
    x = tf.layers.conv2d(x, 32, 3, activation=tf.nn.relu,
          kernel_regularizer=tf.contrib.layers.l2_regularizer(0.04))
    x = tf.layers.max_pooling2d(x, (2, 2), 1)
    x = tf.layers.flatten(x)
    x = tf.layers.dropout(x, 0.1, training=training)
    x = tf.layers.dense(x, 64, activation=tf.nn.relu)
    x = tf.layers.batch_normalization(x, training=training)
    x = tf.layers.dense(x, 10)
    return x

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

หลังจากแปลง

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

  • 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.11456077 -0.3126101   0.13154565 -0.50197905 -0.02416557  0.36460522
  -0.24887308 -0.37784547  0.05524942  0.01696768]], 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.077528305>]

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

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

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

 def model(x, training, scope='model'):
  with tf.variable_scope(scope, reuse=tf.AUTO_REUSE):
    W = tf.get_variable(
      "W", dtype=tf.float32,
      initializer=tf.ones(shape=x.shape),
      regularizer=tf.contrib.layers.l2_regularizer(0.04),
      trainable=True)
    if training:
      x = x + W
    else:
      x = x + W * 0.5
    x = tf.layers.conv2d(x, 32, 3, activation=tf.nn.relu)
    x = tf.layers.max_pooling2d(x, (2, 2), 1)
    x = tf.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)

 

บางสิ่งบางอย่างที่จะต้องทราบ:

  • subclassed รุ่น Keras และชั้นต้องทำงานทั้งในกราฟ v1 (ไม่มีการอ้างอิงการควบคุมอัตโนมัติ) และในโหมดความกระตือรือร้น

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

    • บางครั้งก็เป็น tf.Tensor
    • บางครั้งก็เป็นแบบบูลหลาม
  • สร้างตัวแปรในรูปแบบคอนสตรัคหรือ 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 แปลงใช้รหัสผอม TF 2.0 มีส่วนร่วมมากขึ้นกว่าแปลงที่เก็บว่าการใช้ v1.layers ในความเป็นจริงมันอาจจะทำให้ความรู้สึกในการแปลงรหัส Slim ของคุณเพื่อ v1.layers แรกแล้วแปลง Keras

  • ลบ arg_scopes , args ทุกคนต้องมีความชัดเจน
  • หากคุณใช้พวกเขาแยก normalizer_fn และ activation_fn เป็นชั้นของตัวเอง
  • ชั้นแปลงแยก map หนึ่งหรือชั้น Keras ที่แตกต่างกันมากขึ้น (depthwise, pointwise และชั้น Keras แยกกันไม่ออก)
  • ที่บางเฉียบและ v1.layers มีชื่อหาเรื่องที่แตกต่างกันและเป็นค่าเริ่มต้น
  • args บางคนมีเครื่องชั่งน้ำหนักที่แตกต่างกัน
  • ถ้าคุณใช้ Slim รุ่นก่อนได้รับการฝึกฝนลอง Keras ของรุ่นก่อน traimed จาก tf.keras.applications หรือ TF Hub 's TF2 SavedModels ส่งออกจากรหัส Slim เดิม

บาง tf.contrib ชั้นอาจจะไม่ได้ถูกย้ายไปยังแกน TensorFlow แต่แทนที่จะได้รับการย้ายไป ลุย add-on แพคเกจ

การอบรม

มีหลายวิธีที่ข้อมูลฟีดจะเป็น tf.keras รุ่น พวกเขาจะยอมรับกำเนิดงูหลามและอาร์เรย์ Numpy เป็น input

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

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

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

TensorFlow ชุดข้อมูล แพคเกจ ( 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 กลับ batches:

 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

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

ข้อดีของวิธีการเหล่านี้รวมถึง:

  • พวกเขายอมรับอาร์เรย์ Numpy, Python กำเนิดและ tf.data.Datasets
  • พวกเขาใช้การสูญเสียกูและเปิดใช้งานโดยอัตโนมัติ
  • พวกเขาสนับสนุน tf.distribute สำหรับการฝึกอบรมหลายอุปกรณ์
  • พวกเขาสนับสนุน callables พลเป็นความสูญเสียและตัวชี้วัด
  • พวกเขาสนับสนุนการเรียกกลับเช่น tf.keras.callbacks.TensorBoard และเรียกกลับที่กำหนดเอง
  • พวกเขาจะ performant โดยอัตโนมัติโดยใช้กราฟ 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.5323 - accuracy: 0.5063
Epoch 2/5
5/5 [==============================] - 0s 6ms/step - loss: 0.4105 - accuracy: 0.9219
Epoch 3/5
5/5 [==============================] - 0s 7ms/step - loss: 0.2495 - accuracy: 0.9531
Epoch 4/5
5/5 [==============================] - 0s 6ms/step - loss: 0.1806 - accuracy: 0.9875
Epoch 5/5
5/5 [==============================] - 0s 6ms/step - loss: 0.1416 - accuracy: 0.9937
5/5 [==============================] - 0s 4ms/step - loss: 1.5655 - accuracy: 0.6469
Loss 1.565544605255127, Accuracy 0.6468750238418579

เขียนห่วงของคุณเอง

หากขั้นตอนการฝึกอบรมรุ่น 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.122 accuracy: 0.984
train:  loss: 0.133 accuracy: 0.984
train:  loss: 0.164 accuracy: 0.969
train:  loss: 0.167 accuracy: 0.969
train:  loss: 0.161 accuracy: 0.984

eval:  loss: 1.583 accuracy: 0.669
train:  loss: 0.074 accuracy: 1.000
train:  loss: 0.090 accuracy: 1.000
train:  loss: 0.089 accuracy: 1.000
train:  loss: 0.095 accuracy: 1.000
train:  loss: 0.090 accuracy: 1.000

eval:  loss: 1.567 accuracy: 0.747
train:  loss: 0.065 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.069 accuracy: 1.000
train:  loss: 0.067 accuracy: 1.000

eval:  loss: 1.545 accuracy: 0.772
train:  loss: 0.053 accuracy: 1.000
train:  loss: 0.063 accuracy: 0.984
train:  loss: 0.050 accuracy: 1.000
train:  loss: 0.051 accuracy: 1.000
train:  loss: 0.049 accuracy: 1.000

eval:  loss: 1.520 accuracy: 0.778
train:  loss: 0.049 accuracy: 1.000
train:  loss: 0.046 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000
train:  loss: 0.045 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000

eval:  loss: 1.494 accuracy: 0.791

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

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

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

โปรดจำไว้ว่า:

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

หมายเหตุ simplifications เทียบกับ v1:

  • ไม่มีความจำเป็นต้องเรียกใช้ initializers ตัวแปร ตัวแปรที่จะเริ่มต้นในการสร้าง
  • ไม่มีความจำเป็นต้องเพิ่มการอ้างอิงคู่มือการควบคุม แม้จะอยู่ใน 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

วัตถุที่สูญเสียเป็น callable และคาดว่า (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() - ล้างข้อสังเกตทั้งหมด

วัตถุที่ตัวเองเป็น callable โทรการปรับปรุงรัฐกับการสังเกตใหม่เช่นเดียวกับ 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.175
  accuracy: 0.994
Epoch:  1
  loss:     0.149
  accuracy: 0.991
Epoch:  2
  loss:     0.133
  accuracy: 0.991
Epoch:  3
  loss:     0.113
  accuracy: 0.997
Epoch:  4
  loss:     0.101
  accuracy: 0.997

ชื่อตัวชี้วัด Keras

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

ตอนนี้เมื่อคุณผ่านสตริงในรายการของตัวชี้วัดว่าสตริงที่แน่นอนจะถูกใช้เป็นตัวชี้วัดของ 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.1076 - acc: 0.9969 - accuracy: 0.9969 - my_accuracy: 0.9969

 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

ประหยัดและโหลด

ความเข้ากันได้ด่าน

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

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

ที่ง่ายเข้าใกล้มันจะสายขึ้นชื่อของรูปแบบใหม่ที่มีชื่อในด่านนี้:

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

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

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

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

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

  • TensorFlow 1.x saved_models ทำงานใน TensorFlow 2.x.
  • TensorFlow 2.x saved_models ทำงานใน TensorFlow 1.x ถ้า Ops ทั้งหมดที่ได้รับการสนับสนุน

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))
 

ยกตัวอย่างเช่นที่นี่เป็นกราฟ frozed สำหรับ 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 และรถไฟ / รายละเอียด EVAL

 # 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/tmpb3_a632k

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

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/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpb3_a632k', '_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/tmpb3_a632k', '_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/tmpb3_a632k/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/tmpb3_a632k/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/tmpb3_a632k/keras/keras_model.ckpt

INFO:tensorflow:Warm-starting from: /tmp/tmpb3_a632k/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/tmpb3_a632k/model.ckpt.

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

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

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

INFO:tensorflow:loss = 2.270717, step = 0

INFO:tensorflow:loss = 2.270717, 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/tmpb3_a632k/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpb3_a632k/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-07-23T01:32:32Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:32Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmpb3_a632k/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 : 1.01619s

INFO:tensorflow:Inference Time : 1.01619s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:33

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:33

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.671875, global_step = 25, loss = 1.5162958

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.671875, global_step = 25, loss = 1.5162958

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

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

INFO:tensorflow:Loss for final step: 0.39261085.

INFO:tensorflow:Loss for final step: 0.39261085.

({'accuracy': 0.671875, 'loss': 1.5162958, '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/tmpjb2yik9a

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

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpjb2yik9a', '_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/tmpjb2yik9a', '_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/tmpjb2yik9a/model.ckpt.

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

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

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

INFO:tensorflow:loss = 2.6231384, step = 0

INFO:tensorflow:loss = 2.6231384, 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/tmpjb2yik9a/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpjb2yik9a/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-07-23T01:32:36Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:36Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmpjb2yik9a/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 : 1.09900s

INFO:tensorflow:Inference Time : 1.09900s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:37

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:37

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.621875, global_step = 25, loss = 1.6634324

INFO:tensorflow:Saving dict for global step 25: accuracy = 0.621875, global_step = 25, loss = 1.6634324

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

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

INFO:tensorflow:Loss for final step: 0.56862533.

INFO:tensorflow:Loss for final step: 0.56862533.

({'accuracy': 0.621875, 'loss': 1.6634324, 'global_step': 25}, [])

ที่กำหนดเอง model_fn ที่มีสัญลักษณ์ TF 2.0

หากคุณต้องการที่จะได้รับการกำจัดของทุกสัญลักษณ์ TF 1.x และอัพเกรดกำหนดเองของคุณ model_fn ลุยพื้นเมือง 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 (ไม่ callable) องค์ประกอบแรกในรายการกลับเป็นที่ต้องการ train_op/minimize_op
    • หากการสูญเสียเป็น callable (เช่นฟังก์ชั่น) ให้ใช้ 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/tmppkb1q1hq

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

INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmppkb1q1hq', '_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/tmppkb1q1hq', '_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/tmppkb1q1hq/model.ckpt.

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

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

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

INFO:tensorflow:loss = 2.6947184, step = 0

INFO:tensorflow:loss = 2.6947184, 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/tmppkb1q1hq/model.ckpt.

INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmppkb1q1hq/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-07-23T01:32:40Z

INFO:tensorflow:Starting evaluation at 2020-07-23T01:32:40Z

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Graph was finalized.

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

INFO:tensorflow:Restoring parameters from /tmp/tmppkb1q1hq/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 : 1.05743s

INFO:tensorflow:Inference Time : 1.05743s

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:41

INFO:tensorflow:Finished evaluation at 2020-07-23-01:32:41

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.784375, global_step = 25, loss = 1.4717665

INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.784375, global_step = 25, loss = 1.4717665

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

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

INFO:tensorflow:Loss for final step: 0.5751184.

INFO:tensorflow:Loss for final step: 0.5751184.

({'Accuracy': 0.784375, 'loss': 1.4717665, 'global_step': 25}, [])

เพสตรี้ประมาณค่า

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

  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 หาเรื่องหรือถ้าคุณระบุ optimizer หาเรื่องเป็น string ในรหัสของคุณคุณไม่จำเป็นต้องมีการเปลี่ยนแปลงอะไร tf.keras.optimizers ถูกนำมาใช้เป็นค่าเริ่มต้น มิฉะนั้นคุณต้องอัปเดตได้จาก tf.compat.v1.train.Optimizer จะสอดคล้องกัน tf.keras.optimizers

ด่านแปลง

การโยกย้ายไป keras.optimizers จะทำลายด่านบันทึกไว้โดยใช้ 1.x TF เป็น 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 15157  100 15157    0     0  63684      0 --:--:-- --:--:-- --:--:-- 63684

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

 python checkpoint_converter.py -h
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.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. นำสัญลักษณ์ contrib
  3. สวิทช์รุ่นของคุณไปยังรูปแบบเชิงวัตถุ (Keras)
  4. ใช้ tf.keras หรือ tf.estimator การฝึกอบรมและการประเมินผลลูปที่คุณสามารถ
  5. มิฉะนั้นการใช้ลูปที่กำหนดเอง แต่ต้องแน่ใจว่าเพื่อหลีกเลี่ยงการประชุมและคอลเลกชัน

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

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