آموزش توزیع NasNet با tensorflow_cloud و Google Cloud

مشاهده در TensorFlow.org در GitHub مشاهده کنید دانلود دفترچه یادداشت لوگوی Kaggleدر Kaggle بدوید

این مثال بر اساس طبقه‌بندی تصویر از طریق تنظیم دقیق با EfficientNet است تا نحوه آموزش مدل NasNetMobile را با استفاده از tensorflow_cloud و Google Cloud Platform در مقیاس با استفاده از آموزش توزیع‌شده نشان دهد.

ماژول های مورد نیاز را وارد کنید

import tensorflow as tf
tf.version.VERSION
'2.6.0'
! pip install -q tensorflow-cloud

import tensorflow_cloud as tfc
tfc.__version__
import sys

تنظیمات پروژه

تنظیم پارامترهای پروژه برای پارامترهای خاص Google Cloud به دستورالعمل‌های راه‌اندازی پروژه Google Cloud مراجعه کنید.

# Set Google Cloud Specific parameters

# TODO: Please set GCP_PROJECT_ID to your own Google Cloud project ID.
GCP_PROJECT_ID = 'YOUR_PROJECT_ID'

# TODO: set GCS_BUCKET to your own Google Cloud Storage (GCS) bucket.
GCS_BUCKET = 'YOUR_GCS_BUCKET_NAME'

# DO NOT CHANGE: Currently only the 'us-central1' region is supported.
REGION = 'us-central1'

# OPTIONAL: You can change the job name to any string.
JOB_NAME = 'nasnet'

# Setting location were training logs and checkpoints will be stored
GCS_BASE_PATH = f'gs://{GCS_BUCKET}/{JOB_NAME}'
TENSORBOARD_LOGS_DIR = os.path.join(GCS_BASE_PATH,"logs")
MODEL_CHECKPOINT_DIR = os.path.join(GCS_BASE_PATH,"checkpoints")
SAVED_MODEL_DIR = os.path.join(GCS_BASE_PATH,"saved_model")

احراز هویت نوت بوک برای استفاده از Google Cloud Project

برای نوت‌بوک‌های Kaggle، قبل از اجرای سلول زیر، روی «افزونه‌ها»-> «Google Cloud SDK» کلیک کنید.

# Using tfc.remote() to ensure this code only runs in notebook
if not tfc.remote():

    # Authentication for Kaggle Notebooks
    if "kaggle_secrets" in sys.modules:
        from kaggle_secrets import UserSecretsClient
        UserSecretsClient().set_gcloud_credentials(project=GCP_PROJECT_ID)

    # Authentication for Colab Notebooks
    if "google.colab" in sys.modules:
        from google.colab import auth
        auth.authenticate_user()
        os.environ["GOOGLE_CLOUD_PROJECT"] = GCP_PROJECT_ID

داده ها را بارگیری و آماده کنید

خواندن داده های خام و تقسیم برای آموزش و آزمایش مجموعه داده ها.

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

# Setting input specific parameters
# The model expects input of dimension (INPUT_IMG_SIZE, INPUT_IMG_SIZE, 3)
INPUT_IMG_SIZE = 32
NUM_CLASSES = 10

APIهای لایه های پیش پردازش را برای تقویت تصویر اضافه کنید.

from tensorflow.keras.layers.experimental import preprocessing
from tensorflow.keras.models import Sequential


img_augmentation = Sequential(
    [
        # Resizing input to better match ImageNet size
        preprocessing.Resizing(256, 256),
        preprocessing.RandomRotation(factor=0.15),
        preprocessing.RandomFlip(),
        preprocessing.RandomContrast(factor=0.1),
    ],
    name="img_augmentation",
)

مدل را بارگذاری کنید و برای آموزش آماده شوید

ما یک مدل از پیش آموزش دیده NASNetMobile (با وزنه ها) را بارگذاری می کنیم و چند لایه را برای تنظیم دقیق مدل برای تطبیق بهتر با مجموعه داده، از حالت انجماد خارج می کنیم.

from tensorflow.keras import layers

def build_model(num_classes, input_image_size):
    inputs = layers.Input(shape=(input_image_size, input_image_size, 3))
    x = img_augmentation(inputs)

    model = tf.keras.applications.NASNetMobile(
        input_shape=None,
        include_top=False,
        weights="imagenet",
        input_tensor=x,
        pooling=None,
        classes=num_classes,
    )

    # Freeze the pretrained weights
    model.trainable = False

    # We unfreeze the top 20 layers while leaving BatchNorm layers frozen
    for layer in model.layers[-20:]:
        if not isinstance(layer, layers.BatchNormalization):
            layer.trainable = True

    # Rebuild top
    x = layers.GlobalAveragePooling2D(name="avg_pool")(model.output)
    x = layers.BatchNormalization()(x)

    x = layers.Dense(128, activation="relu")(x)
    x = layers.Dense(64, activation="relu")(x)
    outputs = layers.Dense(num_classes, activation="softmax", name="pred")(x)

    # Compile
    model = tf.keras.Model(inputs, outputs, name="NASNetMobile")
    optimizer = tf.keras.optimizers.Adam(learning_rate=3e-4)
    model.compile(
        optimizer=optimizer,
        loss="sparse_categorical_crossentropy",
        metrics=["accuracy"]
    )
    return model
model = build_model(NUM_CLASSES, INPUT_IMG_SIZE)

if tfc.remote():
    # Configure Tensorboard logs
    callbacks=[
        tf.keras.callbacks.TensorBoard(log_dir=TENSORBOARD_LOGS_DIR),
        tf.keras.callbacks.ModelCheckpoint(
            MODEL_CHECKPOINT_DIR,
            save_best_only=True),
        tf.keras.callbacks.EarlyStopping(
            monitor='loss',
            min_delta =0.001,
            patience=3)]

    model.fit(x=x_train, y=y_train, epochs=100,
              validation_split=0.2, callbacks=callbacks)

    model.save(SAVED_MODEL_DIR)

else:
    # Run the training for 1 epoch and a small subset of the data to validate setup
    model.fit(x=x_train[:100], y=y_train[:100], validation_split=0.2, epochs=1)

آموزش از راه دور را شروع کنید

این مرحله کد شما را از این نوت بوک برای اجرای از راه دور آماده می کند و آموزش توزیع شده را از راه دور در Google Cloud Platform برای آموزش مدل شروع می کند. پس از ارسال کار می توانید به مرحله بعدی بروید تا پیشرفت کارها را از طریق Tensorboard نظارت کنید.

# If you are using a custom image you can install modules via requirements
# txt file.
with open('requirements.txt','w') as f:
    f.write('tensorflow-cloud\n')

# Optional: Some recommended base images. If you provide none the system
# will choose one for you.
TF_GPU_IMAGE= "tensorflow/tensorflow:latest-gpu"
TF_CPU_IMAGE= "tensorflow/tensorflow:latest"

# Submit a distributed training job using GPUs.
tfc.run(
    distribution_strategy='auto',
    requirements_txt='requirements.txt',
    docker_config=tfc.DockerConfig(
        parent_image=TF_GPU_IMAGE,
        image_build_bucket=GCS_BUCKET
        ),
    chief_config=tfc.COMMON_MACHINE_CONFIGS['K80_1X'],
      worker_config=tfc.COMMON_MACHINE_CONFIGS['K80_1X'],
      worker_count=3,
    job_labels={'job': JOB_NAME}
)

نتایج آموزش

نمونه Colab خود را دوباره وصل کنید

اکثر مشاغل آموزشی از راه دور طولانی مدت هستند. اگر از Colab استفاده می کنید، ممکن است قبل از در دسترس بودن نتایج آموزشی، زمان آن تمام شود. در این صورت، بخش های زیر را مجدداً اجرا کنید تا نمونه Colab خود را مجدداً متصل کرده و پیکربندی کنید تا به نتایج آموزش دسترسی داشته باشید. بخش های زیر را به ترتیب اجرا کنید:

  1. ماژول های مورد نیاز را وارد کنید
  2. تنظیمات پروژه
  3. احراز هویت نوت بوک برای استفاده از Google Cloud Project

بارگذاری Tensorboard

در حالی که آموزش در حال انجام است، می توانید از Tensorboard برای مشاهده نتایج استفاده کنید. توجه داشته باشید که نتایج فقط پس از شروع آموزش شما نشان داده می شود. این ممکن است چند دقیقه طول بکشد.

%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR

مدل آموزش دیده خود را بارگیری کنید

trained_model = tf.keras.models.load_model(SAVED_MODEL_DIR)
trained_model.summary()