This page was translated by the Cloud Translation API.
Switch to English

ডেটা বৃদ্ধি

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

ওভারভিউ

এই টিউটোরিয়ালটি ডেটা বর্ধন প্রদর্শন করে: চিত্রের আবর্তনের মতো এলোমেলো (তবে বাস্তববাদী) রূপান্তর প্রয়োগ করে আপনার প্রশিক্ষণের বিভিন্নতা বাড়ানোর একটি কৌশল। আপনি কীভাবে দুটি উপায়ে ডেটা বৃদ্ধির প্রয়োগ করবেন তা শিখবেন। প্রথমে আপনি কেরাস প্রিপ্রোসেসিং লেয়ারগুলি ব্যবহার করবেন। এরপরে, আপনি tf.image ব্যবহার tf.image

সেটআপ

pip install -q tf-nightly
WARNING: You are using pip version 20.2.2; however, version 20.2.3 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.

64a2fi93f

একটি ডেটাসেট ডাউনলোড করুন

এই টিউটোরিয়াল টিফ_ফ্লাওয়ার ডেটাসেট ব্যবহার করে। সুবিধার জন্য, টেনসরফ্লো ডেটাসেট ব্যবহার করে ডেটাसेट ডাউনলোড করুন। যদি আপনি অন্যদের ডেটা আমদানির উপায়গুলি সম্পর্কে জানতে চান, লোড চিত্রগুলির টিউটোরিয়ালটি দেখুন।

(train_ds, val_ds, test_ds), metadata = tfds.load(
    'tf_flowers',
    split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
    with_info=True,
    as_supervised=True,
)
Downloading and preparing dataset tf_flowers/3.0.1 (download: 218.21 MiB, generated: 221.83 MiB, total: 440.05 MiB) to /home/kbuilder/tensorflow_datasets/tf_flowers/3.0.1...

Warning:absl:Dataset tf_flowers 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 tf_flowers downloaded and prepared to /home/kbuilder/tensorflow_datasets/tf_flowers/3.0.1. Subsequent calls will reuse this data.

ফুলের ডেটাসেটের পাঁচটি ক্লাস রয়েছে।

num_classes = metadata.features['label'].num_classes
print(num_classes)
5

ডেটাসেট থেকে একটি চিত্র পুনরুদ্ধার করা যাক এবং ডেটা বর্ধন প্রদর্শনের জন্য এটি ব্যবহার করুন।

get_label_name = metadata.features['label'].int2str

image, label = next(iter(train_ds))
_ = plt.imshow(image)
_ = plt.title(get_label_name(label))

পিএনজি

কেরাস প্রিপ্রোসেসিং স্তরগুলি ব্যবহার করুন

পুনরায় আকার এবং পুনরুদ্ধার

আপনি আপনার ইমেজগুলিকে একটি সামঞ্জস্য আকারে পুনরায় আকার দিতে এবং পিক্সেল মানগুলি পুনরুদ্ধার করতে প্রাক প্রসেসিং স্তরগুলি ব্যবহার করতে পারেন।

IMG_SIZE = 180

resize_and_rescale = tf.keras.Sequential([
  layers.experimental.preprocessing.Resizing(IMG_SIZE, IMG_SIZE),
  layers.experimental.preprocessing.Rescaling(1./255)
])

আপনি এই ইমেজটিতে এই স্তরগুলি প্রয়োগ করার ফলাফল দেখতে পারেন।

result = resize_and_rescale(image)
_ = plt.imshow(result)

পিএনজি

আপনি পিক্সেল যাচাই করতে পারেন [0-1]

print("Min and max pixel values:", result.numpy().min(), result.numpy().max())
Min and max pixel values: 0.0 1.0

ডেটা বৃদ্ধি

আপনি ডেটা বৃদ্ধির জন্য প্রিপ্রসেসিং স্তরগুলিও ব্যবহার করতে পারেন।

আসুন কয়েকটি প্রিপ্রোসেসিং স্তর তৈরি করি এবং সেগুলি একই চিত্রটিতে বারবার প্রয়োগ করি।

data_augmentation = tf.keras.Sequential([
  layers.experimental.preprocessing.RandomFlip("horizontal_and_vertical"),
  layers.experimental.preprocessing.RandomRotation(0.2),
])
# Add the image to a batch
image = tf.expand_dims(image, 0)
plt.figure(figsize=(10, 10))
for i in range(9):
  augmented_image = data_augmentation(image)
  ax = plt.subplot(3, 3, i + 1)
  plt.imshow(augmented_image[0])
  plt.axis("off")

পিএনজি

ডেটা বর্ধনের জন্য আপনি স্তরগুলি ব্যবহার করতে পারেন এমন বিভিন্ন ধরণের প্রাক-প্রসেসিং স্তর রয়েছে layers.RandomContrast layers.RandomCrop , layers.RandomZoom layers.RandomCrop , layers.RandomZoom layers.RandomCrop layers.RandomZoom এবং অন্যান্য।

প্রিপ্রোসেসিং স্তরগুলি ব্যবহার করার জন্য দুটি বিকল্প

দুটি গুরুত্বপূর্ণ উপায় রয়েছে যাতে আপনি গুরুত্বপূর্ণ ট্রেডঅফগুলি সহ এই প্রিপ্রোসেসিং স্তরগুলি ব্যবহার করতে পারেন।

বিকল্প 1: প্রিপ্রসেসিং স্তরগুলিকে আপনার মডেলের অংশ করুন Make

model = tf.keras.Sequential([
  resize_and_rescale,
  data_augmentation,
  layers.Conv2D(16, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  # Rest of your model
])

এক্ষেত্রে সচেতন হওয়ার জন্য দুটি গুরুত্বপূর্ণ বিষয় রয়েছে:

  • ডেটা বর্ধন ডিভাইসটি চলবে, আপনার বাকি স্তরগুলির সাথে সিঙ্ক্রোনালিভাবে এবং জিপিইউ ত্বরণ থেকে উপকৃত হবে।

  • আপনি যখন model.save ব্যবহার করে আপনার মডেলটি রফতানি করবেন, তখন আপনার মডেলের model.save সাথে প্রিপ্রসেসিংয়ের স্তরগুলি সংরক্ষণ করা হবে। আপনি যদি পরে এই মডেলটি স্থাপন করেন তবে এটি স্বয়ংক্রিয়ভাবে চিত্রগুলিকে মানীকৃত করবে (আপনার স্তরগুলির কনফিগারেশন অনুযায়ী)। এটি আপনাকে সেই লজিক সার্ভার-সাইডটি পুনরায় সংশোধন করার প্রচেষ্টা থেকে বাঁচাতে পারে।

বিকল্প 2: আপনার ডেটাসেটে প্রাকপ্রসেসিং স্তরগুলি প্রয়োগ করুন

aug_ds = train_ds.map(
  lambda x, y: (resize_and_rescale(x, training=True), y))

এই পদ্ধতির Dataset.map আপনি ডেটাসেট তৈরি করতে Dataset.map ব্যবহার করেন যা বর্ধিত চিত্রগুলির ব্যাচগুলি দেয়। এক্ষেত্রে:

  • ডেটা বর্ধন সিপিইউতে অবিচ্ছিন্নভাবে ঘটবে এবং এটি অবরুদ্ধ নয়। আপনি নীচে দেখানো Dataset.prefetch ব্যবহার করে Dataset.prefetch আপনার মডেলটির প্রশিক্ষণটি ওভারল্যাপ করতে পারেন।
  • এই ক্ষেত্রে প্রিপ্রসেসিং লেয়ারগুলি মডেলটির সাথে রফতানি করা হবে না যখন আপনি model.save কল model.save । এটি সংরক্ষণের আগে আপনার সেগুলি আপনার মডেলের সাথে সংযুক্ত করতে হবে বা তাদের সার্ভার-সাইডটি পুনরায় প্রতিস্থাপন করতে হবে। প্রশিক্ষণের পরে, আপনি রফতানির আগে প্রাক স্তরগুলি সংযুক্ত করতে পারেন।

আপনি চিত্রের শ্রেণিবদ্ধকরণ টিউটোরিয়ালে প্রথম বিকল্পের উদাহরণ খুঁজে পেতে পারেন। আসুন দ্বিতীয় বিকল্পটি এখানে প্রদর্শন করুন।

ডেটাসেটগুলিতে প্রিপ্রোসেসিং স্তরগুলি প্রয়োগ করুন

উপরে তৈরি প্রিপ্রসেসিং স্তরগুলির সাহায্যে ট্রেন, বৈধকরণ এবং পরীক্ষা ডেটাসেটগুলি কনফিগার করুন। আপনি পারফরম্যান্সের জন্য ডেটাসেটগুলিও কনফিগার করতে পারেন, সমান্তরাল পাঠ এবং বাফার প্রিফেচিং ব্যবহার করে আই / ওকে অবরুদ্ধ না করে ডিস্ক থেকে ব্যাচ সরবরাহ করতে পারেন। আপনি tf.data API গাইডের সাথে আরও ভাল পারফরম্যান্সে আরও ডেটাসেট পারফরম্যান্স শিখতে পারেন।

batch_size = 32
AUTOTUNE = tf.data.experimental.AUTOTUNE

def prepare(ds, shuffle=False, augment=False):
  # Resize and rescale all datasets
  ds = ds.map(lambda x, y: (resize_and_rescale(x), y), 
              num_parallel_calls=AUTOTUNE)

  if shuffle:
    ds = ds.shuffle(1000)

  # Batch all datasets
  ds = ds.batch(batch_size)

  # Use data augmentation only on the training set
  if augment:
    ds = ds.map(lambda x, y: (data_augmentation(x, training=True), y), 
                num_parallel_calls=AUTOTUNE)

  # Use buffered prefecting on all datasets
  return ds.prefetch(buffer_size=AUTOTUNE)
train_ds = prepare(train_ds, shuffle=True, augment=True)
val_ds = prepare(val_ds)
test_ds = prepare(test_ds)

একটি মডেল প্রশিক্ষণ

সম্পূর্ণতার জন্য, আপনি এখন এই ডেটাসেটগুলি ব্যবহার করে একটি মডেলকে প্রশিক্ষণ দেবেন। নির্ভুলতার জন্য এই মডেলটি টিউন করা হয়নি (লক্ষ্যটি আপনাকে যান্ত্রিকগুলি দেখানো)।

model = tf.keras.Sequential([
  layers.Conv2D(16, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(64, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
epochs=5
history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)
Epoch 1/5
92/92 [==============================] - 30s 315ms/step - loss: 1.5078 - accuracy: 0.3428 - val_loss: 1.0809 - val_accuracy: 0.6240
Epoch 2/5
92/92 [==============================] - 28s 303ms/step - loss: 1.0781 - accuracy: 0.5724 - val_loss: 0.9762 - val_accuracy: 0.6322
Epoch 3/5
92/92 [==============================] - 28s 295ms/step - loss: 1.0083 - accuracy: 0.5900 - val_loss: 0.9570 - val_accuracy: 0.6376
Epoch 4/5
92/92 [==============================] - 28s 300ms/step - loss: 0.9537 - accuracy: 0.6116 - val_loss: 0.9081 - val_accuracy: 0.6485
Epoch 5/5
92/92 [==============================] - 28s 301ms/step - loss: 0.8816 - accuracy: 0.6525 - val_loss: 0.8353 - val_accuracy: 0.6594

loss, acc = model.evaluate(test_ds)
print("Accuracy", acc)
12/12 [==============================] - 1s 83ms/step - loss: 0.8226 - accuracy: 0.6567
Accuracy 0.6566757559776306

কাস্টম ডেটা বৃদ্ধি

আপনি কাস্টম ডেটা সংযোজন স্তরগুলিও তৈরি করতে পারেন। এই টিউটোরিয়ালটি এটি করার দুটি উপায় দেখায়। প্রথমে আপনি একটি স্তর তৈরি করবেন। layers.Lambda স্তর। সংক্ষিপ্ত কোডটি লেখার এটি একটি ভাল উপায়। এরপরে, আপনি সাবক্লাসিংয়ের মাধ্যমে একটি নতুন স্তর লিখবেন, যা আপনাকে আরও নিয়ন্ত্রণ দেয়। উভয় স্তরগুলি এলোমেলোভাবে কোনও চিত্রের রঙগুলিকে উল্টে দেবে, কিছুটা সম্ভাবনার জন্য মূল্যায়ন করে।

def random_invert_img(x, p=0.5):
  if  tf.random.uniform([]) < p:
    x = (255-x)
  else:
    x
  return x
def random_invert(factor=0.5):
  return layers.Lambda(lambda x: random_invert_img(x, factor))

random_invert = random_invert()
plt.figure(figsize=(10, 10))
for i in range(9):
  augmented_image = random_invert(image)
  ax = plt.subplot(3, 3, i + 1)
  plt.imshow(augmented_image[0].numpy().astype("uint8"))
  plt.axis("off")

পিএনজি

এরপরে, সাবক্লাসিং করে একটি কাস্টম স্তর প্রয়োগ করুন।

class RandomInvert(layers.Layer):
  def __init__(self, factor=0.5, **kwargs):
    super().__init__(**kwargs)
    self.factor = factor

  def call(self, x):
    return random_invert_img(x)
_ = plt.imshow(RandomInvert()(image)[0])

পিএনজি

উপরের 1 এবং 2 বিকল্পগুলিতে বর্ণিত হিসাবে এই দুটি স্তরই ব্যবহার করা যেতে পারে।

Tf.image ব্যবহার করা হচ্ছে

উপরোক্ত layers.preprocessing ইউটিলিটি সুবিধাজনক সূক্ষ্ম নিয়ন্ত্রণের জন্য, আপনি tf.data এবং tf.image ব্যবহার করে আপনার নিজস্ব ডেটা বৃদ্ধির পাইপলাইন বা স্তরগুলি লিখতে পারেন। আপনি টেনসরফ্লো অ্যাডোনস চিত্রটিও দেখতে চাইতে পারেন : অপারেশনস এবং টেনসরফ্লো I / O: রঙিন স্পেস রূপান্তর

যেহেতু ফুলের ডেটাসেটটি পূর্বে ডেটা বর্ধনের সাথে কনফিগার করা হয়েছিল, তাই তাজা শুরু করার জন্য এটি পুনরায় আমদানি করা যাক।

(train_ds, val_ds, test_ds), metadata = tfds.load(
    'tf_flowers',
    split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
    with_info=True,
    as_supervised=True,
)

কাজ করার জন্য একটি চিত্র পুনরুদ্ধার করুন।

image, label = next(iter(train_ds))
_ = plt.imshow(image)
_ = plt.title(get_label_name(label))

পিএনজি

আসল এবং সংযোজন করা চিত্রগুলি পাশাপাশি পাশাপাশি তুলনা করতে নীচের ফাংশনটি ব্যবহার করুন।

def visualize(original, augmented):
  fig = plt.figure()
  plt.subplot(1,2,1)
  plt.title('Original image')
  plt.imshow(original)

  plt.subplot(1,2,2)
  plt.title('Augmented image')
  plt.imshow(augmented)

ডেটা বৃদ্ধি

চিত্র উল্টানো

উলম্ব বা অনুভূমিকভাবে চিত্রটি ফ্লিপ করুন।

flipped = tf.image.flip_left_right(image)
visualize(image, flipped)

পিএনজি

ছবিটি গ্রেস্কেল করুন

গ্রেস্কেল একটি চিত্র।

grayscaled = tf.image.rgb_to_grayscale(image)
visualize(image, tf.squeeze(grayscaled))
_ = plt.colorbar()

পিএনজি

চিত্রটি পরিপূর্ণ করুন

একটি স্যাচুরেশন ফ্যাক্টর সরবরাহ করে একটি চিত্রকে পূর্ণ করুন।

saturated = tf.image.adjust_saturation(image, 3)
visualize(image, saturated)

পিএনজি

চিত্রের উজ্জ্বলতা পরিবর্তন করুন

একটি ব্রাইটনেস ফ্যাক্টর সরবরাহ করে চিত্রের উজ্জ্বলতা পরিবর্তন করুন।

bright = tf.image.adjust_brightness(image, 0.4)
visualize(image, bright)

পিএনজি

কেন্দ্রটি চিত্রটি ক্রপ করুন

আপনার ইচ্ছামতো ইমেজ অংশটি কেন্দ্র থেকে চিত্রটি ক্রপ করুন।

cropped = tf.image.central_crop(image, central_fraction=0.5)
visualize(image,cropped)

পিএনজি

চিত্রটি ঘোরান

একটি চিত্র 90 ডিগ্রি ঘোরান।

rotated = tf.image.rot90(image)
visualize(image, rotated)

পিএনজি

একটি ডেটাসেটে বৃদ্ধির প্রয়োগ করুন

আগের মতো, Dataset.map ব্যবহার করে ডেটাসেটে ডেটা বর্ধন প্রয়োগ করুন।

def resize_and_rescale(image, label):
  image = tf.cast(image, tf.float32)
  image = tf.image.resize(image, [IMG_SIZE, IMG_SIZE])
  image = (image / 255.0)
  return image, label
def augment(image,label):
  image, label = resize_and_rescale(image, label)
  # Add 6 pixels of padding
  image = tf.image.resize_with_crop_or_pad(image, IMG_SIZE + 6, IMG_SIZE + 6) 
   # Random crop back to the original size
  image = tf.image.random_crop(image, size=[IMG_SIZE, IMG_SIZE, 3])
  image = tf.image.random_brightness(image, max_delta=0.5) # Random brightness
  image = tf.clip_by_value(image, 0, 1)
  return image, label

ডেটাসেটগুলি কনফিগার করুন

train_ds = (
    train_ds
    .shuffle(1000)
    .map(augment, num_parallel_calls=AUTOTUNE)
    .batch(batch_size)
    .prefetch(AUTOTUNE)
) 
val_ds = (
    val_ds
    .map(resize_and_rescale, num_parallel_calls=AUTOTUNE)
    .batch(batch_size)
    .prefetch(AUTOTUNE)
)
test_ds = (
    test_ds
    .map(resize_and_rescale, num_parallel_calls=AUTOTUNE)
    .batch(batch_size)
    .prefetch(AUTOTUNE)
)

এই ডেটাসেটগুলি এখন আগের মতো কোনও মডেলকে প্রশিক্ষণের জন্য ব্যবহার করা যেতে পারে।

পরবর্তী পদক্ষেপ

এই টিউটোরিয়ালটি কেরাস প্রিপ্রোসেসিং লেয়ার এবং tf.image ব্যবহার করে ডেটা বর্ধন প্রদর্শন tf.image । আপনার মডেলের অভ্যন্তরে কীভাবে প্রাক প্রসেসিং স্তরগুলি অন্তর্ভুক্ত করবেন তা শিখতে চিত্র শ্রেণিবদ্ধকরণ টিউটোরিয়াল দেখুন। বেসিক পাঠ্য শ্রেণিবদ্ধকরণ টিউটোরিয়ালে যেমন দেখানো হয়েছে তেমন কী কী স্তরগুলি আপনাকে পাঠ্য শ্রেণিবদ্ধ করতে সহায়তা করতে পারে তা শিখতে আগ্রহীও হতে পারেন। আপনি সম্পর্কে আরও জানতে পারেন tf.data এই পথ প্রদর্শক , এবং আপনি অভিনয়ের জন্য আপনার ইনপুট পাইপলাইনগুলি কনফিগার করার পদ্ধতির শিখতে পারি এখানে