ดูบน TensorFlow.org | ดูบน GitHub | ดาวน์โหลดสมุดบันทึก | วิ่งใน 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 Notebooks ให้คลิกที่ "Add-ons"->"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 อีกครั้งเพื่อเข้าถึงผลการฝึก รันส่วนต่อไปนี้ตามลำดับ:
- นำเข้าโมดูลที่จำเป็น
- การกำหนดค่าโครงการ
- กำลังตรวจสอบสมุดบันทึกเพื่อใช้ Google Cloud Project ของคุณ
โหลดเทนเซอร์บอร์ด
ขณะที่การฝึกอบรมกำลังดำเนินอยู่ คุณสามารถใช้ Tensorboard เพื่อดูผลลัพธ์ได้ โปรดทราบว่าผลลัพธ์จะแสดงหลังจากการฝึกของคุณเริ่มต้นแล้วเท่านั้น การดำเนินการนี้อาจใช้เวลาสักครู่
%load_ext tensorboard
%tensorboard --logdir $TENSORBOARD_LOGS_DIR
โหลดโมเดลที่ผ่านการฝึกอบรมของคุณ
trained_model = tf.keras.models.load_model(SAVED_MODEL_DIR)
trained_model.summary()