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

TensorFlow.org এ দেখুন Google Colab-এ চালান 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.1633086727.kokoro-gcp-ubuntu-prod-1386032077.31590.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.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.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.1633086728.kokoro-gcp-ubuntu-prod-1386032077.31590.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 যুক্তি

    • টাইম সিরিজ হিসাবে ডেটা রেন্ডার করার জন্য টেনসরবোর্ডের একটি ধাপ মান প্রয়োজন
    • স্পষ্ট পাস করা আবশ্যক কারণ 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

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

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

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

    • নিয়ন্ত্রণ অপস এবং সংশ্লিষ্ট কোড, তাদের একটি নিয়মিত যদি বিবৃতি (যা উৎসুক মোডে এবং কাজ মধ্যে মোড়ানো @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 রূপান্তর