TF.s সারসংক্ষেপ ব্যবহার TF 2.x এ স্থানান্তরিত করা

TensorFlow.org এ দেখুন গুগল কোলাবে চালান GitHub এ উৎস দেখুন নোটবুক ডাউনলোড করুন
import tensorflow as tf

TensorFlow 2.x গুরুত্বপূর্ণ পরিবর্তন অন্তর্ভুক্ত tf.summary TensorBoard মধ্যে ঠাহর জন্য লেখ সারসংক্ষেপ ডেটাতে ব্যবহৃত API- টি।

কি পরিবর্তন হয়েছে

মনে কারো উপকারে লাগতেছে tf.summary দুই উপ-API গুলি যেমন এপিআই:

  • রেকর্ডিং পৃথক সারাংশ জন্য অপস একটি সেট - summary.scalar() , summary.histogram() , summary.image() , summary.audio() , এবং summary.text() - যা আপনার মডেল কোড থেকে ইনলাইন বলা হয়।
  • লেখার যুক্তি যা এই পৃথক সংক্ষিপ্তসারগুলি সংগ্রহ করে এবং সেগুলি একটি বিশেষ বিন্যাসিত লগ ফাইলে (যা টেনসরবোর্ড তখন ভিজ্যুয়ালাইজেশন তৈরি করতে পড়ে) লিখে দেয়।

TF 1.x এ

ছিল দুই অর্ধেক নিজে একসঙ্গে উপভোগ করা - মাধ্যমে সারসংক্ষেপ অপ আউটপুট আনার সময় দ্বারা Session.run() এবং কলিং FileWriter.add_summary(output, step)v1.summary.merge_all() অপ এই একটি গ্রাফ সংগ্রহে ব্যবহার সব সারসংক্ষেপ অপ আউটপুট সমষ্টি দ্বারা সহজ করে, কিন্তু এই পদ্ধতির এখনও উৎসুক ফাঁসি ও নিয়ন্ত্রণ প্রবাহের জন্য দুর্বল কাজ উপার্জন এটি বিশেষ মেমরি 2.x. জন্য মন্দ উপযুক্ত

TF 2.X এ

দুই অর্ধেক শক্তভাবে একত্রিত হয়, এবং এখন পৃথক tf.summary অপস যখন মৃত্যুদন্ড কার্যকর তাদের তথ্য অবিলম্বে লিখুন। আপনার মডেল কোড থেকে API ব্যবহার করা এখনও পরিচিত হওয়া উচিত, কিন্তু গ্রাফ-মোড সামঞ্জস্যপূর্ণ থাকাকালীন এটি এখন আগ্রহী বাস্তবায়নের জন্য বন্ধুত্বপূর্ণ। এপিআই উপায়ে উভয় অর্ধেক একীভূত summary.FileWriter এখন TensorFlow সঞ্চালনের প্রসঙ্গের অংশ এবং সরাসরি অ্যাক্সেস পরার tf.summary অপস, তাই লেখকদের কনফিগার প্রধান অংশ সৌন্দর্য বিভিন্ন হয়।

উদগ্রীব এক্সিকিউশনের সাথে উদাহরণ ব্যবহার, TF 2.x এ ডিফল্ট:

writer = tf.summary.create_file_writer("/tmp/mylogs/eager")

with writer.as_default():
  for step in range(100):
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)
    writer.flush()
ls /tmp/mylogs/eager
events.out.tfevents.1631963355.kokoro-gcp-ubuntu-prod-1653899854.8066.0.v2

Tf.function গ্রাফ এক্সিকিউশনের সাথে উদাহরণ ব্যবহার:

writer = tf.summary.create_file_writer("/tmp/mylogs/tf_function")

@tf.function
def my_func(step):
  with writer.as_default():
    # other model code would go here
    tf.summary.scalar("my_metric", 0.5, step=step)

for step in tf.range(100, dtype=tf.int64):
  my_func(step)
  writer.flush()
ls /tmp/mylogs/tf_function
events.out.tfevents.1631963355.kokoro-gcp-ubuntu-prod-1653899854.8066.1.v2

লিগ্যাসি TF 1.x গ্রাফ এক্সিকিউশনের সাথে ব্যবহারের উদাহরণ:

g = tf.compat.v1.Graph()
with g.as_default():
  step = tf.Variable(0, dtype=tf.int64)
  step_update = step.assign_add(1)
  writer = tf.summary.create_file_writer("/tmp/mylogs/session")
  with writer.as_default():
    tf.summary.scalar("my_metric", 0.5, step=step)
  all_summary_ops = tf.compat.v1.summary.all_v2_summary_ops()
  writer_flush = writer.flush()


with tf.compat.v1.Session(graph=g) as sess:
  sess.run([writer.init(), step.initializer])

  for i in range(100):
    sess.run(all_summary_ops)
    sess.run(step_update)
    sess.run(writer_flush)
ls /tmp/mylogs/session
events.out.tfevents.1631963356.kokoro-gcp-ubuntu-prod-1653899854.8066.2.v2

আপনার কোড রূপান্তর

বিদ্যমান রূপান্তর tf.summary মেমরি 2.x এপিআই এ ব্যবহার নির্ভরযোগ্যভাবে স্বয়ংক্রিয় করা যাবে না, তাই tf_upgrade_v2 স্ক্রিপ্ট শুধু এটা সব থেকে নতুন করে লেখা হয় tf.compat.v1.summary । TF 2.x এ স্থানান্তরিত করতে, আপনাকে নিম্নরূপ আপনার কোড মানিয়ে নিতে হবে:

  1. এর মাধ্যমে একটি ডিফল্ট লেখক সেট .as_default() ব্যবহার সারসংক্ষেপ অপস উপস্থিত থাকতে হবে

    • এর মানে হল আগ্রহীভাবে অপস চালানো বা গ্রাফ নির্মাণে অপস ব্যবহার করা
    • একটি ডিফল্ট লেখক ছাড়া, সারাংশ অপস নীরব অপস হয়ে যায়
    • ডিফল্ট লেখকদের (এখনও) জুড়ে সঞ্চারিত না @tf.function সঞ্চালনের সীমানা - তারা শুধুমাত্র সনাক্ত করা হয় যখন ফাংশন আঁকা হয় - তাই সেরা অনুশীলনের কল হয় writer.as_default() ফাংশন শরীরের মধ্যে, এবং তা নিশ্চিত করার জন্য লেখক বস্তুর যতদিন অস্তিত্ব অব্যাহত যেমন @tf.function ব্যবহৃত হচ্ছে
  2. "ধাপে" মান একটি মাধ্যমে একে অপ মধ্যে প্রেরণ করা আবশ্যক step যুক্তি

    • TensorBoard- এর ডেটাকে একটি সময় সিরিজ হিসেবে রেন্ডার করার জন্য একটি স্টেপ ভ্যালু প্রয়োজন
    • স্পষ্ট পাস করা আবশ্যক কারণ TF 1.x থেকে বিশ্বব্যাপী পদক্ষেপটি সরানো হয়েছে, তাই প্রতিটি অপকে অবশ্যই পড়ার জন্য পছন্দসই স্টেপ ভেরিয়েবল জানতে হবে
    • Boilerplate, কমাতে, একটি ডিফল্ট পদক্ষেপ মান নিবন্ধনের জন্য পরীক্ষামূলক সহায়তা হিসাবে পাওয়া যায় tf.summary.experimental.set_step() , কিন্তু এই কাঁচা কার্যকারিতা যা নোটিশ ছাড়াই পরিবর্তন করা হতে পারে
  3. পৃথক সারাংশ অপস এর ফাংশন স্বাক্ষর পরিবর্তিত হয়েছে

    • রিটার্ন ভ্যালু এখন একটি বুলিয়ান (ইঙ্গিত দিচ্ছে যে সারাংশ আসলে লেখা ছিল কিনা)
    • দ্বিতীয় প্যারামিটারটি নাম (ব্যবহার করে থাকেন) থেকে পরিবর্তিত হয়েছে tensor করার data
    • collections প্যারামিটার সরানো হয়েছে; সংগ্রহ শুধুমাত্র TF 1.x
    • family প্যারামিটার সরানো হয়েছে; শুধু ব্যবহার tf.name_scope()
  4. [শুধুমাত্র লিগ্যাসি গ্রাফ মোড / সেশন এক্সিকিউশন ব্যবহারকারীদের জন্য]

    • প্রথম লেখক আরম্ভ v1.Session.run(writer.init())

    • ব্যবহারের v1.summary.all_v2_summary_ops() বর্তমান গ্রাফ জন্য সব মেমরি 2.x সারসংক্ষেপ অপস পেতে, যেমন এর মাধ্যমে তাদের চালানো Session.run()

    • সঙ্গে লেখক ফ্লাশ v1.Session.run(writer.flush()) এবং অনুরূপভাবে জন্য close()

আপনার TF 1.x কোড পরিবর্তে ব্যবহার করছিলেন তাহলে tf.contrib.summary এপিআই, এটা আরো অনেক কিছু মেমরি 2.x এপিআই অনুরূপ, তাই tf_upgrade_v2 স্ক্রিপ্ট কোনো ব্যবহারের জন্য মাইগ্রেশন ধাপের সবচেয়ে (এবং নির্গত সতর্কবার্তা বা ত্রুটি স্বয়ংক্রিয় করবে না করতে পারেন সম্পূর্ণরূপে স্থানান্তরিত)। অধিকাংশ অংশ জন্য এটি শুধু API কল নতুন করে লেখা হয় tf.compat.v2.summary ; আপনি ড্রপ করতে পারেন আপনি শুধুমাত্র মেমরি 2.x সাথে সামঞ্জস্যের প্রয়োজন compat.v2 এবং মাত্র যেমন উল্লেখ tf.summary

অতিরিক্ত টিপস

উপরের সমালোচনামূলক ক্ষেত্রগুলি ছাড়াও, কিছু সহায়ক দিকও পরিবর্তিত হয়েছে:

  • শর্তাধীন রেকর্ডিং (যেমন "প্রতি ১০০ ধাপে লগ করুন") একটি নতুন চেহারা

    • নিয়ন্ত্রণ অপস এবং সংশ্লিষ্ট কোড, তাদের একটি নিয়মিত যদি বিবৃতি (যা উৎসুক মোডে এবং কাজ মধ্যে মোড়ানো @tf.function অটোগ্রাফ মাধ্যমে ) অথবা একটি tf.cond
    • শুধু সারাংশ নিয়ন্ত্রণ করার জন্য, নতুন ব্যবহার tf.summary.record_if() প্রসঙ্গ ম্যানেজার, এবং এটি আপনার পছন্দসই বুলিয়ান শর্ত পাস
    • এগুলি TF 1.x প্যাটার্নকে প্রতিস্থাপন করে:

      if condition:
        writer.add_summary()
      
  • এর কোনো সরাসরি লেখা tf.compat.v1.Graph - পরিবর্তে ব্যবহার ট্রেস ফাংশন

    • মেমরি 2.x ব্যবহারসমূহ মধ্যে গ্রাফ সঞ্চালনের @tf.function স্পষ্ট গ্রাফ পরিবর্তে
    • মেমরি 2.x নতুন হদিশ ধাঁচের API গুলি ব্যবহার tf.summary.trace_on() এবং tf.summary.trace_export() মৃত্যুদন্ড কার্যকর ফাংশন গ্রাফ রেকর্ড করতে
  • সঙ্গে logdir প্রতি আর কোনো বৈশ্বিক লেখক ক্যাশে tf.summary.FileWriterCache

    • ব্যবহারকারীরা হয় তাদের নিজস্ব ক্যাশিং (TensorBoard সমর্থনের জন্য আধুনিক হয় বাস্তবায়ন করা উচিত / লেখক বস্তুর ভাগ, বা শুধু পৃথক লেখকদের ব্যবহার প্রগতিতে )
  • ইভেন্ট ফাইল বাইনারি উপস্থাপনা পরিবর্তিত হয়েছে

    • TensorBoard 1.x ইতিমধ্যেই নতুন বিন্যাস সমর্থন করে; এই পার্থক্যটি কেবল সেই ব্যবহারকারীদেরই প্রভাবিত করে যারা ইভেন্ট ফাইল থেকে সারসংক্ষেপ ডেটা ম্যানুয়ালি বিশ্লেষণ করছে
    • সারাংশ ডেটা এখন টেন্সর বাইট হিসাবে সংরক্ষণ করা হয়; আপনি ব্যবহার করতে পারেন tf.make_ndarray(event.summary.value[0].tensor) এটা numpy রূপান্তর