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

চিত্রগুলি লোড করুন

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

এই টিউটোরিয়ালটি দেখায় যে কীভাবে একটি চিত্র ডেটাसेटকে তিনটি উপায়ে লোড এবং প্রিপ্রোসেস করা যায়। প্রথমে, আপনি ডিস্কে চিত্রের ডিরেক্টরি পড়তে উচ্চ-স্তরের কেরাস প্রিপ্রোসেসিং ইউটিলিটি এবং স্তরগুলি ব্যবহার করবেন। এরপরে, আপনি tf.data ব্যবহার করে স্ক্র্যাচ থেকে আপনার নিজস্ব ইনপুট পাইপলাইন লিখবেন । অবশেষে, আপনি টেনসরফ্লো ডেটাসেটে উপলব্ধ বৃহত ক্যাটালগ থেকে একটি ডেটাसेट ডাউনলোড করবেন।

সেটআপ

import numpy as np
import os
import PIL
import PIL.Image
import tensorflow as tf
import tensorflow_datasets as tfds
print(tf.__version__)
2.3.0

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

এই টিউটোরিয়ালটিতে কয়েক হাজার ফুলের ডেটাসেট ব্যবহার করা হয়েছে। ফুলের ডেটাসেটে প্রতি ক্লাসে একটি করে 5 টি উপ ডিরেক্টরি রয়েছে:

3 বি 39 বি 86 ই 5
import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file(origin=dataset_url, 
                                   fname='flower_photos', 
                                   untar=True)
data_dir = pathlib.Path(data_dir)

(218MB) ডাউনলোড করার পরে আপনার কাছে এখন ফুলের ছবিগুলির একটি অনুলিপি পাওয়া উচিত। মোট 3670 টি চিত্র রয়েছে:

image_count = len(list(data_dir.glob('*/*.jpg')))
print(image_count)
3670

প্রতিটি ডিরেক্টরিতে এই ধরণের ফুলের চিত্র থাকে। এখানে কিছু গোলাপ রয়েছে:

roses = list(data_dir.glob('roses/*'))
PIL.Image.open(str(roses[0]))

পিএনজি

roses = list(data_dir.glob('roses/*'))
PIL.Image.open(str(roses[1]))

পিএনজি

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

আসুন চিত্র_ডেটসেট_ফ্রম_ডাইরেক্টরি ব্যবহার করে এই চিত্রগুলি ডিস্কের বাইরে লোড করি।

একটি ডেটাসেট তৈরি করুন

লোডারটির জন্য কিছু পরামিতি নির্ধারণ করুন:

batch_size = 32
img_height = 180
img_width = 180

আপনার মডেলটি বিকাশ করার সময় একটি বৈধতা বিভাজন ব্যবহার করা ভাল অনুশীলন। আমরা প্রশিক্ষণের জন্য চিত্রের 80% এবং বৈধতার জন্য 20% ব্যবহার করব।

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
Found 3670 files belonging to 5 classes.
Using 2936 files for training.

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
বি 867444ef9

আপনি এই ডেটাসেটগুলিতে class_names বৈশিষ্ট্যটিতে শ্রেণীর নামগুলি খুঁজে পেতে পারেন।

class_names = train_ds.class_names
print(class_names)
['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']

ডেটা ভিজ্যুয়ালাইজ করুন

প্রশিক্ষণ ডেটাসেটের প্রথম 9 টি চিত্র এখানে।

6 বি 2 বি 47486a

পিএনজি

আপনি এই ডেটাসেটগুলি ব্যবহার করে একটি মডেলকে model.fit পাস করে প্রশিক্ষণ দিতে পারেন (এই টিউটোরিয়ালে পরে দেখানো হয়েছে)। আপনি যদি পছন্দ করেন তবে আপনি নিজেই ডেটাসেটের মাধ্যমে পুনরুক্তি করতে এবং চিত্রগুলির ব্যাচগুলি পুনরুদ্ধার করতে পারেন:

for image_batch, labels_batch in train_ds:
  print(image_batch.shape)
  print(labels_batch.shape)
  break
(32, 180, 180, 3)
(32,)

image_batch আকৃতির একটি image_batch (32, 180, 180, 3) । এটি 180x180x3 আকারের 32 টি চিত্রের একটি ব্যাচ (রঙের চ্যানেল আরজিবিতে শেষ মাত্রাটি 180x180x3 করে)। label_batch (32,) আকৃতির একটি label_batch , এটি 32 টি চিত্রের সাথে সম্পর্কিত লেবেল।

ডেটা মানক করুন

আরজিবি চ্যানেল মানগুলি [0, 255] সীমার মধ্যে রয়েছে। এটি নিউরাল নেটওয়ার্কের জন্য আদর্শ নয়; সাধারণভাবে আপনার নিজের ইনপুট মানকে ছোট করার চেষ্টা করা উচিত। এখানে, আমরা একটি পুনরুক্তকরণ স্তর ব্যবহার করে [0, 1] মানগুলিকে মানীকৃত করব।

from tensorflow.keras import layers

normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1./255)

এই স্তরটি ব্যবহার করার দুটি উপায় রয়েছে। আপনি মানচিত্রে কল করে এটি ডেটাসেটে প্রয়োগ করতে পারেন:

normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
image_batch, labels_batch = next(iter(normalized_ds))
first_image = image_batch[0]
# Notice the pixels values are now in `[0,1]`.
print(np.min(first_image), np.max(first_image)) 
0.0 0.96902645

অথবা, স্থাপনাকে সহজ করার জন্য আপনি আপনার মডেল সংজ্ঞাটির ভিতরে স্তরটি অন্তর্ভুক্ত করতে পারেন। আমরা এখানে দ্বিতীয় পদ্ধতির ব্যবহার করব।

পারফরম্যান্সের জন্য ডেটাসেট কনফিগার করুন

আসুন আমরা বাফার প্রিফেচিং ব্যবহার নিশ্চিত করে থাকি যাতে I / O ব্লক হয়ে না গিয়ে আমরা ডিস্ক থেকে ডেটা উপার্জন করতে পারি। ডেটা লোড করার সময় আপনার এই দুটি গুরুত্বপূর্ণ পদ্ধতি ব্যবহার করা উচিত।

.cache() চিত্রগুলি প্রথম যুগের সময় ডিস্ক লোড হওয়ার পরে মেমোরিতে রাখে। এটি আপনার মডেলটিকে প্রশিক্ষণ দেওয়ার সময় ডেটাসেটটি কোনও বাধা হয়ে উঠবে না তা নিশ্চিত করবে। যদি আপনার ডেটাসেট মেমরির সাথে ফিট করার জন্য খুব বড় হয় তবে আপনি অন-ডিস্ক ক্যাশে পারফরম্যান্স তৈরি করতে এই পদ্ধতিটিও ব্যবহার করতে পারেন।

.prefetch() প্রশিক্ষণের সময় ডেটা .prefetch() এবং মডেল সম্পাদনাকে ওভারল্যাপ করে।

আগ্রহী পাঠকরা উভয় পদ্ধতি এবং সেইসাথে কীভাবে ডেটা পারফরম্যান্স গাইডের মধ্যে ডিস্কে ডেটা ক্যাশে করবেন সে সম্পর্কে আরও জানতে পারবেন।

AUTOTUNE = tf.data.experimental.AUTOTUNE

train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

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

সম্পূর্ণতার জন্য, আমরা কীভাবে সবে প্রস্তুত করেছি ডেটাসেট ব্যবহার করে কীভাবে একটি সাধারণ মডেলকে প্রশিক্ষণ দেওয়া যায় তা আমরা দেখাব। এই মডেলটি কোনওভাবেই সুর করা যায় নি - লক্ষ্যটি হ'ল সবে তৈরি করা ডেটাসেট ব্যবহার করে আপনাকে মেকানিক্স দেখানো। চিত্রের শ্রেণিবিন্যাস সম্পর্কে আরও জানতে, এই টিউটোরিয়ালটি দেখুন

num_classes = 5

model = tf.keras.Sequential([
  layers.experimental.preprocessing.Rescaling(1./255),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])
model.compile(
  optimizer='adam',
  loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])
model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=3
)
Epoch 1/3
92/92 [==============================] - 7s 74ms/step - loss: 1.3679 - accuracy: 0.4131 - val_loss: 1.1740 - val_accuracy: 0.5381
Epoch 2/3
92/92 [==============================] - 1s 11ms/step - loss: 1.0772 - accuracy: 0.5623 - val_loss: 1.0466 - val_accuracy: 0.5899
Epoch 3/3
92/92 [==============================] - 1s 11ms/step - loss: 0.9490 - accuracy: 0.6349 - val_loss: 0.9824 - val_accuracy: 0.6267

<tensorflow.python.keras.callbacks.History at 0x7f1ea844da58>

আপনি লক্ষ্য করতে পারেন যে প্রশিক্ষণের নির্ভুলতার তুলনায় বৈধতার যথার্থতা কম, এটি নির্দেশ করে যে আমাদের মডেল অত্যধিক মানানসই। আপনি এই টিউটোরিয়ালে ওভারফিটিং এবং এটি কীভাবে হ্রাস করবেন সে সম্পর্কে আরও শিখতে পারেন।

সূক্ষ্ম নিয়ন্ত্রণের জন্য tf.data ব্যবহার করা

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

list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'), shuffle=False)
list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False)
for f in list_ds.take(5):
  print(f.numpy())
b'/home/kbuilder/.keras/datasets/flower_photos/tulips/13510068773_c925c5517c.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/tulips/6931748252_68f06086b3.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/daisy/1031799732_e7f4008c03.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/dandelion/18342918441_b1bb69a2fd_n.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/daisy/162362896_99c7d851c8_n.jpg'

ফাইলগুলির গাছ কাঠামোটি একটি class_names তালিকা তৈরি করতে ব্যবহৃত হতে পারে।

class_names = np.array(sorted([item.name for item in data_dir.glob('*') if item.name != "LICENSE.txt"]))
print(class_names)
['daisy' 'dandelion' 'roses' 'sunflowers' 'tulips']

ডেটাसेटকে ট্রেন এবং বৈধকরণে বিভক্ত করুন:

val_size = int(image_count * 0.2)
train_ds = list_ds.skip(val_size)
val_ds = list_ds.take(val_size)

আপনি প্রতিটি ডাটাसेटের দৈর্ঘ্য নীচের মতো দেখতে পাবেন:

print(tf.data.experimental.cardinality(train_ds).numpy())
print(tf.data.experimental.cardinality(val_ds).numpy())
2936
734

একটি সংক্ষিপ্ত ফাংশন লিখুন যা কোনও ফাইল পাথকে (img, label) জুটিতে রূপান্তর করে:

def get_label(file_path):
  # convert the path to a list of path components
  parts = tf.strings.split(file_path, os.path.sep)
  # The second to last is the class-directory
  one_hot = parts[-2] == class_names
  # Integer encode the label
  return tf.argmax(one_hot)
def decode_img(img):
  # convert the compressed string to a 3D uint8 tensor
  img = tf.image.decode_jpeg(img, channels=3)
  # resize the image to the desired size
  return tf.image.resize(img, [img_height, img_width])
def process_path(file_path):
  label = get_label(file_path)
  # load the raw data from the file as a string
  img = tf.io.read_file(file_path)
  img = decode_img(img)
  return img, label

image, label জোড়াগুলির একটি ডেটাসেট তৈরি করতে Dataset.map ব্যবহার করুন:

2ddbe601a
for image, label in train_ds.take(1):
  print("Image shape: ", image.numpy().shape)
  print("Label: ", label.numpy())
Image shape:  (180, 180, 3)
Label:  4

পারফরম্যান্সের জন্য ডেটাসেট কনফিগার করুন

এই ডেটাসেট দিয়ে কোনও মডেলকে প্রশিক্ষণের জন্য আপনি ডেটা চাইবেন:

  • ভালভাবে বদলে যাওয়া।
  • বাচ্চা করা।
  • ব্যাচগুলি যত তাড়াতাড়ি সম্ভব পাওয়া যায়।

tf.data API ব্যবহার করে এই বৈশিষ্ট্যগুলি যুক্ত করা যেতে পারে। আরও তথ্যের জন্য, ইনপুট পাইপলাইন পারফরম্যান্স গাইডটি দেখুন।

def configure_for_performance(ds):
  ds = ds.cache()
  ds = ds.shuffle(buffer_size=1000)
  ds = ds.batch(batch_size)
  ds = ds.prefetch(buffer_size=AUTOTUNE)
  return ds

train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)

ডেটা ভিজ্যুয়ালাইজ করুন

আপনি এই ডেটাসেটটি আগে তৈরির মতো একইভাবে ভিজ্যুয়ালাইজ করতে পারেন।

image_batch, label_batch = next(iter(train_ds))

plt.figure(figsize=(10, 10))
for i in range(9):
  ax = plt.subplot(3, 3, i + 1)
  plt.imshow(image_batch[i].numpy().astype("uint8"))
  label = label_batch[i]
  plt.title(class_names[label])
  plt.axis("off")

পিএনজি

মডেল প্রশিক্ষণ চালিয়ে যান

আপনি এখন ম্যানুয়ালি উপরের keras.preprocessing দ্বারা তৈরি একটির মতো একই tf.data.Dataset তৈরি করেছেন। আপনি এটি দিয়ে মডেল প্রশিক্ষণ চালিয়ে যেতে পারেন। আগের মতো, চলমান সময়টি কম রাখার জন্য আমরা কয়েকটি কয়েক যুগের জন্য প্রশিক্ষণ দেব।

model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=3
)
Epoch 1/3
92/92 [==============================] - 2s 20ms/step - loss: 0.8373 - accuracy: 0.6890 - val_loss: 0.8115 - val_accuracy: 0.6866
Epoch 2/3
92/92 [==============================] - 1s 12ms/step - loss: 0.6614 - accuracy: 0.7585 - val_loss: 0.7761 - val_accuracy: 0.7003
Epoch 3/3
92/92 [==============================] - 1s 11ms/step - loss: 0.4723 - accuracy: 0.8294 - val_loss: 0.8492 - val_accuracy: 0.7125

<tensorflow.python.keras.callbacks.History at 0x7f1f8fd419b0>

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

এখনও অবধি, এই টিউটোরিয়ালটি ডিস্ক বন্ধ ডেটা লোড করার উপর দৃষ্টি নিবদ্ধ করেছে। টেনসরফ্লো ডেটাসেটে সহজেই ডাউনলোড-করা ডাউনলোডের ডেটাসেটের বৃহত ক্যাটালগটি অন্বেষণ করে আপনি ব্যবহার করতে একটি ডেটাসেট খুঁজে পেতে পারেন। যেমন আপনি পূর্বে ফুলের ডেটাসেট অফ ডিস্কটি লোড করেছেন, আসুন এটি কীভাবে টেনসরফ্লো ডেটাসেটগুলি দিয়ে আমদানি করা যায় তা দেখুন।

টেনসরফ্লো ডেটাসেট ব্যবহার করে ফুলের ডেটাসেটটি ডাউনলোড করুন।

(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,
)

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

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))

পিএনজি

আগের মতো, ব্যাচের কথা মনে রাখুন, বদল করুন এবং পারফরম্যান্সের জন্য প্রতিটি ডেটাসেট কনফিগার করুন।

train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)
test_ds = configure_for_performance(test_ds)

আপনি ডেটা বর্ধনের টিউটোরিয়ালটিতে গিয়ে ফুলের ডেটাসেট এবং টেনসরফ্লো ডেটাসেটের সাথে কাজ করার একটি সম্পূর্ণ উদাহরণ খুঁজে পেতে পারেন।

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

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