তারিখটা মনে রেখো! গুগল I / O মে 18-20 মে এখনই রেজিস্টার করুন
This page was translated by the Cloud Translation API.
Switch to English

আপনার টেনসরফ্লো 1 কোডটি টেনসরফ্লো 2 তে স্থানান্তর করুন

টেনসরফ্লো.আর.জে দেখুন গিটহাবের উত্স দেখুন নোটবুক ডাউনলোড করুন

এই গাইডটি নিম্ন-স্তরের টেনসরফ্লো এপিআই এর ব্যবহারকারীদের জন্য। আপনি যদি উচ্চ-স্তরের APIs ( tf.keras ) ব্যবহার করেন তবে আপনার কোডটি পুরোপুরি টেনসরফ্লো ২.x সামঞ্জস্য করার জন্য আপনাকে খুব কম বা কোনও পদক্ষেপ নিতে হবে:

টেনসরফ্লো ২.x এ, 1.x কোডটি অবিস্মরণিত (অবদান ব্যতীত ) চালানো এখনও সম্ভব:

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

যাইহোক, এটি আপনাকে টেনসরফ্লো ২.x-এ তৈরি অনেক উন্নতির সুবিধা নিতে দেয় না। এই গাইডটি আপনাকে আপনার কোডটি আপগ্রেড করতে সহায়তা করবে, এটিকে আরও সহজ, আরও অভিনয়যোগ্য এবং বজায় রাখা সহজ।

স্বয়ংক্রিয় রূপান্তর স্ক্রিপ্ট

এই নির্দেশিকায় বর্ণিত পরিবর্তনগুলি কার্যকর করার চেষ্টা করার আগে প্রথম পদক্ষেপটি হ'ল আপগ্রেড স্ক্রিপ্টটি চালানোর চেষ্টা করা।

এটি আপনার কোডটিকে টেনসরফ্লো ২.x এ আপগ্রেড করার সময় একটি প্রাথমিক পাস কার্যকর করবে তবে এটি আপনার কোডটিকে ভি 2-তে পরিণত করতে পারে না। আপনার কোডটি এখনও স্থানধারক, tf.compat.v1 , সংগ্রহগুলি এবং অন্যান্য tf.compat.v1 শৈলীর কার্যকারিতা অ্যাক্সেস করতে tf.compat.v1 এন্ডপয়েন্টগুলি ব্যবহার করতে পারে।

শীর্ষ স্তরের আচরণগত পরিবর্তন

যদি আপনার কোড tf.compat.v1.disable_v2_behavior ব্যবহার করে tf.compat.v1.disable_v2_behavior ২.x এ কাজ করে, তবে এখনও আপনার বৈশ্বিক আচরণগত পরিবর্তন হতে পারে যা আপনার প্রয়োজন হতে পারে। প্রধান পরিবর্তনগুলি হ'ল:

  • আগ্রহী সম্পাদন, v1.enable_eager_execution() : যে কোনও কোড যে সুস্পষ্টভাবে একটি tf.Graph ব্যবহার করে ব্যর্থ হবে। with tf.Graph().as_default() প্রসঙ্গে একটি with tf.Graph().as_default() এই কোডটি মোড়ানো নিশ্চিত হন।

  • রিসোর্স ভেরিয়েবল, v1.enable_resource_variables() : কিছু কোড v1.enable_resource_variables() রেফারেন্স ভেরিয়েবলগুলি দ্বারা সক্ষম অ- v1.enable_resource_variables() আচরণের উপর নির্ভর করে। রিসোর্স ভেরিয়েবলগুলি লিখিত থাকাকালীন লক হয়ে গেছে এবং তাই আরও স্বজ্ঞাত সামঞ্জস্যতার গ্যারান্টি সরবরাহ করে।

    • এটি প্রান্তের ক্ষেত্রে আচরণ পরিবর্তন করতে পারে।
    • এটি অতিরিক্ত কপি তৈরি করতে পারে এবং মেমরির উচ্চতর ব্যবহার করতে পারে।
    • ব্যবহারকারীর_আত্র use_resource=False tf.Variable কনস্ট্রাক্টরের কাছে use_resource=False পাস করে এটি অক্ষম করা যায়।
  • টেনসর আকার, v1.enable_v2_tensorshape() : টেনসরফ্লো 2.x টেনসর আকারের আচরণকে সহজতর করে। বদলে t.shape[0].value আপনি বলতে পারেন t.shape[0] । এই পরিবর্তনগুলি ছোট হওয়া উচিত এবং এখুনি এগুলি ঠিক করা বুদ্ধিমানের কাজ। উদাহরণস্বরূপ টেনারশ্যাপ বিভাগটি দেখুন।

  • নিয়ন্ত্রণ প্রবাহ, v1.enable_control_flow_v2() : v1.enable_control_flow_v2() 2.x নিয়ন্ত্রণ প্রবাহ বাস্তবায়ন সরল করা হয়েছে, এবং তাই বিভিন্ন গ্রাফ উপস্থাপনা উত্পাদন করে। দয়া করে কোনও সমস্যার জন্য বাগ ফাইল করুন।

টেনসরফ্লো ২.x এর জন্য কোড তৈরি করুন

এই গাইড টেনসরফ্লো 1.x কোডটিকে টেনসরফ্লো 2.x তে রূপান্তর করার বেশ কয়েকটি উদাহরণ দিয়ে যাবে এই পরিবর্তনগুলি আপনার কোডটিকে পারফরম্যান্স অপটিমাইজেশন এবং সরলিকৃত API কলগুলির সুবিধা নিতে দেবে।

প্রতিটি ক্ষেত্রে, প্যাটার্নটি হ'ল:

1. v1.Session.run কলগুলি প্রতিস্থাপন করুন

প্রতি v1.Session.run কলটি পাইথন ফাংশন দ্বারা প্রতিস্থাপন করা উচিত।

  • feed_dict এবং v1.placeholder গুলি ফাংশন আর্গুমেন্টে পরিণত হয়।
  • fetches ফাংশনের রিটার্ন মান হয়ে যায়।
  • রূপান্তরকালে আগ্রহী সম্পাদন pdb মতো স্ট্যান্ডার্ড পাইথন সরঞ্জামগুলির সাথে সহজে ডিবাগিংয়ের অনুমতি দেয়।

এর পরে, এটি গ্রাফের দক্ষতার সাথে চালানোর জন্য একটি tf.function যুক্ত করুন। এটি কীভাবে কাজ করে সে সম্পর্কে আরও তথ্যের জন্য অটোগ্রাফ গাইডটি দেখুন।

মনে রাখবেন যে:

  • v1.Session.run থেকে v1.Session.run , একটি tf.function এর একটি নির্দিষ্ট রিটার্ন স্বাক্ষর থাকে এবং সর্বদা সমস্ত আউটপুট দেয়। যদি এটি কার্য সম্পাদনের সমস্যা সৃষ্টি করে তবে দুটি পৃথক ফাংশন তৈরি করুন।

  • একটি tf.control_dependencies বা অনুরূপ ক্রিয়াকলাপের প্রয়োজন নেই: একটি tf.function আচরণ করে যেন এটি লিখিত ক্রমে চালিত হয়েছিল। tf.Variable অ্যাসাইনমেন্ট এবং tf.assert গুলি, উদাহরণস্বরূপ, স্বয়ংক্রিয়ভাবে কার্যকর করা হয়।

রূপান্তরকারী মডেল বিভাগে এই রূপান্তর প্রক্রিয়াটির একটি কার্যকারী উদাহরণ রয়েছে।

২ ভেরিয়েবল এবং ক্ষতির উপরে নজর রাখার জন্য পাইথন অবজেক্ট ব্যবহার করুন

সমস্ত নাম-ভিত্তিক ভেরিয়েবল ট্র্যাকিং টেনসরফ্লো ২.x তে দৃ strongly়ভাবে নিরুৎসাহিত করা হয়েছে। ভেরিয়েবলগুলি ট্র্যাক করতে পাইথন অবজেক্ট ব্যবহার করুন।

ব্যবহারের tf.Variable পরিবর্তে v1.get_variable

প্রতিটি v1.variable_scope একটি পাইথন অবজেক্টে রূপান্তর করা উচিত। সাধারণত এটির মধ্যে একটি হবে:

আপনার যদি ভেরিয়েবলগুলির তালিকা সংগ্রহ করতে হয় (যেমন tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ), Layer এবং Model অবজেক্টগুলির .variables এবং .trainable_variables বৈশিষ্ট্যগুলি ব্যবহার করুন।

এই Layer এবং Model ক্লাসগুলি বিশ্বব্যাপী সংগ্রহের প্রয়োজনীয়তা অপসারণ করে এমন আরও কয়েকটি বৈশিষ্ট্য প্রয়োগ করে। তাদের .losses সম্পত্তি tf.GraphKeys.LOSSES সংগ্রহ ব্যবহার করার জন্য প্রতিস্থাপন হতে পারে।

আরও বিশদের জন্য কেরাস গাইডগুলি দেখুন।

৩. আপনার প্রশিক্ষণের লুপগুলি আপগ্রেড করুন

আপনার ব্যবহারের ক্ষেত্রে কাজ করে এমন সর্বোচ্চ-স্তরের API ব্যবহার করুন। আপনার নিজস্ব প্রশিক্ষণ লুপ tf.keras.Model.fit চেয়ে tf.keras.Model.fit পছন্দ করুন।

এই উচ্চ স্তরের ফাংশনগুলি নিম্ন-স্তরের বিশদগুলি পরিচালনা করে যা আপনি নিজের প্রশিক্ষণ লুপটি লিখলে সহজেই মিস করা যায়। উদাহরণস্বরূপ, তারা স্বয়ংক্রিয়ভাবে নিয়মিত ক্ষয় সংগ্রহ করে এবং মডেলকে কল করার সময় training=True যুক্তি সেট করে।

৪. আপনার ডেটা ইনপুট পাইপলাইনগুলি আপগ্রেড করুন

ডেটা ইনপুট জন্য tf.data ডেটাসেট ব্যবহার করুন। এই বস্তুগুলি দক্ষ, ভাবপ্রবণ এবং টেনসরফ্লোতে ভাল সংহত করে।

এগুলি সরাসরি tf.keras.Model.fit পদ্ধতিতে পাস করা যেতে পারে।

model.fit(dataset, epochs=5)

এগুলি সরাসরি স্ট্যান্ডার্ড পাইথন দিয়ে পুনরাবৃত্তি করা যেতে পারে:

for example_batch, label_batch in dataset:
    break

5. compat.v1 প্রতীকগুলি সরিয়ে রাখুন

tf.compat.v1 মডিউলটিতে মূল tf.compat.v1 1.x এপিআই রয়েছে যার মূল শব্দার্থকতা রয়েছে।

টেনসরফ্লো ২.x আপগ্রেড স্ক্রিপ্টটি তাদের ভি 2 সমতুল্য রূপগুলিতে রূপান্তর করবে যদি এই ধরণের রূপান্তরটি নিরাপদ থাকে, অর্থাত্ যদি এটি নির্ধারণ করতে পারে যে v1.arg_max সংস্করণটির আচরণটি ঠিক সমান (উদাহরণস্বরূপ, এটি v1.arg_max নামকরণ করবে v1.arg_max tf.argmax , যেহেতু সেগুলি একই ফাংশন)।

আপগ্রেড স্ক্রিপ্টটি কোনও কোডের টুকরো দিয়ে সম্পন্ন করার পরে, এটি সম্ভবত compat.v1 1 এর অনেক উল্লেখ রয়েছে। কোডের মধ্য দিয়ে যাওয়া এবং এগুলি ম্যানুয়ালি ভি 2 সমতুল্যে রূপান্তর করা মূল্যবান (এটি যদি লগের মধ্যে থাকে তবে তা উল্লেখ করা উচিত)।

রূপান্তরকারী মডেল

নিম্ন-স্তরের ভেরিয়েবল এবং অপারেটর কার্যকর করা

নিম্ন-স্তরের API ব্যবহারের উদাহরণগুলির মধ্যে রয়েছে:

  • পুনরায় ব্যবহার নিয়ন্ত্রণ করতে ভেরিয়েবল স্কোপগুলি ব্যবহার করা।
  • v1.get_variable সহ ভেরিয়েবল তৈরি করা।
  • সুস্পষ্টভাবে সংগ্রহগুলি অ্যাক্সেস করা।
  • সংগ্রহগুলির মধ্যে স্পষ্টভাবে পদ্ধতির মাধ্যমে অ্যাক্সেস করা:

  • গ্রাফ ইনপুট সেট আপ করতে v1.placeholder ব্যবহার করে।

  • Session.run দিয়ে গ্রাফ কার্যকর করা Session.run

  • ম্যানুয়ালি ভেরিয়েবল শুরু করা।

রূপান্তর করার আগে

টেনসরফ্লো 1.x ব্যবহার করে কোডগুলিতে এই নিদর্শনগুলি দেখতে কেমন তা এখানে is

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

import tensorflow_datasets as tfds
g = v1.Graph()

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

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

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

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

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

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

1.0

রূপান্তর করার পরে

রূপান্তরিত কোডে:

  • ভেরিয়েবলগুলি স্থানীয় পাইথন অবজেক্ট।
  • forward ফাংশন এখনও গণনার সংজ্ঞা দেয়।
  • Session.run কলটি forward করার জন্য একটি কল দিয়ে প্রতিস্থাপন করা হবে।
  • পারফরম্যান্সের জন্য tf.function সাজসজ্জা যুক্ত করা যেতে পারে।
  • নিয়মিতকরণগুলি কোনও বিশ্বব্যাপী সংগ্রহের উল্লেখ না করে ম্যানুয়ালি গণনা করা হয়।
  • সেশনস বা স্থানধারকগুলির কোনও ব্যবহার নেই
W = tf.Variable(tf.ones(shape=(2,2)), name="W")
b = tf.Variable(tf.zeros(shape=(2)), name="b")

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

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

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

tf.layers উপর ভিত্তি করে মডেল

v1.layers মডিউলটি লেয়ার-ফাংশনগুলি ধারণ করতে ব্যবহৃত হয় যা ভেরিয়েবলগুলি সংজ্ঞায়িত করতে এবং পুনরায় ব্যবহার করতে v1.variable_scope নির্ভর করে।

রূপান্তর করার আগে

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

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

print(train_out)
print()
print(test_out)
/tmpfs/src/tf_docs_env/lib/python3.6/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.6/site-packages/tensorflow/python/keras/engine/base_layer.py:2273: 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 '
tf.Tensor([[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 10), dtype=float32)

tf.Tensor(
[[ 0.379358   -0.55901194  0.48704922  0.11619566  0.23902717  0.01691487
   0.07227738  0.14556988  0.2459927   0.2501198 ]], shape=(1, 10), dtype=float32)
/tmpfs/src/tf_docs_env/lib/python3.6/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.6/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.6/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.6/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.6/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 '

রূপান্তর করার পরে

বেশিরভাগ যুক্তি একই ছিল। তবে পার্থক্যগুলি লক্ষ্য করুন:

  • training যুক্তি মডেলটি যখন চালায় তখন প্রতিটি স্তরে যায়।
  • মূল model ফাংশনের প্রথম যুক্তি (ইনপুট x ) চলে গেছে। এর কারণ অবজেক্ট স্তরগুলি মডেলটিকে কল করতে মডেলটিকে আলাদা করে দেয়।

এটিও নোট করুন:

  • আপনি যদি tf.contrib থেকে tf.contrib বা ইনিশিয়ালাইজার ব্যবহার করছেন তবে tf.contrib অন্যের তুলনায় আরও যুক্তি পরিবর্তন হয়।
  • কোডটি আর সংগ্রহগুলিতে v1.losses.get_regularization_loss , সুতরাং v1.losses.get_regularization_loss মতো 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.2145557  -0.22979769 -0.14968733  0.01208701 -0.07569927  0.3475932
   0.10718458  0.03482988 -0.04309493 -0.10469118]], 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.08174552>]

মিশ্রিত ভেরিয়েবল এবং v1.layers

বিদ্যমান কোডটি প্রায়শই নিম্ন-স্তরের টেনসরফ্লো 1.x ভেরিয়েবল এবং উচ্চ-স্তরের v1.layers সাথে ক্রিয়াকলাপগুলি 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 ভেরিয়েবলগুলি build
  • call গণনা সম্পাদন করুন, এবং ফলাফল ফিরে।

v1.variable_scope মূলত নিজস্ব নিজস্ব একটি স্তর। সুতরাং এটি একটি tf.keras.layers.Layer হিসাবে আবার tf.keras.layers.Layer । বিশদের জন্য সাবক্লাসিং গাইডের মাধ্যমে নতুন স্তর এবং মডেল তৈরি করা দেখুন।

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

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

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

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

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

কিছু বিষয় লক্ষণীয়:

  • সাবক্ল্যাসড কেরাস মডেল এবং স্তরগুলির উভয় ভি 1 গ্রাফে (স্বয়ংক্রিয় নিয়ন্ত্রণের নির্ভরতা নেই) এবং আগ্রহী মোডে চালানো দরকার:

    • মোড়ানো call একটি tf.function অটোগ্রাফ এবং স্বয়ংক্রিয় নিয়ন্ত্রণ নির্ভরতা জন্য।
  • call করার জন্য একটি training যুক্তি গ্রহণ করতে ভুলবেন না:

    • কখনও কখনও এটি একটি tf.Tensor
    • কখনও কখনও এটি পাইথন বুলিয়ান
  • কনস্ট্রাক্টর বা মডেল Model.build মডেল ভেরিয়েবলগুলি তৈরি করুন `স্ব.এডিডি_উইট:

    • Model.build আপনার ইনপুট আকারে অ্যাক্সেস রয়েছে, সুতরাং মেলা আকারের সাথে ওজন তৈরি করতে পারেন
    • tf.keras.layers.Layer.add_weight ব্যবহার tf.keras.layers.Layer.add_weight ভেরিয়েবল এবং নিয়মিতকরণের ক্ষতির উপরে নজর tf.keras.layers.Layer.add_weight অনুমতি দেয়
  • আপনার জিনিসগুলিতে tf.Tensors না:

    • তারা একটি tf.function বা উত্সাহী প্রেক্ষাপটে তৈরি হতে পারে, এবং এই tf.function ভিন্ন আচরণ করে
    • রাষ্ট্রের জন্য tf.Variable গুলি ব্যবহার করুন, তারা উভয় প্রসঙ্গ থেকে সর্বদা ব্যবহারযোগ্য
    • tf.Tensors কেবল অন্তর্বর্তী মানগুলির জন্য

স্লিম এবং অবদানকারীদের উপর একটি নোট

প্রবীণ টেনসরফ্লো 1.x কোডের একটি বৃহত পরিমাণে স্লিম গ্রন্থাগার ব্যবহার করা হয়, যা tf.contrib.layers 1.x এর সাথে tf.contrib.layers হিসাবে প্যাকেজ করা tf.contrib.layerscontrib মডিউল হিসাবে, এটি আর tf.compat.v1 ২.x, এমনকি tf.compat.v1 তে tf.compat.v1v1.layers ২.x ব্যবহার করে কোড রূপান্তর করা v1.layers ব্যবহারকারী রিপোজিটরিগুলিতে রূপান্তর করার চেয়ে বেশি জড়িত। প্রকৃতপক্ষে, আপনার স্লিম কোডটি প্রথমে v1.layers রূপান্তর করা, তারপরে v1.layers রূপান্তর করার v1.layers বোধ করতে পারে।

  • arg_scopes সরান, সমস্ত arg_scopes সুস্পষ্ট হওয়া দরকার।
  • আপনি যদি এগুলি ব্যবহার করেন তবে normalizer_fn এবং activation_fn তাদের নিজস্ব স্তরগুলিতে ভাগ করুন।
  • পৃথকযোগ্য রূপান্তর স্তরগুলি এক বা একাধিক পৃথক কেরাস স্তরগুলিতে মানচিত্র (গভীরতার সাথে, পয়েন্টওয়াইজ এবং পৃথক পৃথক কেরাস স্তর) ম্যাপ করে।
  • স্লিম এবং v1.layers বিভিন্ন যুক্তির নাম এবং ডিফল্ট মান রয়েছে।
  • কিছু আরগের বিভিন্ন স্কেল থাকে।
  • আপনি যদি স্লিম প্রাক-প্রশিক্ষিত মডেল ব্যবহার করেন তবে কেরাসের প্রাক-লক্ষ্যযুক্ত মডেলগুলি tf.keras.applications বা টিএফ হাবের টেনসরফ্লো ২.x সেভডমোডেলগুলি আসল স্লিম কোড থেকে রফতানি করে দেখুন।

কিছু tf.contrib স্তরগুলি মূল tf.contrib স্থানান্তরিত না হতে পারে তবে পরিবর্তে tf.contrib প্যাকেজে স্থানান্তরিত হয়েছে।

প্রশিক্ষণ

tf.keras মডেলটিতে ডেটা ফিড করার বিভিন্ন উপায় রয়েছে। তারা পাইথন জেনারেটর এবং নম্পি অ্যারে ইনপুট হিসাবে গ্রহণ করবে।

কোনও মডেলটিতে ডেটা ফিড করার প্রস্তাবিত উপায় হল tf.data প্যাকেজটি ব্যবহার করা, যাতে ডেটা ম্যানিপুলেট করার জন্য উচ্চ পারফরম্যান্স ক্লাসের সংগ্রহ রয়েছে।

আপনি যদি এখনও tf.queue ব্যবহার করে tf.queue এগুলি এখন কেবল ইনপুট পাইপলাইন হিসাবে নয়, কেবল ডেটা-স্ট্রাকচার হিসাবে সমর্থিত।

টেনসরফ্লো ডেটাসেট ব্যবহার করা

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']
Downloading and preparing dataset mnist/3.0.1 (download: 11.06 MiB, generated: 21.00 MiB, total: 32.06 MiB) to /home/kbuilder/tensorflow_datasets/mnist/3.0.1...
WARNING:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead pass
`try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`.
Dataset mnist downloaded and prepared to /home/kbuilder/tensorflow_datasets/mnist/3.0.1. Subsequent calls will reuse this data.

তারপরে প্রশিক্ষণের জন্য ডেটা প্রস্তুত করুন:

  • প্রতিটি চিত্র পুনরায় স্কেল করুন।
  • উদাহরণগুলির ক্রম পরিবর্তন করুন।
  • ইমেজ এবং লেবেলের ব্যাচগুলি সংগ্রহ করুন।
BUFFER_SIZE = 10 # Use a much larger value for real code
BATCH_SIZE = 64
NUM_EPOCHS = 5


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

  return image, label

উদাহরণটি সংক্ষিপ্ত রাখতে কেবল 5 টি ব্যাচ ফেরত দেওয়ার জন্য ডেটাসেটটি ছাঁটাই:

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

STEPS_PER_EPOCH = 5

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

কেরাস প্রশিক্ষণের লুপগুলি ব্যবহার করুন

আপনার প্রশিক্ষণ প্রক্রিয়াটির যদি নিম্ন-স্তরের নিয়ন্ত্রণের প্রয়োজন না হয় তবে কেরাসের অন্তর্নির্মিত fit , evaluate এবং predict পদ্ধতি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই পদ্ধতিগুলি বাস্তবায়ন (ক্রমিক, ক্রিয়ামূলক বা উপ-শ্রেণিবদ্ধ) নির্বিশেষে মডেলটিকে প্রশিক্ষণের জন্য অভিন্ন ইন্টারফেস সরবরাহ করে।

এই পদ্ধতির সুবিধার মধ্যে রয়েছে:

  • তারা নম্পি অ্যারে, পাইথন জেনারেটর এবং, tf.data.Datasets
  • এগুলি নিয়মিতকরণ এবং অ্যাক্টিভেশন হ্রাস স্বয়ংক্রিয়ভাবে প্রয়োগ করে।
  • তারা মাল্টি-ডিভাইস প্রশিক্ষণের জন্য tf.distribute সমর্থন করে।
  • তারা ক্ষয়ক্ষতি এবং মেট্রিক হিসাবে নির্বিচারে কলযোগ্যদের সমর্থন করে।
  • তারা tf.keras.callbacks.TensorBoard এবং কাস্টম কলব্যাকের মতো কলব্যাক সমর্থন করে।
  • তারা পারফর্ম্যান্ট, স্বয়ংক্রিয়ভাবে টেনসরফ্লো গ্রাফগুলি ব্যবহার করে।

এখানে 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 [==============================] - 1s 9ms/step - loss: 2.0191 - accuracy: 0.3608
Epoch 2/5
5/5 [==============================] - 0s 9ms/step - loss: 0.4736 - accuracy: 0.9059
Epoch 3/5
5/5 [==============================] - 0s 8ms/step - loss: 0.2973 - accuracy: 0.9626
Epoch 4/5
5/5 [==============================] - 0s 9ms/step - loss: 0.2108 - accuracy: 0.9911
Epoch 5/5
5/5 [==============================] - 0s 8ms/step - loss: 0.1791 - accuracy: 0.9874
5/5 [==============================] - 0s 6ms/step - loss: 1.5504 - accuracy: 0.7500
Loss 1.5504140853881836, Accuracy 0.75

আপনার নিজের লুপ লিখুন

কেরাস মডেলের প্রশিক্ষণ পদক্ষেপটি যদি আপনার পক্ষে কাজ করে তবে আপনার এই ধাপের বাইরে আরও নিয়ন্ত্রণের প্রয়োজন হয়, আপনার নিজের ডেটা- 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.138 accuracy: 1.000
train:  loss: 0.161 accuracy: 1.000
train:  loss: 0.159 accuracy: 0.969
train:  loss: 0.241 accuracy: 0.953
train:  loss: 0.172 accuracy: 0.969

eval:  loss: 1.550 accuracy: 0.800
train:  loss: 0.086 accuracy: 1.000
train:  loss: 0.094 accuracy: 1.000
train:  loss: 0.090 accuracy: 1.000
train:  loss: 0.119 accuracy: 0.984
train:  loss: 0.099 accuracy: 1.000

eval:  loss: 1.558 accuracy: 0.841
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.068 accuracy: 1.000
train:  loss: 0.061 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000
train:  loss: 0.076 accuracy: 1.000

eval:  loss: 1.536 accuracy: 0.841
train:  loss: 0.059 accuracy: 1.000
train:  loss: 0.056 accuracy: 1.000
train:  loss: 0.058 accuracy: 1.000
train:  loss: 0.054 accuracy: 1.000
train:  loss: 0.055 accuracy: 1.000

eval:  loss: 1.497 accuracy: 0.863
train:  loss: 0.053 accuracy: 1.000
train:  loss: 0.049 accuracy: 1.000
train:  loss: 0.044 accuracy: 1.000
train:  loss: 0.049 accuracy: 1.000
train:  loss: 0.045 accuracy: 1.000

eval:  loss: 1.463 accuracy: 0.878

প্রশিক্ষণের পদক্ষেপটি কাস্টমাইজ করুন

আপনার যদি আরও নমনীয়তা এবং নিয়ন্ত্রণের প্রয়োজন হয় তবে আপনি নিজের প্রশিক্ষণ লুপ প্রয়োগ করে এটি পেতে পারেন। তিনটি পদক্ষেপ রয়েছে:

  1. উদাহরণগুলির ব্যাচগুলি পেতে পাইথন জেনারেটর বাtf.data.Dataset ব্যবহার করুন।
  2. গ্রেডিয়েন্ট সংগ্রহ করতেtf.GradientTape . গ্রেডিয়েন্টtf.GradientTape ব্যবহার করুন।
  3. মডেলের ভেরিয়েবলগুলিতে ওজন আপডেট প্রয়োগ করতে tf.keras.optimizers ব্যবহার করুন।

মনে রাখবেন:

  • সাবক্ল্যাসড স্তর এবং মডেলগুলির call পদ্ধতিতে সর্বদা একটি training যুক্তি অন্তর্ভুক্ত করুন।
  • training যুক্তিটি সঠিকভাবে সেট করে মডেলকে কল করতে ভুলবেন না।
  • ব্যবহারের উপর নির্ভর করে, মডেল ভেরিয়েবলগুলি অস্তিত্বের অস্তিত্ব থাকতে পারে যতক্ষণ না মডেলটি ডেটা ব্যাচে চালিত হয়।
  • মডেলটির জন্য নিয়মিতকরণ ক্ষতির মতো জিনিসগুলি আপনাকে ম্যানুয়ালি হ্যান্ডেল করতে হবে।

ভি 1 এর তুলনায় সরলকরণগুলি নোট করুন:

  • ভেরিয়েবল ইনিশিয়েলাইজার চালানোর দরকার নেই। চলকগুলি তৈরির সূচনা হয়।
  • ম্যানুয়াল নিয়ন্ত্রণ নির্ভরতা যুক্ত করার প্রয়োজন নেই। এমনকি tf.function অপারেশনগুলিতে আগ্রহী মোড হিসাবে কাজ করে।
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, 3, activation='relu',
                           kernel_regularizer=tf.keras.regularizers.l2(0.02),
                           input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.1),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Dense(10)
])

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

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

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

for epoch in range(NUM_EPOCHS):
  for inputs, labels in train_data:
    train_step(inputs, labels)
  print("Finished epoch", epoch)
Finished epoch 0
Finished epoch 1
Finished epoch 2
Finished epoch 3
Finished epoch 4

নতুন স্টাইলের মেট্রিক্স এবং লোকসান

টেনসরফ্লো ২.x এ, মেট্রিক্স এবং ক্ষয়গুলি হ'ল বস্তু। এই উভয় আগ্রহ এবং tf.function গুলি কাজ।

একটি ক্ষতির বস্তু কলযোগ্য, এবং (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 এবং মেট্রিক নতুন ফলাফল দেখায়।

আপনাকে মেট্রিকের ম্যানুয়ালি ভেরিয়েবলগুলি ম্যানুয়ালি আরম্ভ করতে হবে না, এবং যেহেতু টেনসরফ্লো ২.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))
Epoch:  0
  loss:     0.139
  accuracy: 0.997
Epoch:  1
  loss:     0.116
  accuracy: 1.000
Epoch:  2
  loss:     0.105
  accuracy: 0.997
Epoch:  3
  loss:     0.089
  accuracy: 1.000
Epoch:  4
  loss:     0.078
  accuracy: 1.000

কেরাস মেট্রিক নাম

টেনসরফ্লো ২.x এ, কেরাস মডেলগুলি মেট্রিকের নামগুলি পরিচালনা করার ক্ষেত্রে আরও সামঞ্জস্যপূর্ণ।

এখন যখন আপনি মেট্রিকের তালিকায় একটি স্ট্রিং পাস করেন, সেই সঠিক স্ট্রিংটি মেট্রিকের 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 8ms/step - loss: 0.0901 - acc: 0.9923 - accuracy: 0.9923 - my_accuracy: 0.9923
history.history.keys()
dict_keys(['loss', 'acc', 'accuracy', 'my_accuracy'])

এটি পূর্ববর্তী সংস্করণগুলির থেকে পৃথক যেখানে metrics=["accuracy"] পাস করার সাথে metrics=["accuracy"] dict_keys(['loss', 'acc'])

কেরাস অপ্টিমাইজার

মধ্যে optimizers v1.train যেমন v1.train.AdamOptimizer এবং v1.train.GradientDescentOptimizer মধ্যে সমতুল আছে tf.keras.optimizers

v1.train কে keras.optimizers রূপান্তর করুন

আপনার অপ্টিমাইজারকে রূপান্তর করার সময় এখানে জিনিসগুলি মনে রাখা উচিত:

কিছু tf.keras.optimizers জন্য নতুন ডিফল্ট

optimizers.SGD জন্য কোনও পরিবর্তন নেই S optimizers.SGD , optimizers.Adam optimizers.SGD optimizers.Adam , বা optimizers.RMSprop

নিম্নলিখিত ডিফল্ট শেখার হারগুলি পরিবর্তিত হয়েছে:

টেনসরবোর্ড

টেনসরফ্লো ২.০ এর মধ্যে টেনসরবোর্ডে ভিজ্যুয়ালাইজেশনের জন্য সংক্ষিপ্ত তথ্য লেখার জন্য ব্যবহৃত tf.summary API এ উল্লেখযোগ্য পরিবর্তন রয়েছে। নতুন tf.summary একটি সাধারণ tf.summary , বেশ কয়েকটি টিউটোরিয়াল উপলব্ধ রয়েছে যা টেনসরফ্লো 2.x এপিআই ব্যবহার করে। এর মধ্যে একটি টেনসরবোর্ড টেনসরফ্লো ২.x স্থানান্তর গাইড অন্তর্ভুক্ত রয়েছে।

সংরক্ষণ এবং লোড হচ্ছে

চেকপয়েন্ট সামঞ্জস্য

টেনসরফ্লো ২.x অবজেক্ট-ভিত্তিক চেকপয়েন্টগুলি ব্যবহার করে।

আপনি যদি সাবধান হন তবে পুরানো স্টাইলের নাম ভিত্তিক চেকপয়েন্টগুলি এখনও লোড করা যায়। কোড রূপান্তর প্রক্রিয়াটির ফলে পরিবর্তনশীল নাম পরিবর্তন হতে পারে তবে কার্যকারণ রয়েছে।

চেকপয়েন্টে থাকা নামগুলির সাথে নতুন মডেলের নামগুলি সীমাবদ্ধ করার জন্য এটি সহজতম পদ্ধতির:

  • চলকগুলি এখনও সকলের একটি name যুক্তি রয়েছে যা আপনি সেট করতে পারেন।
  • কেরাস মডেলরা একটি name যুক্তিও নিয়ে থাকে যা তারা তাদের ভেরিয়েবলগুলির উপসর্গ হিসাবে সেট করেছিল।
  • v1.name_scope ফাংশনটি ভেরিয়েবল নামের উপসর্গ সেট করতে ব্যবহার করা যেতে পারে। এটি tf.variable_scope থেকে খুব আলাদা। এটি কেবল নামগুলিকে প্রভাবিত করে এবং ভেরিয়েবলগুলি ট্র্যাক করে এবং পুনরায় ব্যবহার করে না।

যদি এটি আপনার ব্যবহারের ক্ষেত্রে কাজ করে না, তবে v1.train.init_from_checkpoint ফাংশনটি ব্যবহার করে দেখুন। এটি একটি assignment_map যুক্তি নেয়, যা পুরানো নাম থেকে নতুন নামগুলিতে ম্যাপিং নির্দিষ্ট করে।

টেনসরফ্লো এস্টিমেটার রিপোজিটরিতে টেনসরফ্লো 1.x থেকে 2.0 এ প্রিমমেড অনুমানের জন্য চেকপয়েন্টগুলি আপগ্রেড করার জন্য একটি রূপান্তর সরঞ্জাম অন্তর্ভুক্ত করা হয়েছে। এটি অনুরূপ ব্যবহারের ক্ষেত্রে কীভাবে একটি সরঞ্জাম তৈরি করবেন তার উদাহরণ হিসাবে কাজ করতে পারে।

সংরক্ষিত মডেলগুলির সামঞ্জস্য

সংরক্ষিত মডেলগুলির জন্য কোনও উল্লেখযোগ্য সামঞ্জস্যতা উদ্বেগ নেই।

  • টেনসরফ্লো 1.x সেভড_ মডেলগুলি টেনসরফ্লো 2.x এ কাজ করে
  • সমস্ত অপস সমর্থিত হলে টেনসরফ্লো ২.x সেভড_মোডেলগুলি টেনসরফ্লো ১.x এ কাজ করে।

একটি গ্রাফ.পিবি বা গ্রাফ.পিবিটিেক্সট

কোনও কাঁচা Graph.pb ফাইল Graph.pb আপগ্রেড করার সহজ সরল কোনও উপায় নেই। আপনার সেরা বেটটি কোডটি আপগ্রেড করা যা ফাইলটি উত্পন্ন করে।

কিন্তু, যদি আপনি একটি "হিমায়িত গ্রাফ" (একটি আছে 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))

উদাহরণস্বরূপ, ২০১ from সাল থেকে ইনসেপশন ভি 1 এর হিমায়িত গ্রাফ এখানে রয়েছে:

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 লোড করুন:

0 বি3 বি 4374d0

এটিকে একটি 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])

অনুমানকারী

অনুমানকারীদের সাথে প্রশিক্ষণ

টেনসরফ্লো ২.x এ অনুমানকারীগুলি সমর্থিত।

আপনি যখন অনুমানকারী ব্যবহার করেন, আপনি tf.estimator.TrainSpec tf.estimator.EvalSpec থেকে input_fn , tf.estimator.TrainSpec এবং tf.estimator.EvalSpec ব্যবহার করতে পারেন।

ট্রেনের সাথে 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)

একটি কেরাস মডেল সংজ্ঞা ব্যবহার করে

টেনসরফ্লো ২.x এ আপনার অনুমানকারী কীভাবে তৈরি করবেন সে সম্পর্কে কিছু পার্থক্য রয়েছে

এটি সুপারিশ করা হয় আপনি কেরাস ব্যবহার করে আপনার মডেলটি সংজ্ঞায়িত করুন, তারপরে 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/tmp0erq3im2
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmp0erq3im2
INFO:tensorflow:Using the Keras model provided.
INFO:tensorflow:Using the Keras model provided.
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/backend.py:434: 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 '
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmp0erq3im2', '_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/tmp0erq3im2', '_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.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/training_util.py:236: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Warm-starting with WarmStartSettings: WarmStartSettings(ckpt_to_initialize_from='/tmp/tmp0erq3im2/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/tmp0erq3im2/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/tmp0erq3im2/keras/keras_model.ckpt
INFO:tensorflow:Warm-starting from: /tmp/tmp0erq3im2/keras/keras_model.ckpt
INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.
INFO:tensorflow:Warm-starting variables only in TRAINABLE_VARIABLES.
INFO:tensorflow:Warm-started 8 variables.
INFO:tensorflow:Warm-started 8 variables.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp0erq3im2/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmp0erq3im2/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 2.4717796, step = 0
INFO:tensorflow:loss = 2.4717796, 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/tmp0erq3im2/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmp0erq3im2/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.6/site-packages/tensorflow/python/keras/engine/training.py:2325: 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-01-06T02:31:17Z
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:17Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmp0erq3im2/model.ckpt-25
INFO:tensorflow:Restoring parameters from /tmp/tmp0erq3im2/model.ckpt-25
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Inference Time : 0.86556s
INFO:tensorflow:Inference Time : 0.86556s
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:18
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:18
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.6160676
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.6, global_step = 25, loss = 1.6160676
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp0erq3im2/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmp0erq3im2/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.37597787.
INFO:tensorflow:Loss for final step: 0.37597787.
({'accuracy': 0.6, 'loss': 1.6160676, 'global_step': 25}, [])

একটি কাস্টম model_fn ব্যবহার করে

আপনার যদি বিদ্যমান কাস্টম অনুমানকারী model_fn যা আপনার বজায় রাখা দরকার, আপনি কেরাস মডেলটি ব্যবহার করতে আপনার model_fn রূপান্তর করতে পারেন।

যাইহোক, সামঞ্জস্যতার কারণে, একটি কাস্টম model_fn এখনও model_fn শৈলীর গ্রাফ মোডে চলবে। এর অর্থ এখানে কোনও উত্সাহী কার্যকর করা এবং কোনও স্বয়ংক্রিয় নিয়ন্ত্রণ নির্ভরতা নেই।

নূন্যতম পরিবর্তন সহ কাস্টম মডেল_ফএন

model_fn ২.x এ আপনার কাস্টম model_fn কাজ করতে, আপনি যদি বিদ্যমান tf.compat.v1 নূন্যতম পরিবর্তন পছন্দ করেন তবে tf.compat.v1 প্রতীক যেমন optimizers এবং metrics ব্যবহার করা যেতে পারে।

কাস্টম model_fn কেরাস মডেল ব্যবহার করা এটি কাস্টম প্রশিক্ষণ লুপে ব্যবহার করার অনুরূপ:

  • mode আর্গুমেন্টের উপর ভিত্তি করে training পর্বটি যথাযথভাবে সেট করুন।
  • স্পষ্টভাবে মডেলটির trainable_variables অপ্টিমাইজারের কাছে প্রেরণ করুন।

তবে কাস্টম লুপের সাথে সম্পর্কিত গুরুত্বপূর্ণ পার্থক্য রয়েছে:

  • ব্যবহার করার পরিবর্তে Model.losses ব্যবহার লোকসান নিষ্কর্ষ Model.get_losses_for
  • Model.get_updates_for ব্যবহার করে মডেলের আপডেটগুলি বের করুন।

নিম্নলিখিত model_fn এই সমস্ত উদ্বেগের চিত্র তুলে ধরে একটি কাস্টম 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/tmpifj8mysl
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpifj8mysl
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpifj8mysl', '_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/tmpifj8mysl', '_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.
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/tmpifj8mysl/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpifj8mysl/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 3.0136237, step = 0
INFO:tensorflow:loss = 3.0136237, 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/tmpifj8mysl/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpifj8mysl/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-01-06T02:31:20Z
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:20Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpifj8mysl/model.ckpt-25
INFO:tensorflow:Restoring parameters from /tmp/tmpifj8mysl/model.ckpt-25
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Inference Time : 0.97406s
INFO:tensorflow:Inference Time : 0.97406s
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:21
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:21
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.59375, global_step = 25, loss = 1.6248872
INFO:tensorflow:Saving dict for global step 25: accuracy = 0.59375, global_step = 25, loss = 1.6248872
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpifj8mysl/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpifj8mysl/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.35726172.
INFO:tensorflow:Loss for final step: 0.35726172.
({'accuracy': 0.59375, 'loss': 1.6248872, 'global_step': 25}, [])

model_fn 2.x প্রতীক সহ কাস্টম model_fn

আপনি যদি সমস্ত টেনসরফ্লো 1.x চিহ্নগুলি থেকে মুক্তি পেতে চান এবং আপনার কাস্টম model_fn ২.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 স্কেলার ক্ষতি হয় তবে Tensor (কলযোগ্য নয়)। প্রত্যাশিত তালিকার প্রথম উপাদানটি হ'ল কাঙ্ক্ষিত train_op/minimize_op
    • ক্ষতি যদি কলযোগ্য (যেমন কোনও ফাংশন) হয় তবে train_op/minimize_op পেতে Optimizer.minimize ব্যবহার করুন।
  • মূল্যায়নের জন্য tf.keras.metrics পরিবর্তে tf.compat.v1.metrics ব্যবহার করুন।

my_model_fn এর উপরের উদাহরণের জন্য, my_model_fn ২.x প্রতীক সহ স্থানান্তরিত কোডটি my_model_fn দেখানো হয়েছে:

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/tmpc93qfnv6
WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpc93qfnv6
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpc93qfnv6', '_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/tmpc93qfnv6', '_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.
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/tmpc93qfnv6/model.ckpt.
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpc93qfnv6/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 2.5293791, step = 0
INFO:tensorflow:loss = 2.5293791, 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/tmpc93qfnv6/model.ckpt.
INFO:tensorflow:Saving checkpoints for 25 into /tmp/tmpc93qfnv6/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-01-06T02:31:24Z
INFO:tensorflow:Starting evaluation at 2021-01-06T02:31:24Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25
INFO:tensorflow:Restoring parameters from /tmp/tmpc93qfnv6/model.ckpt-25
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [1/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [2/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [3/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [4/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Evaluation [5/5]
INFO:tensorflow:Inference Time : 0.86534s
INFO:tensorflow:Inference Time : 0.86534s
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25
INFO:tensorflow:Finished evaluation at 2021-01-06-02:31:25
INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661
INFO:tensorflow:Saving dict for global step 25: Accuracy = 0.59375, global_step = 25, loss = 1.7570661
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 25: /tmp/tmpc93qfnv6/model.ckpt-25
INFO:tensorflow:Loss for final step: 0.47094986.
INFO:tensorflow:Loss for final step: 0.47094986.
({'Accuracy': 0.59375, 'loss': 1.7570661, 'global_step': 25}, [])

প্রিমেড অনুমানকারী

Tf.estimator.DNN tf.estimator.DNN* , tf.estimator.Linear* এবং tf.estimator.DNNLinearCombined* এর পরিবারে tf.estimator.DNN* tf.estimator.DNNLinearCombined* এখনও tf.estimator.DNNLinearCombined* এপিআই-এ সমর্থিত। তবে কিছু যুক্তি পরিবর্তিত হয়েছে:

  1. input_layer_partitioner : ভি 2-তে সরানো হয়েছে।
  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 এটি input_layer_partitioner স্বয়ংক্রিয়ভাবে পরিচালনা করবে।
  2. tf.keras.losses.Reduction জন্য, loss_reduction পরীক্ষা করুন tf.keras.losses.Reduction সমর্থিত বিকল্পগুলির জন্য tf.keras.losses.Reduction
  3. optimizer যুক্তিগুলির জন্য:
    • আপনি যদি না করেন: 1) optimizer পাস করেন, dnn_optimizer বা linear_optimizer আর্গুমেন্ট, বা 2) আপনার কোডের একটি string হিসাবে optimizer যুক্তি নির্দিষ্ট করে, তবে আপনাকে কোনও পরিবর্তন করার দরকার নেই কারণ tf.keras.optimizers ডিফল্টরূপে ব্যবহৃত হয় ।
    • অন্যথায়, আপনাকে এটিকে tf.compat.v1.train.Optimizer এর সাথে সম্পর্কিত tf.keras.optimizers আপডেট করতে হবে।

চেকপয়েন্ট রূপান্তরকারী

keras.optimizers স্থানান্তর keras.optimizers 1.x ব্যবহার করে সংরক্ষিত চেকপয়েন্টগুলি ভেঙে ফেলবে, যেহেতু tf.keras.optimizers চেকপয়েন্টগুলিতে সংরক্ষণ করার জন্য বিভিন্ন ধরণের ভেরিয়েবল তৈরি করে। টেনসরফ্লো ২.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 15165  100 15165    0     0  40656      0 --:--:-- --:--:-- --:--:-- 40656

সরঞ্জামটিতে অন্তর্নির্মিত সহায়তা রয়েছে:

 python checkpoint_converter.py -h
2021-01-06 02:31:26.297951: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] 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 এস, পরিবর্তে tf.compat.v1.Dimension অবজেক্ট। তাই ফোন করতে কোন প্রয়োজন নেই .value একটি পেতে int

স্বতন্ত্র tf.compat.v1.Dimension অবজেক্টস এখনও tf.TensorShape.dims থেকে অ্যাক্সেসযোগ্য।

নিম্নলিখিতটি টেনসরফ্লো 1.x এবং টেনসরফ্লো 2.x এর মধ্যে পার্থক্যগুলি দেখায় The

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

আপনার যদি টেনসরফ্লো 1.x এ থাকে:

value = shape[i].value

তারপরে টেনসরফ্লো ২.x এ এটি করুন:

value = shape[i]
value
16

আপনার যদি টেনসরফ্লো 1.x এ থাকে:

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

তারপরে টেনসরফ্লো ২.x এ এটি করুন:

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

আপনার যদি টেনসরফ্লো 1.x এ থাকে (বা অন্য কোনও মাত্রা পদ্ধতি ব্যবহার করা হয়েছে):

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

তারপরে টেনসরফ্লো ২.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 সরান: tf.colocate_with এর ডিভাইস প্লেসমেন্ট অ্যালগরিদমগুলি উল্লেখযোগ্যভাবে উন্নত হয়েছে। এটি আর প্রয়োজন হবে না। যদি এটি অপসারণের ফলে কর্মক্ষমতা হ্রাস ঘটে তবে দয়া করে একটি বাগ ফাইল করুন

  • প্রতিস্থাপন v1.ConfigProto থেকে সমতুল্য ফাংশন সঙ্গে ব্যবহার tf.config

সিদ্ধান্তে

সামগ্রিক প্রক্রিয়াটি হ'ল:

  1. আপগ্রেড স্ক্রিপ্টটি চালান।
  2. অবদানের প্রতীকগুলি সরান।
  3. আপনার মডেলগুলিকে কোনও অবজেক্ট ওরিয়েন্টেড স্টাইলে (কেরাস) স্যুইচ করুন।
  4. আপনি যেখানে পারেন tf.keras বা tf.estimator প্রশিক্ষণ এবং মূল্যায়ন লুপ ব্যবহার করুন।
  5. অন্যথায়, কাস্টম লুপগুলি ব্যবহার করুন, তবে সেশন এবং সংগ্রহগুলি এড়াতে ভুলবেন না।

কোডটিকে আইডিয়োমেটিক টেনসরফ্লো ২.x এ রূপান্তর করতে একটু কাজ লাগে তবে প্রতিটি পরিবর্তনের ফলাফল:

  • কোডের কম লাইন।
  • স্পষ্টতা এবং সরলতা বর্ধিত।
  • সহজ ডিবাগিং।