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

ดูบน TensorFlow.org ทำงานใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดโน๊ตบุ๊ค

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

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

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

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

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

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

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

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

หากรหัสของคุณทำงานใน TensorFlow 2.x ใช้ tf.compat.v1.disable_v2_behavior ยังคงมีการเปลี่ยนแปลงพฤติกรรมทั่วโลกคุณอาจจำเป็นต้องอยู่ การเปลี่ยนแปลงที่สำคัญคือ:

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

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

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

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

สร้างรหัสสำหรับ TensorFlow 2.x

คู่มือนี้จะอธิบายตัวอย่างต่างๆ ของการแปลงโค้ด TensorFlow 1.x เป็น TensorFlow 2.x การเปลี่ยนแปลงเหล่านี้จะทำให้โค้ดของคุณใช้ประโยชน์จากการเพิ่มประสิทธิภาพและการเรียก 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. ใช้วัตถุ Python เพื่อติดตามตัวแปรและความสูญเสีย

การติดตามตัวแปรตามชื่อทั้งหมดไม่สนับสนุนอย่างยิ่งใน TensorFlow 2.x ใช้วัตถุ 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 กับชุดข้อมูลสำหรับการป้อนข้อมูล วัตถุเหล่านี้มีประสิทธิภาพ แสดงออก และรวมเข้ากับเทนเซอร์โฟลว์ได้ดี

พวกเขาสามารถส่งผ่านโดยตรงไปยัง 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 ที่สมบูรณ์มีความหมายเดิม

TensorFlow 2.x อัพเกรดสคริปต์ จะแปลงสัญลักษณ์เทียบเท่า v2 ของพวกเขาถ้าเช่นการแปลงมีความปลอดภัยคือถ้ามันสามารถตรวจสอบว่าพฤติกรรมของรุ่น TensorFlow 2.x เป็นเทียบเท่าตรง (เช่นมันจะเปลี่ยนชื่อ v1.arg_max เพื่อ tf.argmax ตั้งแต่ผู้ที่มีฟังก์ชั่นเดียวกัน)

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

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

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

ตัวอย่างการใช้ 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
2021-07-19 23:37:03.701382: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
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])
2021-07-19 23:37:05.720243: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcuda.so.1
2021-07-19 23:37:06.406838: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:06.407495: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:06.407533: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-19 23:37:06.410971: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
2021-07-19 23:37:06.411090: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11
2021-07-19 23:37:06.412239: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcufft.so.10
2021-07-19 23:37:06.412612: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcurand.so.10
2021-07-19 23:37:06.413657: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusolver.so.11
2021-07-19 23:37:06.414637: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcusparse.so.11
2021-07-19 23:37:06.414862: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudnn.so.8
2021-07-19 23:37:06.415002: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:06.415823: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:06.416461: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:06.417159: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-07-19 23:37:06.417858: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:06.418588: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:06.418704: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:06.419416: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:06.420021: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:06.420085: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2021-07-19 23:37:07.053897: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:07.053954: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:07.053964: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:07.054212: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:07.054962: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:07.055685: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:07.056348: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
2021-07-19 23:37:07.060371: I tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 2000165000 Hz
[[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)
2021-07-19 23:37:07.370160: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:07.370572: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:07.370699: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:07.371011: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:07.371278: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:07.371360: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:07.371370: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:07.371377: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:07.371511: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:07.371844: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:07.372131: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
2021-07-19 23:37:07.419147: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:176] None of the MLIR Optimization Passes are enabled (registered 2)
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)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/legacy_tf_layers/convolutional.py:414: UserWarning: `tf.layers.conv2d` is deprecated and will be removed in a future version. Please Use `tf.keras.layers.Conv2D` instead.
  warnings.warn('`tf.layers.conv2d` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py:2183: UserWarning: `layer.apply` is deprecated and will be removed in a future version. Please use `layer.__call__` method instead.
  warnings.warn('`layer.apply` is deprecated and '
2021-07-19 23:37:07.471106: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudnn.so.8
2021-07-19 23:37:09.562531: I tensorflow/stream_executor/cuda/cuda_dnn.cc:359] Loaded cuDNN version 8100
2021-07-19 23:37:14.794726: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublas.so.11
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

tf.Tensor(
[[ 0.04853132 -0.08974641 -0.32679698  0.07017353  0.12982666 -0.2153313
  -0.09793851  0.10957378  0.01823931  0.00898573]], shape=(1, 10), dtype=float32)
2021-07-19 23:37:15.173234: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcublasLt.so.11
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/legacy_tf_layers/pooling.py:310: UserWarning: `tf.layers.max_pooling2d` is deprecated and will be removed in a future version. Please use `tf.keras.layers.MaxPooling2D` instead.
  warnings.warn('`tf.layers.max_pooling2d` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:329: UserWarning: `tf.layers.flatten` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Flatten` instead.
  warnings.warn('`tf.layers.flatten` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:268: UserWarning: `tf.layers.dropout` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dropout` instead.
  warnings.warn('`tf.layers.dropout` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/legacy_tf_layers/core.py:171: UserWarning: `tf.layers.dense` is deprecated and will be removed in a future version. Please use `tf.keras.layers.Dense` instead.
  warnings.warn('`tf.layers.dense` is deprecated and '
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/legacy_tf_layers/normalization.py:308: UserWarning: `tf.layers.batch_normalization` is deprecated and will be removed in a future version. Please use `tf.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.layers.batch_normalization` is deprecated and '

หลังจากแปลงแล้ว

  • สแต็คที่เรียบง่ายของชั้นเหมาะอย่างเรียบร้อยใน tf.keras.Sequential (สำหรับรุ่นที่ซับซ้อนมากขึ้นตรวจสอบ ชั้นที่กำหนดเองและรูปแบบ และ API ที่ทำงาน ไกด์.)
  • โมเดลติดตามตัวแปรและการสูญเสียการทำให้เป็นมาตรฐาน
  • การแปลงเป็นหนึ่งต่อหนึ่งเพราะมีการทำแผนที่โดยตรงจาก v1.layers เพื่อ tf.keras.layers

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

  • 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.06252427  0.30122417 -0.18610534 -0.04890637 -0.01496555  0.41607457
   0.24905115  0.014429   -0.12719882 -0.22354674]], 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.07443664>]

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

รหัสที่มีอยู่มักจะผสมในระดับต่ำกว่า TensorFlow 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 ตรวจสอบ การทำเลเยอร์ใหม่และรุ่นผ่านคู่มือ subclassing สำหรับรายละเอียด

# 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 เก่าใช้ สลิม ห้องสมุดซึ่งเป็นชุดที่มี TensorFlow 1.x เป็น tf.contrib.layers ในฐานะที่เป็น contrib โมดูลนี้ไม่สามารถใช้ได้อีกใน TensorFlow 2.x แม้ใน tf.compat.v1 แปลงใช้รหัสผอม TensorFlow 2.x มีส่วนร่วมมากขึ้นกว่าแปลงที่เก็บที่ใช้ v1.layers ในความเป็นจริงมันอาจจะทำให้ความรู้สึกในการแปลงรหัสสลิมของคุณเพื่อ v1.layers แรกแล้วแปลง Keras

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

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

การฝึกอบรม

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

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

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

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

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

ตัวอย่างนี้คุณสามารถโหลดชุดข้อมูลโดยใช้ MNIST tfds :

datasets, info = tfds.load(name='mnist', with_info=True, as_supervised=True)
mnist_train, mnist_test = datasets['train'], datasets['test']

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

  • ปรับขนาดภาพแต่ละภาพอีกครั้ง
  • สับเปลี่ยนลำดับของตัวอย่าง
  • รวบรวมชุดรูปภาพและป้ายกำกับ
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))
2021-07-19 23:37:19.049077: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

ใช้ลูปการฝึกของ Keras

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

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

  • พวกเขายอมรับอาร์เรย์ Numpy, Python กำเนิดและ tf.data.Datasets
  • พวกเขาใช้การทำให้เป็นมาตรฐานและการสูญเสียการเปิดใช้งานโดยอัตโนมัติ
  • พวกเขาสนับสนุน tf.distribute สำหรับการฝึกอบรมหลายอุปกรณ์
  • พวกเขาสนับสนุน callables โดยพลการเป็นการสูญเสียและตัวชี้วัด
  • พวกเขาสนับสนุนการเรียกกลับเช่น 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 [==============================] - 2s 8ms/step - loss: 1.5874 - accuracy: 0.4719
Epoch 2/5
2021-07-19 23:37:20.919125: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 0s 5ms/step - loss: 0.4435 - accuracy: 0.9094
Epoch 3/5
2021-07-19 23:37:21.242435: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 0s 6ms/step - loss: 0.2764 - accuracy: 0.9594
Epoch 4/5
2021-07-19 23:37:21.576808: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 0s 5ms/step - loss: 0.1889 - accuracy: 0.9844
Epoch 5/5
2021-07-19 23:37:21.888991: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 1s 6ms/step - loss: 0.1504 - accuracy: 0.9906
2021-07-19 23:37:23.082199: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
5/5 [==============================] - 1s 3ms/step - loss: 1.6299 - accuracy: 0.7031
Loss 1.6299388408660889, Accuracy 0.703125
2021-07-19 23:37:23.932781: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

เขียนลูปของคุณเอง

หากขั้นตอนการฝึกอบรมรุ่น 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.131 accuracy: 1.000
train:  loss: 0.179 accuracy: 0.969
train:  loss: 0.117 accuracy: 0.984
train:  loss: 0.187 accuracy: 0.969
train:  loss: 0.168 accuracy: 0.969
2021-07-19 23:37:24.758128: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
2021-07-19 23:37:25.476778: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
eval:  loss: 1.655 accuracy: 0.703
train:  loss: 0.083 accuracy: 1.000
train:  loss: 0.080 accuracy: 1.000
train:  loss: 0.099 accuracy: 0.984
train:  loss: 0.088 accuracy: 1.000
train:  loss: 0.084 accuracy: 1.000
2021-07-19 23:37:25.822978: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
2021-07-19 23:37:26.103858: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
eval:  loss: 1.645 accuracy: 0.759
train:  loss: 0.066 accuracy: 1.000
train:  loss: 0.070 accuracy: 1.000
train:  loss: 0.062 accuracy: 1.000
train:  loss: 0.067 accuracy: 1.000
train:  loss: 0.061 accuracy: 1.000
2021-07-19 23:37:26.454306: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
2021-07-19 23:37:26.715112: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
eval:  loss: 1.609 accuracy: 0.819
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.053 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000
train:  loss: 0.057 accuracy: 1.000
train:  loss: 0.069 accuracy: 0.984
2021-07-19 23:37:27.059747: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
2021-07-19 23:37:27.327066: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
eval:  loss: 1.568 accuracy: 0.825
train:  loss: 0.048 accuracy: 1.000
train:  loss: 0.048 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000
train:  loss: 0.045 accuracy: 1.000
train:  loss: 0.045 accuracy: 1.000
2021-07-19 23:37:28.593597: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
eval:  loss: 1.531 accuracy: 0.841
2021-07-19 23:37:29.220455: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

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

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

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

จำไว้ว่า:

  • เสมอรวมถึง training การโต้แย้งเกี่ยวกับ call วิธีการของชั้น subclassed และรูปแบบ
  • ให้แน่ใจว่าจะเรียกรูปแบบกับ 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)
2021-07-19 23:37:29.998049: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Finished epoch 0
2021-07-19 23:37:30.316333: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Finished epoch 1
2021-07-19 23:37:30.618560: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Finished epoch 2
2021-07-19 23:37:30.946881: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Finished epoch 3
Finished epoch 4
2021-07-19 23:37:31.261594: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

เมตริกและการขาดทุนรูปแบบใหม่

ใน TensorFlow 2.x เมตริกและความสูญเสียเป็นวัตถุ เหล่านี้ทำงานทั้งกระหายและ 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.x มีการพึ่งพาการควบคุมอัตโนมัติ คุณจึงไม่ต้องกังวลกับสิ่งเหล่านั้น

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

# 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))
2021-07-19 23:37:31.878403: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Epoch:  0
  loss:     0.172
  accuracy: 0.988
2021-07-19 23:37:32.177136: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Epoch:  1
  loss:     0.143
  accuracy: 0.997
2021-07-19 23:37:32.493570: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Epoch:  2
  loss:     0.126
  accuracy: 0.997
2021-07-19 23:37:32.807739: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
Epoch:  3
  loss:     0.109
  accuracy: 1.000
Epoch:  4
  loss:     0.092
  accuracy: 1.000
2021-07-19 23:37:33.155028: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

ชื่อเมตริก Keras

ใน TensorFlow 2.x โมเดล 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 [==============================] - 1s 6ms/step - loss: 0.1042 - acc: 0.9969 - accuracy: 0.9969 - my_accuracy: 0.9969
2021-07-19 23:37:34.039643: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
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

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

เทนเซอร์บอร์ด

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

การบันทึกและการโหลด

ความเข้ากันได้ของจุดตรวจ

TensorFlow 2.x ใช้ จุดตรวจวัตถุตาม

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

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

  • ตัวแปรที่ยังคงทุกคนมี 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.x. ทางออกที่ดีที่สุดของคุณคืออัปเกรดรหัสที่สร้างไฟล์

แต่ถ้าคุณมี "กราฟแช่แข็ง" (ก 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.x

เมื่อคุณใช้ตัวประมาณคุณสามารถใช้ 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 and 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.x

ก็ขอแนะนำให้คุณกำหนดรูปแบบของคุณโดยใช้ 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/tmpbhtumut0
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpbhtumut0
INFO:tensorflow:Using the Keras model provided.
INFO:tensorflow:Using the Keras model provided.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/layers/normalization.py:534: _colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/backend.py:435: UserWarning: `tf.keras.backend.set_learning_phase` is deprecated and will be removed after 2020-10-11. To update it, simply pass a True/False value to the `training` argument of the `__call__` method of your layer or model.
  warnings.warn('`tf.keras.backend.set_learning_phase` is deprecated and '
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/layers/normalization.py:534: _colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpbhtumut0', '_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, '_checkpoint_save_graph_def': True, '_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}
2021-07-19 23:37:36.453946: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:36.454330: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:36.454461: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:36.454737: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:36.454977: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:36.455020: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:36.455027: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:36.455033: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:36.455126: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:36.455479: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:36.455779: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpbhtumut0', '_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, '_checkpoint_save_graph_def': True, '_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.7/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.7/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/tmpbhtumut0/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/tmpbhtumut0/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/tmpbhtumut0/keras/keras_model.ckpt
INFO:tensorflow:Warm-starting from: /tmp/tmpbhtumut0/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.
2021-07-19 23:37:39.175917: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:39.176299: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:39.176424: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:39.176729: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:39.176999: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:39.177042: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:39.177050: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:39.177057: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:39.177159: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:39.177481: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:39.177761: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
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/tmpbhtumut0/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpbhtumut0/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 3.1193407, step = 0
INFO:tensorflow:loss = 3.1193407, 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/tmpbhtumut0/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpbhtumut0/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.
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:2426: UserWarning: `Model.state_updates` will be removed in a future version. This property should not be used in TensorFlow 2.0, as `updates` are applied automatically.
  warnings.warn('`Model.state_updates` will be removed in a future version. '
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2021-07-19T23:37:42
INFO:tensorflow:Starting evaluation at 2021-07-19T23:37:42
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
2021-07-19 23:37:42.476830: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:42.477207: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:42.477339: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:42.477648: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:42.477910: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:42.477955: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:42.477963: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:42.477969: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:42.478058: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:42.478332: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
INFO:tensorflow:Restoring parameters from /tmp/tmpbhtumut0/model.ckpt-25
2021-07-19 23:37:42.478592: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
INFO:tensorflow:Restoring parameters from /tmp/tmpbhtumut0/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.02146s
2021-07-19 23:37:43.437293: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
INFO:tensorflow:Inference Time : 1.02146s
INFO:tensorflow:Finished evaluation at 2021-07-19-23:37:43
INFO:tensorflow:Finished evaluation at 2021-07-19-23:37:43
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.634375, global_step = 25, loss = 1.493957
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.634375, global_step = 25, loss = 1.493957
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpbhtumut0/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpbhtumut0/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.37796202.
2021-07-19 23:37:43.510911: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
INFO:tensorflow:Loss for final step: 0.37796202.
({'accuracy': 0.634375, 'loss': 1.493957, 'global_step': 25}, [])

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

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

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

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

เพื่อให้การกำหนดเองของคุณ model_fn ทำงานใน TensorFlow 2.x ถ้าคุณชอบการเปลี่ยนแปลงน้อยที่สุดเพื่อรหัสที่มีอยู่, 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/tmpqiom6a5s
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpqiom6a5s
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpqiom6a5s', '_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, '_checkpoint_save_graph_def': True, '_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/tmpqiom6a5s', '_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, '_checkpoint_save_graph_def': True, '_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.
2021-07-19 23:37:46.140692: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:46.141065: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:46.141220: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:46.141517: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:46.141765: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:46.141807: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:46.141814: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:46.141820: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:46.141907: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:46.142234: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:46.142497: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
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/tmpqiom6a5s/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpqiom6a5s/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 2.9167266, step = 0
INFO:tensorflow:loss = 2.9167266, 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/tmpqiom6a5s/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpqiom6a5s/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 2021-07-19T23:37:49
INFO:tensorflow:Starting evaluation at 2021-07-19T23:37:49
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpqiom6a5s/model.ckpt-25
2021-07-19 23:37:49.640699: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:49.641091: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:49.641238: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:49.641580: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:49.641848: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:49.641893: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:49.641901: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:49.641910: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:49.642029: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:49.642355: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:49.642657: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
INFO:tensorflow:Restoring parameters from /tmp/tmpqiom6a5s/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.38362s
2021-07-19 23:37:50.924973: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
INFO:tensorflow:Inference Time : 1.38362s
INFO:tensorflow:Finished evaluation at 2021-07-19-23:37:50
INFO:tensorflow:Finished evaluation at 2021-07-19-23:37:50
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.70625, global_step = 25, loss = 1.6135181
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.70625, global_step = 25, loss = 1.6135181
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpqiom6a5s/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpqiom6a5s/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.60315084.
2021-07-19 23:37:51.035953: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
INFO:tensorflow:Loss for final step: 0.60315084.
({'accuracy': 0.70625, 'loss': 1.6135181, 'global_step': 25}, [])

ที่กำหนดเอง model_fn ที่มีสัญลักษณ์ 2.x TensorFlow

หากคุณต้องการที่จะได้รับการกำจัดของทุกสัญลักษณ์ TensorFlow 1.x และอัพเกรดกำหนดเองของคุณ model_fn เพื่อ TensorFlow 2.x, คุณจำเป็นต้องปรับปรุงเพิ่มประสิทธิภาพและตัวชี้วัดเพื่อ 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.x TensorFlow จะแสดงเป็น:

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 and 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/tmpomveromc
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpomveromc
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpomveromc', '_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, '_checkpoint_save_graph_def': True, '_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/tmpomveromc', '_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, '_checkpoint_save_graph_def': True, '_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.
2021-07-19 23:37:53.371110: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:53.371633: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:53.371845: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:53.372311: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:53.372679: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:53.372742: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:53.372779: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:53.372790: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:53.372939: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:53.373380: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:53.373693: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
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/tmpomveromc/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpomveromc/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 2.874814, step = 0
INFO:tensorflow:loss = 2.874814, 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/tmpomveromc/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpomveromc/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 2021-07-19T23:37:56
INFO:tensorflow:Starting evaluation at 2021-07-19T23:37:56
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpomveromc/model.ckpt-25
2021-07-19 23:37:56.884303: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:56.884746: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1733] Found device 0 with properties: 
pciBusID: 0000:00:05.0 name: NVIDIA Tesla V100-SXM2-16GB computeCapability: 7.0
coreClock: 1.53GHz coreCount: 80 deviceMemorySize: 15.78GiB deviceMemoryBandwidth: 836.37GiB/s
2021-07-19 23:37:56.884934: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:56.885330: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:56.885640: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1871] Adding visible gpu devices: 0
2021-07-19 23:37:56.885696: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1258] Device interconnect StreamExecutor with strength 1 edge matrix:
2021-07-19 23:37:56.885711: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1264]      0 
2021-07-19 23:37:56.885720: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1277] 0:   N 
2021-07-19 23:37:56.885861: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:56.886386: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2021-07-19 23:37:56.886729: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1418] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 14646 MB memory) -> physical GPU (device: 0, name: NVIDIA Tesla V100-SXM2-16GB, pci bus id: 0000:00:05.0, compute capability: 7.0)
INFO:tensorflow:Restoring parameters from /tmp/tmpomveromc/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.04574s
2021-07-19 23:37:57.852422: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
INFO:tensorflow:Inference Time : 1.04574s
INFO:tensorflow:Finished evaluation at 2021-07-19-23:37:57
INFO:tensorflow:Finished evaluation at 2021-07-19-23:37:57
INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.790625, global_step = 25, loss = 1.4257433
INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.790625, global_step = 25, loss = 1.4257433
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpomveromc/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpomveromc/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.42627147.
2021-07-19 23:37:57.941217: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
INFO:tensorflow:Loss for final step: 0.42627147.
({'Accuracy': 0.790625, 'loss': 1.4257433, 'global_step': 25}, [])

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

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

  1. input_layer_partitioner : ถูกลบออกใน v2
  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 จะจัดการกับมันโดยอัตโนมัติใน TensorFlow 2.x.
  2. สำหรับ loss_reduction ตรวจสอบ tf.keras.losses.Reduction สำหรับตัวเลือกที่ได้รับการสนับสนุน
  3. สำหรับการ optimizer การขัดแย้ง:
    • ถ้าคุณไม่ทำ: 1) ผ่านใน optimizer , dnn_optimizer หรือ linear_optimizer โต้แย้งหรือ 2) ระบุ optimizer อาร์กิวเมนต์เป็น string ในรหัสของคุณแล้วคุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรเพราะ tf.keras.optimizers ถูกนำมาใช้เป็นค่าเริ่มต้น .
    • มิฉะนั้นคุณต้องอัปเดตได้จาก tf.compat.v1.train.Optimizer จะสอดคล้องกัน tf.keras.optimizers

ตัวแปลงจุดตรวจ

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

 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 14889  100 14889    0     0  60771      0 --:--:-- --:--:-- --:--:-- 60771

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

 python checkpoint_converter.py -h
2021-07-19 23:37:58.805973: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
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

เทนเซอร์รูปร่าง

ระดับนี้ได้ง่ายการระงับ int s แทน tf.compat.v1.Dimension วัตถุ จึงมีความจำเป็นที่จะเรียกไม่มี .value ที่จะได้รับ int

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

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

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

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

value = shape[i].value

จากนั้นทำสิ่งนี้ใน TensorFlow 2.x:

value = shape[i]
value
16

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

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

จากนั้นทำสิ่งนี้ใน TensorFlow 2.x:

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

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

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

จากนั้นทำสิ่งนี้ใน TensorFlow 2.x:

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.x นั้นใช้เวลาเล็กน้อย แต่การเปลี่ยนแปลงทุกอย่างจะส่งผลให้

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