<jupyter_start><jupyter_text>Copyright 2020 The TensorFlow Authors.<jupyter_code>#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.<jupyter_output><empty_output><jupyter_text>تكثير البيانات (data augmentation)       إفتح المحتوى على موقع TensorFlow.org        تفاعل مع المحتوى على Google Colab        إطّلع على المصدر في Github        تنزيل الدّفتر   Note: قامت مجموعة المتطوعين في مشروع Tensorflow بترجمة هذا المحتوى. نظرًا لأن هذه الترجمات تعتمد على قاعدة أقصى الجهد (best-effort) ، فلا نضمن أنها انعكاس دقيق وحديث [للمحتوى الرسمي باللغة الإنجليزية](https://www.tensorflow.org/?hl=en). إذا كانت لديك اقتراحات لتحسين هذه الترجمة ، يرجى إرسال "Pull request" إلى مشروع [tensorflow/docs-l10n](https://github.com/tensorflow/docs-l10n). للتطوع أو مراجعة ترجمات المجموعة يرجى ارسال ايميل إلى <EMAIL>.  لمحةيبيّن هذا الدفتر التعليمي الطرق المستخدمة في معالجة البيانات و تكثيرها باستعمال `tf.image`.تعتبر طريقة تكثير البيانات واحدة من الطّرق الشائعة لتحسين نتائج النماذج و تجنّب الوقوع في مشكلة الإفراط في التّعلم (overfitting)، أنظر في محتوى الدورة التعليمية حولمشكلتَي [الإفراط و التفريط في التعلّم](https://www.tensorflow.org/tutorials/keras/overfit_and_underfit?hl=ar)و كيفية معالجتهما.   إعداد بيئة العمل<jupyter_code>!pip install git+https://github.com/tensorflow/docs
try:
  %tensorflow_version 2.x
except:
  pass

import urllib

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras import layers
AUTOTUNE = tf.data.experimental.AUTOTUNE

import tensorflow_docs as tfdocs
import tensorflow_docs.plots

import tensorflow_datasets as tfds

import PIL.Image

import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['figure.figsize'] = (12, 5)

import numpy as np<jupyter_output><empty_output><jupyter_text>لنستكشف و نختبر طرق تكثير البيانات على صورة واحدة ثمّ سنقوم بعد ذلك بتكثير مجموعة بيانات كاملة.  ابدأ بتنزيل [هذه الصورة](https://commons.wikimedia.org/wiki/File:Felis_catus-cat_on_snow.jpg)،الملتقطة من قبل المصوّرVon.grzanka،لنستعملها في تجربة طرق تكثير البيانات.<jupyter_code>image_path = tf.keras.utils.get_file("cat.jpg", "https://storage.googleapis.com/download.tensorflow.org/example_images/320px-Felis_catus-cat_on_snow.jpg")
PIL.Image.open(image_path)<jupyter_output><empty_output><jupyter_text>تحميل الصورة و تحويلها إلى Tensor.<jupyter_code>image_string=tf.io.read_file(image_path)
image=tf.image.decode_jpeg(image_string,channels=3)<jupyter_output><empty_output><jupyter_text>سنستخدم الوظيفة التّالية لرسم و مقارنة الصورة الأصلية مع الصورة الناتجة عن عمليّة التكثير جنبا إلى جنب.<jupyter_code>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)<jupyter_output><empty_output><jupyter_text>كثِّر صورة واحدةنعرض في الأقسام التّالية عدّة طرق لتكثير الصورة.  قلب الصورةقم بقلب الصورة عموديّا أو أفقيّا.<jupyter_code>flipped = tf.image.flip_left_right(image)
visualize(image, flipped)<jupyter_output><empty_output><jupyter_text>حوّل الصورة إلى التدرّج الرمادي قم بتحويل الصورة إلى التدرّج الرمادي هكذا:<jupyter_code>grayscaled = tf.image.rgb_to_grayscale(image)
visualize(image, tf.squeeze(grayscaled))
plt.colorbar()<jupyter_output><empty_output><jupyter_text>إشباع الصورةقم بإشباع الصورة من خلال توفير عامل إشباع بالطريقة التّالية:<jupyter_code>saturated = tf.image.adjust_saturation(image, 3)
visualize(image, saturated)<jupyter_output><empty_output><jupyter_text>تغيير درجة سطوع الصورةقم بتغيير درجة سطوع الصورة عن طريق توفير عامل سطوع بالطريقة التّالية:<jupyter_code>bright = tf.image.adjust_brightness(image, 0.4)
visualize(image, bright)<jupyter_output><empty_output><jupyter_text>تدوير الصورةقم بتدوير الصورة 90 درجة للحصول على صورة أخرى بالطريقة التّالية:<jupyter_code>rotated = tf.image.rot90(image)
visualize(image, rotated)<jupyter_output><empty_output><jupyter_text>اقتصاص الصورة في المنتصفقم باقتصاص الصورة في المنتصف إلى الحدّ الذّي تريده بالطريقة التّالية:<jupyter_code>cropped = tf.image.central_crop(image, central_fraction=0.5)
visualize(image,cropped)<jupyter_output><empty_output><jupyter_text>أنظر في تفاصيل دليل حزمة الوظائف `tf.image`للتعرّف على المزيد من تقنياتتكثير البيانات.  قم بتكثير مجموعة بيانات ثمّ درّب نموذجًا عليها نعرض في التّالي كيفية تدريب نموذج على مجموعة بيانات مكثّرة.Note:المشكل الذيّ سنقوم بحلّه هنا هو مُصطنع نوعا ما. فنحن ندرّب نموذج شبكة عصبية ، ذي طبقات متّصلة بالكامل ، ليكونأداءه جيّدا و ثابتا أمام التغييرات التي قد تطرئ على صورة ما(shift invariant).بالنسبة للنماذج التي تتعلّم من الصّور، من الأفضل   استخدام الطبقات التلافيفية   (convolution layers)  بدلاً من الطبقات المتّصلة بالكامل.<jupyter_code>dataset, info =  tfds.load('mnist', as_supervised=True, with_info=True)
train_dataset, test_dataset = dataset['train'], dataset['test']

num_train_examples= info.splits['train'].num_examples<jupyter_output><empty_output><jupyter_text>اكتب الوظيفة التّالية ، `augment` ،لتكثير الصّور. ثم قم باستعمالها على مجموعة البيانات.بهذه الطريقة يمكننا تكثير البيانات على الطاير.<jupyter_code>def convert(image, label):
  image = tf.image.convert_image_dtype(image, tf.float32) # Cast and normalize the image to [0,1]
  return image, label

def augment(image,label):
  image,label = convert(image, label)
  image = tf.image.convert_image_dtype(image, tf.float32) # Cast and normalize the image to [0,1]
  image = tf.image.resize_with_crop_or_pad(image, 34, 34) # Add 6 pixels of padding
  image = tf.image.random_crop(image, size=[28, 28, 1]) # Random crop back to 28x28
  image = tf.image.random_brightness(image, max_delta=0.5) # Random brightness

  return image,label
BATCH_SIZE = 64
# Only use a subset of the data so it's easier to overfit, for this tutorial
NUM_EXAMPLES = 2048<jupyter_output><empty_output><jupyter_text>أنشئ مجموعة البيانات المكثّرة<jupyter_code>augmented_train_batches = (
    train_dataset
    # Only train on a subset, so you can quickly see the effect.
    .take(NUM_EXAMPLES)
    .cache()
    .shuffle(num_train_examples//4)
    # The augmentation is added here.
    .map(augment, num_parallel_calls=AUTOTUNE)
    .batch(BATCH_SIZE)
    .prefetch(AUTOTUNE)
)<jupyter_output><empty_output><jupyter_text>و أنشئ مجموعة بيانات غير مُكثّرة للمقارنة.<jupyter_code>non_augmented_train_batches = (
    train_dataset
    # Only train on a subset, so you can quickly see the effect.
    .take(NUM_EXAMPLES)
    .cache()
    .shuffle(num_train_examples//4)
    # No augmentation.
    .map(convert, num_parallel_calls=AUTOTUNE)
    .batch(BATCH_SIZE)
    .prefetch(AUTOTUNE)
)<jupyter_output><empty_output><jupyter_text>جهّز مجموعة**بيانات التحقُّق**(validation set).هذه الخطوة لا تتغير إن استخدمت عمليّة تكثير البيانات أم لا.<jupyter_code>validation_batches = (
    test_dataset
    .map(convert, num_parallel_calls=AUTOTUNE)
    .batch(2*BATCH_SIZE)
)<jupyter_output><empty_output><jupyter_text>أنشئ و جمّع(compile)النموذج.يتكوّن نموذج الشبكة العصبيّة من طبقتين متّصلتين بالكامل.للتبسيط ، لا نستعمل في هذا النموذج طبقة تلافيفية(convolution layer).<jupyter_code>def make_model():
  model = tf.keras.Sequential([
      layers.Flatten(input_shape=(28, 28, 1)),
      layers.Dense(4096, activation='relu'),
      layers.Dense(4096, activation='relu'),
      layers.Dense(10)
  ])
  model.compile(optimizer = 'adam',
                loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['accuracy'])
  return model<jupyter_output><empty_output><jupyter_text>درّب النموذج **من دون**تكثير:<jupyter_code>model_without_aug = make_model()

no_aug_history = model_without_aug.fit(non_augmented_train_batches, epochs=50, validation_data=validation_batches)<jupyter_output><empty_output><jupyter_text>درّب النموذج باستعمال تكثير البيانات:<jupyter_code>model_with_aug = make_model()

aug_history = model_with_aug.fit(augmented_train_batches, epochs=50, validation_data=validation_batches)<jupyter_output><empty_output><jupyter_text>الإستنتاج :  في هذا المثال، يبلغ النموذج المدربّ باستعمال البيانات المكثّرة(augmented data) درجة دقّة تقارب 95%على بيانات التحقّق. هذا أعلى بقليل (+1%)من دقّة النموذج المدرّب من دون إستعمال تقنية تكثير البيانات(non-augmented data).<jupyter_code>plotter = tfdocs.plots.HistoryPlotter()
plotter.plot({"Augmented": aug_history, "Non-Augmented": no_aug_history}, metric = "accuracy")
plt.title("Accuracy")
plt.ylim([0.75,1])<jupyter_output><empty_output><jupyter_text>أمّا بالنسبة لقيمة الخسارة، فمن الواضح أنّ النموذج المدرّب بدون تكثيريعاني من مشكلة الإفراط في التعلّم (overfitting). في المقابل ، النموذج المدربّ بالبيانات المكثّرة ، رغم أنّه أبطأ بعض الشئ ، إلاّ أنّه يُتِمُّ عمليّة التدريب بشكل صحيحو لا يعاني من مشكلة الإفراط في التعلّم.<jupyter_code>plotter = tfdocs.plots.HistoryPlotter()
plotter.plot({"Augmented": aug_history, "Non-Augmented": no_aug_history}, metric = "loss")
plt.title("Loss")
plt.ylim([0,1])<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09948761742100769, 'fraction_numerical': 0.010247651579846286, 'mean_word_length': 6.119300911854103, 'pattern_counts': {'":': 4, '<': 86, '<?xml version=': 0, '>': 86, 'https://': 7, 'lorem ipsum': 0, 'www.': 3, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '21', 'dir': 'jupyter-structured-clean-dedup', 'id': '209265', 'license': 'Apache-2.0', 'n_tokens_mistral': 4987, 'n_tokens_neox': 4444, 'n_words': 820, 'path': 'site/ar/tutorials/images/data_augmentation.ipynb', 'repo_name': 'ilyaspiridonov/docs-l10n', 'size': '9380'}