Memulai: pelatihan dan prediksi dengan Keras

Logo Colab Jalankan tutorial ini sebagai notebook di Colab Logo GitHub Lihat notebook di GitHub

Tutorial ini menunjukkan cara melatih jaringan saraf di AI Platform menggunakan Keras sequential API dan cara menayangkan prediksi dari model tersebut.

Keras adalah API tingkat tinggi untuk membuat dan melatih model deep learning. tf.keras adalah implementasi TensorFlow untuk API ini.

Dua bagian pertama tutorial ini membahas cara melatih model di AI Platform menggunakan kode Keras yang telah ditulis sebelumnya, men-deploy model terlatih ke AI Platform, dan menayangkan prediksi online dari model yang di-deploy.

Bagian terakhir tutorial ini membahas kode pelatihan yang digunakan untuk model ini dan memastikannya kompatibel dengan AI Platform. Untuk mempelajari lebih lanjut cara membuat model machine learning di Keras secara lebih umum, baca tutorial Keras TensorFlow.

Set data

Tutorial ini menggunakan Set Data Pendapatan Sensus Amerika Serikat yang disediakan oleh Repositori Machine Learning UC Irvine. Set data ini berisi informasi tentang orang-orang dari database Sensus 1994, termasuk usia, pendidikan, status perkawinan, pekerjaan, dan apakah mereka menghasilkan lebih dari $50.000 per tahun.

Tujuan

Tujuannya adalah untuk melatih jaringan neural dalam (DNN) menggunakan Keras yang memprediksi apakah seseorang menghasilkan lebih dari $50.000 per tahun (label target) berdasarkan informasi sensus lainnya tentang orang tersebut (fitur).

Tutorial ini lebih berfokus pada penggunaan model ini dengan AI Platform, bukan pada desain model itu sendiri. Namun, penting untuk selalu memikirkan potensi masalah dan konsekuensi yang tidak diinginkan saat membangun sistem machine learning. Lihat Latihan Kursus Singkat Machine Learning tentang keadilan untuk mempelajari sumber bias dalam set data Sensus, serta keadilan machine learning secara umum.

Biaya

Tutorial ini menggunakan komponen Google Cloud (Google Cloud) yang dapat ditagih:

  • AI Platform Training
  • AI Platform Prediction
  • Cloud Storage

Pelajari harga Pelatihan AI Platform, harga AI Platform Prediction, dan harga Cloud Storage, serta gunakan Kalkulator Harga untuk membuat estimasi biaya berdasarkan proyeksi penggunaan Anda.

Sebelum memulai

Anda harus melakukan beberapa hal sebelum dapat melatih dan men-deploy model di AI Platform:

  • Siapkan lingkungan pengembangan lokal Anda.
  • Siapkan project Google Cloud dengan penagihan dan API yang diperlukan diaktifkan.
  • Buat bucket Cloud Storage untuk menyimpan paket pelatihan dan model terlatih Anda.

Menyiapkan lingkungan pengembangan lokal Anda

Anda memerlukan hal berikut untuk menyelesaikan tutorial ini:

  • Git
  • Python 3
  • virtualenv
  • Google Cloud SDK

Panduan Google Cloud untuk Menyiapkan lingkungan pengembangan Python memberikan petunjuk mendetail untuk memenuhi persyaratan ini. Langkah-langkah berikut memberikan kumpulan petunjuk ringkas:

  1. Instal Python 3.

  2. Instal virtualenv dan buat lingkungan virtual yang menggunakan Python 3.

  3. Aktifkan lingkungan tersebut.

  4. Selesaikan langkah-langkah di bagian berikut untuk menginstal Google Cloud SDK.

Menyiapkan project Google Cloud

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

Mengautentikasi akun GCP Anda

Untuk menyiapkan autentikasi, Anda perlu membuat kunci akun layanan dan menetapkan variabel lingkungan untuk jalur file ke kunci akun layanan.

  1. Buat akun layanan:

    1. Di konsol Google Cloud, buka halaman Buat akun layanan.

      Buka Buat akun layanan

    2. Di kolom Nama akun layanan, masukkan nama.
    3. Opsional: Di kolom Deskripsi akun layanan, masukkan deskripsi.
    4. Klik Buat.
    5. Klik kolom Pilih peran. Di bagian Semua peran, pilih AI Platform > AI Platform Admin.
    6. Klik Add another role.
    7. Klik kolom Pilih peran. Di bagian Semua peran, pilih Storage > Storage Object Admin.

    8. Klik Selesai untuk membuat akun layanan.

      Jangan tutup jendela browser Anda. Anda akan menggunakannya pada langkah berikutnya.

  2. Membuat kunci akun layanan untuk autentikasi:

    1. Di konsol Google Cloud, klik alamat email untuk akun layanan yang telah dibuat.
    2. Klik Kunci.
    3. Klik Tambahkan kunci, lalu Buat kunci baru.
    4. Klik Buat. File kunci JSON akan didownload ke komputer Anda.
    5. Klik Close.
  3. Tetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS ke jalur file JSON yang berisi kunci akun layanan Anda. Variabel ini hanya berlaku untuk sesi shell Anda saat ini. Jadi, jika Anda membuka sesi baru, tetapkan variabel kembali.

Membuat bucket Cloud Storage

Saat mengirimkan tugas pelatihan menggunakan Cloud SDK, Anda akan mengupload paket Python yang berisi kode pelatihan ke bucket Cloud Storage. AI Platform menjalankan kode dari paket ini. Dalam tutorial ini, AI Platform juga menyimpan model terlatih yang dihasilkan dari tugas Anda di bucket yang sama. Kemudian, Anda dapat membuat versi model AI Platform berdasarkan output ini untuk menyalurkan prediksi online.

Tetapkan nama bucket Cloud Storage Anda sebagai variabel lingkungan. Nama harus unik di semua bucket Cloud Storage:

BUCKET_NAME="your-bucket-name"

Pilih region tempat Pelatihan AI Platform dan Prediksi AI Platform tersedia, lalu buat variabel lingkungan lainnya. Contoh:

REGION="us-central1"

Buat bucket Cloud Storage di region ini, lalu gunakan region yang sama untuk pelatihan dan prediksi. Jalankan perintah berikut untuk membuat bucket jika belum ada:

gsutil mb -l $REGION gs://$BUCKET_NAME

Memulai cepat untuk pelatihan di AI Platform

Bagian tutorial ini akan memandu Anda mengirimkan tugas pelatihan ke AI Platform. Tugas ini menjalankan kode contoh yang menggunakan Keras untuk melatih jaringan neural mendalam pada data Sensus Amerika Serikat. Model ini menghasilkan model terlatih sebagai direktori SavedModel TensorFlow di bucket Cloud Storage Anda.

Mendapatkan kode pelatihan dan dependensi

Pertama, download kode pelatihan dan ubah direktori kerja:

# Clone the repository of AI Platform samples
git clone --depth 1 https://github.com/GoogleCloudPlatform/cloudml-samples

# Set the working directory to the sample code directory
cd cloudml-samples/census/tf-keras

Perhatikan bahwa kode pelatihan disusun sebagai paket Python di subdirektori trainer/:

# `ls` shows the working directory's contents. The `p` flag adds trailing
# slashes to subdirectory names. The `R` flag lists subdirectories recursively.
ls -pR
.:
README.md  requirements.txt  trainer/

./trainer:
__init__.py  model.py  task.py  util.py

Selanjutnya, instal dependensi Python yang diperlukan untuk melatih model secara lokal:

pip install -r requirements.txt

Saat Anda menjalankan tugas pelatihan di AI Platform, dependensi telah diinstal sebelumnya berdasarkan versi runtime yang Anda pilih.

Melatih model secara lokal

Sebelum melakukan pelatihan di AI Platform, latih tugas secara lokal untuk memverifikasi struktur dan pengemasan file sudah benar.

Untuk tugas yang kompleks atau membutuhkan banyak resource, Anda dapat melakukan pelatihan secara lokal pada sampel kecil set data untuk memverifikasi kode Anda. Kemudian, Anda dapat menjalankan tugas di AI Platform untuk melatih seluruh set data.

Contoh ini menjalankan tugas yang relatif cepat pada set data kecil, sehingga pelatihan lokal dan tugas AI Platform menjalankan kode yang sama pada data yang sama.

Jalankan perintah berikut untuk melatih model secara lokal:

# This is similar to `python -m trainer.task --job-dir local-training-output`
# but it better replicates the AI Platform environment, especially
# for distributed training (not applicable here).
gcloud ai-platform local train \
  --package-path trainer \
  --module-name trainer.task \
  --job-dir local-training-output

Amati progres pelatihan di shell Anda. Pada akhirnya, aplikasi pelatihan mengekspor model yang dilatih dan mencetak pesan seperti berikut:

Model exported to:  local-training-output/keras_export/1553709223

Melatih model menggunakan AI Platform

Selanjutnya, kirim tugas pelatihan ke AI Platform. Tindakan ini akan menjalankan modul pelatihan di cloud dan mengekspor model terlatih ke Cloud Storage.

Pertama, beri nama tugas pelatihan dan pilih direktori dalam bucket Cloud Storage untuk menyimpan file perantara dan output. Tetapkan variabel ini sebagai variabel lingkungan. Contoh:

JOB_NAME="my_first_keras_job"
JOB_DIR="gs://$BUCKET_NAME/keras-job-dir"

Jalankan perintah berikut untuk memaketkan direktori trainer/, menguploadnya ke --job-dir yang ditentukan, dan menginstruksikan AI Platform untuk menjalankan modul trainer.task dari paket tersebut.

Flag --stream-logs memungkinkan Anda melihat log pelatihan di shell. Anda juga dapat melihat log dan detail tugas lainnya di Konsol Google Cloud.

gcloud ai-platform jobs submit training $JOB_NAME \
  --package-path trainer/ \
  --module-name trainer.task \
  --region $REGION \
  --python-version 3.7 \
  --runtime-version 1.15 \
  --job-dir $JOB_DIR \
  --stream-logs

Proses ini mungkin memerlukan waktu lebih lama daripada pelatihan lokal, tetapi Anda dapat mengamati progres pelatihan di shell dengan cara yang serupa. Pada akhirnya, tugas pelatihan mengekspor model terlatih ke bucket Cloud Storage Anda dan mencetak pesan seperti berikut:

INFO    2019-03-27 17:57:11 +0000   master-replica-0        Model exported to:  gs://your-bucket-name/keras-job-dir/keras_export/1553709421
INFO    2019-03-27 17:57:11 +0000   master-replica-0        Module completed; cleaning up.
INFO    2019-03-27 17:57:11 +0000   master-replica-0        Clean up finished.
INFO    2019-03-27 17:57:11 +0000   master-replica-0        Task completed successfully.

Penyesuaian hyperparameter

Secara opsional, Anda dapat melakukan penyesuaian hyperparameter menggunakan file konfigurasi hptuning_config.yaml yang disertakan. File ini memberi tahu AI Platform untuk menyesuaikan ukuran batch dan kecepatan belajar untuk pelatihan melalui beberapa uji coba guna memaksimalkan akurasi.

Dalam contoh ini, kode pelatihan menggunakan callback TensorBoard, yang membuat Summary Event TensorFlow selama pelatihan. AI Platform menggunakan peristiwa ini untuk melacak metrik yang ingin Anda optimalkan. Pelajari lebih lanjut penyesuaian hyperparameter di Pelatihan AI Platform.

gcloud ai-platform jobs submit training ${JOB_NAME}_hpt \
  --config hptuning_config.yaml \
  --package-path trainer/ \
  --module-name trainer.task \
  --region $REGION \
  --python-version 3.7 \
  --runtime-version 1.15 \
  --job-dir $JOB_DIR \
  --stream-logs

Panduan memulai untuk prediksi online di AI Platform

Bagian ini menunjukkan cara menggunakan AI Platform dan model terlatih Anda dari bagian sebelumnya untuk memprediksi rentang pendapatan seseorang dari informasi Sensus lain tentang mereka.

Membuat resource model dan versi di AI Platform

Untuk menayangkan prediksi online menggunakan model yang Anda latih dan ekspor di panduan memulai untuk pelatihan, buat resource model di AI Platform dan resource versi di dalamnya. Resource versi adalah yang benar-benar menggunakan model terlatih Anda untuk menayangkan prediksi. Struktur ini memungkinkan Anda menyesuaikan dan melatih ulang model beberapa kali dan mengatur semua versi secara bersamaan di AI Platform. Pelajari model dan versi lebih lanjut.

Pertama, beri nama dan buat resource model:

MODEL_NAME="my_first_keras_model"

gcloud ai-platform models create $MODEL_NAME \
  --regions $REGION
Created ml engine model [projects/your-project-id/models/my_first_keras_model].

Selanjutnya, buat versi model. Tugas pelatihan dari mulai cepat untuk pelatihan mengekspor direktori SavedModel TensorFlow berstempel waktu ke bucket Cloud Storage Anda. AI Platform menggunakan direktori ini untuk membuat versi model. Pelajari lebih lanjut SavedModel dan AI Platform.

Anda mungkin dapat menemukan jalur ke direktori ini di log tugas pelatihan. Cari baris seperti:

Model exported to:  gs://your-bucket-name/keras-job-dir/keras_export/1545439782

Jalankan perintah berikut untuk mengidentifikasi direktori SavedModel dan menggunakannya untuk membuat resource versi model:

MODEL_VERSION="v1"

# Get a list of directories in the `keras_export` parent directory. Then pick
# the directory with the latest timestamp, in case you've trained multiple
# times.
SAVED_MODEL_PATH=$(gsutil ls $JOB_DIR/keras_export | head -n 1)

# Create model version based on that SavedModel directory
gcloud ai-platform versions create $MODEL_VERSION \
  --model $MODEL_NAME \
  --region $REGION \
  --runtime-version 1.15 \
  --python-version 3.7 \
  --framework tensorflow \
  --origin $SAVED_MODEL_PATH

Persiapkan input untuk prediksi

Untuk menerima prediksi yang valid dan berguna, Anda harus melakukan pra-proses input untuk prediksi dengan cara yang sama seperti data pelatihan yang dipraproses. Dalam sistem produksi, Anda mungkin ingin membuat pipeline pra-pemrosesan yang dapat digunakan secara identik pada waktu pelatihan dan waktu prediksi.

Untuk latihan ini, gunakan kode pemuatan data paket pelatihan untuk memilih sampel acak dari data evaluasi. Data ini berupa bentuk yang digunakan untuk mengevaluasi akurasi setelah setiap epoch pelatihan, sehingga dapat digunakan untuk mengirim prediksi pengujian tanpa pra-pemrosesan lebih lanjut.

Buka penafsiran Python (python) dari direktori tugas Anda saat ini untuk menjalankan beberapa cuplikan kode berikutnya:

from trainer import util

_, _, eval_x, eval_y = util.load_data()

prediction_input = eval_x.sample(20)
prediction_targets = eval_y[prediction_input.index]

prediction_input
age workclass education_num marital_status pekerjaan relationship ras capital_gain capital_loss hours_per_week native_country
1979 0,901213 1 1,525542 2 9 0 4 -0,144792 -0,217132 -0,437544 38
2430 -0,922154 3 -0,419265 4 2 3 4 -0,144792 -0,217132 -0,034039 38
4214 -1,213893 3 -0,030304 4 10 1 4 -0,144792 -0,217132 1,579979 38
10389 -0,630415 3 0,358658 4 0 3 4 -0,144792 -0,217132 -0,679647 38
14525 -1,505632 3 -1,586149 4 7 3 0 -0,144792 -0,217132 -0,034039 38
15040 -0,119873 5 0,358658 2 2 0 4 -0,144792 -0,217132 -0,841048 38
8409 0,244801 3 1,525542 2 9 0 4 -0,144792 -0,217132 1,176475 6
10628 0.098931 1 1,525542 2 9 0 4 0,886847 -0,217132 -0,034039 38
10942 0.390670 5 -0,030304 2 4 0 4 -0,144792 -0,217132 4,727315 38
5129 1,120017 3 1,136580 2 12 0 4 -0,144792 -0,217132 -0,034039 38
2096 -1,286827 3 -0,030304 4 11 3 4 -0,144792 -0,217132 -1,648058 38
12463 -0,703350 3 -0,419265 2 7 5 4 -0,144792 4.502280 -0,437544 38
8528 0,536539 3 1,525542 4 3 4 4 -0,144792 -0,217132 -0,034039 38
7093 -1,359762 3 -0,419265 4 6 3 2 -0,144792 -0,217132 -0,034039 38
12565 0,536539 3 1,136580 0 11 2 2 -0,144792 -0,217132 -0,034039 38
5655 1,338821 3 -0,419265 2 2 0 4 -0,144792 -0,217132 -0,034039 38
2322 0,682409 3 1,136580 0 12 3 4 -0,144792 -0,217132 -0,034039 38
12652 0,025997 3 1,136580 2 11 0 4 -0,144792 -0,217132 0,369465 38
4755 -0,411611 3 -0,419265 2 11 0 4 -0,144792 -0,217132 1,176475 38
4413 0.390670 6 1,136580 4 4 1 4 -0,144792 -0,217132 -0,034039 38

Perhatikan bahwa kolom kategori, seperti occupation, telah dikonversi ke bilangan bulat (dengan pemetaan yang sama dengan yang digunakan untuk pelatihan). Kolom numerik, seperti age, telah diskalakan ke skor z. Beberapa bidang telah dihapus dari data asli. Bandingkan input prediksi dengan data mentah untuk contoh yang sama:

import pandas as pd

_, eval_file_path = util.download(util.DATA_DIR)
raw_eval_data = pd.read_csv(eval_file_path,
                            names=util._CSV_COLUMNS,
                            na_values='?')

raw_eval_data.iloc[prediction_input.index]
age workclass fnlwgt pendidikan education_num marital_status pekerjaan relationship ras gender capital_gain capital_loss hours_per_week native_country income_bracket
1979 51 Local-gov 99064 Master 14 Married-civ-spouse Prof-specialty Suami Putih Laki-laki 0 0 35 Amerika Serikat <=50K
2430 26 Pribadi 197967 HS-grad 9 Belum pernah menikah Craft-repair Own-child Putih Laki-laki 0 0 40 Amerika Serikat <=50K
4214 22 Pribadi 221694 Lulusan sekolah tinggi 10 Belum pernah menikah Protective-serv Tidak termasuk dalam keluarga Putih Laki-laki 0 0 60 Amerika Serikat <=50K
10389 30 Pribadi 96480 Assoc-voc 11 Belum pernah menikah Adm-clerical Own-child Putih Perempuan 0 0 32 Amerika Serikat <=50K
14525 18 Pribadi 146225 10 6 Belum pernah menikah Layanan-lainnya Own-child Amer-Indian-Eskimo Perempuan 0 0 40 Amerika Serikat <=50K
15040 37 Self-emp-not-inc 50096 Assoc-voc 11 Married-civ-spouse Craft-repair Suami Putih Laki-laki 0 0 30 Amerika Serikat <=50K
8409 42 Pribadi 102988 Master 14 Married-civ-spouse Prof-specialty Suami Putih Laki-laki 0 0 55 Ekuador >50 ribu
10628 40 Local-gov 284086 Master 14 Married-civ-spouse Prof-specialty Suami Putih Laki-laki 7688 0 40 Amerika Serikat >50 ribu
10942 44 Self-emp-not-inc 52505 Lulusan sekolah tinggi 10 Married-civ-spouse Pertanian-perikanan Suami Putih Laki-laki 0 0 99 Amerika Serikat <=50K
5129 54 Pribadi 106728 Sarjana 13 Married-civ-spouse Dukungan teknis Suami Putih Laki-laki 0 0 40 Amerika Serikat <=50K
2096 21 Pribadi 190916 Lulusan sekolah tinggi 10 Belum pernah menikah Penjualan Own-child Putih Perempuan 0 0 20 Amerika Serikat <=50K
12463 29 Pribadi 197565 HS-grad 9 Married-civ-spouse Layanan-lainnya Istri Putih Perempuan 0 1902 35 Amerika Serikat >50 ribu
8528 46 Pribadi 193188 Master 14 Belum pernah menikah Eksekutif-pengelola Belum Menikah Putih Laki-laki 0 0 40 Amerika Serikat <=50K
7093 20 Pribadi 273147 HS-grad 9 Belum pernah menikah Machine-op-inspct Own-child Hitam Laki-laki 0 0 40 Amerika Serikat <=50K
12565 46 Pribadi 203653 Sarjana 13 Bercerai Penjualan Other-relative Hitam Laki-laki 0 0 40 Amerika Serikat <=50K
5655 57 Pribadi 174662 HS-grad 9 Married-civ-spouse Craft-repair Suami Putih Laki-laki 0 0 40 Amerika Serikat <=50K
2322 48 Pribadi 232149 Sarjana 13 Bercerai Dukungan teknis Own-child Putih Perempuan 0 0 40 Amerika Serikat <=50K
12652 39 Pribadi 82521 Sarjana 13 Married-civ-spouse Penjualan Suami Putih Laki-laki 0 0 45 Amerika Serikat >50 ribu
4755 33 Pribadi 330715 HS-grad 9 Married-civ-spouse Penjualan Suami Putih Laki-laki 0 0 55 Amerika Serikat <=50K
4413 44 State-gov 128586 Sarjana 13 Belum pernah menikah Pertanian-perikanan Tidak termasuk dalam keluarga Putih Laki-laki 0 0 40 Amerika Serikat <=50K

Ekspor input prediksi ke file JSON terbatas baris baru:

import json

with open('prediction_input.json', 'w') as json_file:
  for row in prediction_input.values.tolist():
    json.dump(row, json_file)
    json_file.write('\n')

Keluar dari penafsiran Python (exit()). Dari shell Anda, periksa prediction_input.json:

cat prediction_input.json
[0.9012127751273994, 1.0, 1.525541514460902, 2.0, 9.0, 0.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.43754385253479555, 38.0]
[-0.9221541171760282, 3.0, -0.4192650914017433, 4.0, 2.0, 3.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]
[-1.2138928199445767, 3.0, -0.030303770229214273, 4.0, 10.0, 1.0, 4.0, -0.14479173735784842, -0.21713186390175285, 1.5799792247041626, 38.0]
[-0.6304154144074798, 3.0, 0.35865755094331475, 4.0, 0.0, 3.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.6796466218034705, 38.0]
[-1.5056315227131252, 3.0, -1.5861490549193304, 4.0, 7.0, 3.0, 0.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]
[-0.11987268456252011, 5.0, 0.35865755094331475, 2.0, 2.0, 0.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.8410484679825871, 38.0]
[0.24480069389816542, 3.0, 1.525541514460902, 2.0, 9.0, 0.0, 4.0, -0.14479173735784842, -0.21713186390175285, 1.176474609256371, 6.0]
[0.0989313425138912, 1.0, 1.525541514460902, 2.0, 9.0, 0.0, 4.0, 0.8868473744801746, -0.21713186390175285, -0.03403923708700391, 38.0]
[0.39067004528243965, 5.0, -0.030303770229214273, 2.0, 4.0, 0.0, 4.0, -0.14479173735784842, -0.21713186390175285, 4.7273152251969375, 38.0]
[1.1200168022038106, 3.0, 1.1365801932883728, 2.0, 12.0, 0.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]
[-1.2868274956367138, 3.0, -0.030303770229214273, 4.0, 11.0, 3.0, 4.0, -0.14479173735784842, -0.21713186390175285, -1.6480576988781703, 38.0]
[-0.7033500900996169, 3.0, -0.4192650914017433, 2.0, 7.0, 5.0, 4.0, -0.14479173735784842, 4.5022796885373735, -0.43754385253479555, 38.0]
[0.5365393966667138, 3.0, 1.525541514460902, 4.0, 3.0, 4.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]
[-1.3597621713288508, 3.0, -0.4192650914017433, 4.0, 6.0, 3.0, 2.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]
[0.5365393966667138, 3.0, 1.1365801932883728, 0.0, 11.0, 2.0, 2.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]
[1.338820829280222, 3.0, -0.4192650914017433, 2.0, 2.0, 0.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]
[0.6824087480509881, 3.0, 1.1365801932883728, 0.0, 12.0, 3.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]
[0.0259966668217541, 3.0, 1.1365801932883728, 2.0, 11.0, 0.0, 4.0, -0.14479173735784842, -0.21713186390175285, 0.3694653783607877, 38.0]
[-0.4116113873310685, 3.0, -0.4192650914017433, 2.0, 11.0, 0.0, 4.0, -0.14479173735784842, -0.21713186390175285, 1.176474609256371, 38.0]
[0.39067004528243965, 6.0, 1.1365801932883728, 4.0, 4.0, 1.0, 4.0, -0.14479173735784842, -0.21713186390175285, -0.03403923708700391, 38.0]

Alat command line gcloud menerima JSON yang dibatasi baris baru untuk prediksi online, dan model Keras khusus ini mengharapkan daftar angka datar untuk setiap contoh input.

AI Platform memerlukan format yang berbeda saat Anda membuat permintaan prediksi online ke REST API tanpa menggunakan alat gcloud. Cara Anda menstrukturkan model juga dapat mengubah cara Anda harus memformat data untuk prediksi. Pelajari lebih lanjut cara memformat data untuk prediksi online.

Mengirim permintaan prediksi online

Gunakan gcloud untuk mengirimkan permintaan prediksi online:

gcloud ai-platform predict \
  --model $MODEL_NAME \
  --region $REGION \
  --version $MODEL_VERSION \
  --json-instances prediction_input.json
DENSE_4
[0.6854287385940552]
[0.011786997318267822]
[0.037236183881759644]
[0.016223609447479248]
[0.0012015104293823242]
[0.23621389269828796]
[0.6174039244651794]
[0.9822691679000854]
[0.3815768361091614]
[0.6715215444564819]
[0.001094043254852295]
[0.43077391386032104]
[0.22132840752601624]
[0.004075437784194946]
[0.22736871242523193]
[0.4111979305744171]
[0.27328649163246155]
[0.6981356143951416]
[0.3309604525566101]
[0.20807647705078125]

Karena lapisan terakhir model menggunakan fungsi sigmoid untuk aktivasinya, output antara 0 dan 0,5 mewakili prediksi negatif ("<=50K") dan output antara 0,5 dan 1 mewakili prediksi positif (">50K").

Mengembangkan model Keras dari awal

Pada tahap ini, Anda telah melatih model machine learning di AI Platform, men-deploy model terlatih sebagai resource versi di AI Platform, dan menerima prediksi online dari deployment. Bagian berikut akan menjelaskan cara membuat ulang kode Keras yang digunakan untuk melatih model Anda. Panduan ini membahas bagian-bagian berikut dalam mengembangkan model machine learning untuk digunakan dengan AI Platform:

  • Mendownload dan melakukan prapemrosesan data
  • Mendesain dan melatih model
  • Memvisualisasikan pelatihan dan mengekspor model yang dilatih

Meskipun bagian ini memberikan insight yang lebih mendetail tentang tugas yang diselesaikan di bagian sebelumnya, untuk mempelajari lebih lanjut cara menggunakan tf.keras, baca panduan TensorFlow untuk Keras. Untuk mempelajari lebih lanjut cara menyusun kode sebagai paket pelatihan untuk AI Platform, baca Mengemasan aplikasi pelatihan dan lihat kode pelatihan lengkap, yang disusun sebagai paket Python.

Mengimpor library dan menentukan konstanta

Pertama, impor library Python yang diperlukan untuk pelatihan:

import os
from six.moves import urllib
import tempfile

import numpy as np
import pandas as pd
import tensorflow as tf

# Examine software versions
print(__import__('sys').version)
print(tf.__version__)
print(tf.keras.__version__)

Kemudian, tentukan beberapa konstanta yang berguna:

  • Informasi untuk mendownload data pelatihan dan evaluasi
  • Informasi yang diperlukan Pandas untuk menafsirkan data dan mengonversi kolom kategoris menjadi fitur numerik
  • Hyperparameter untuk pelatihan, seperti kecepatan pembelajaran dan ukuran batch
### For downloading data ###

# Storage directory
DATA_DIR = os.path.join(tempfile.gettempdir(), 'census_data')

# Download options.
DATA_URL = 'https://storage.googleapis.com/cloud-samples-data/ai-platform' \
           '/census/data'
TRAINING_FILE = 'adult.data.csv'
EVAL_FILE = 'adult.test.csv'
TRAINING_URL = '%s/%s' % (DATA_URL, TRAINING_FILE)
EVAL_URL = '%s/%s' % (DATA_URL, EVAL_FILE)

### For interpreting data ###

# These are the features in the dataset.
# Dataset information: https://archive.ics.uci.edu/ml/datasets/census+income
_CSV_COLUMNS = [
    'age', 'workclass', 'fnlwgt', 'education', 'education_num',
    'marital_status', 'occupation', 'relationship', 'race', 'gender',
    'capital_gain', 'capital_loss', 'hours_per_week', 'native_country',
    'income_bracket'
]

_CATEGORICAL_TYPES = {
  'workclass': pd.api.types.CategoricalDtype(categories=[
    'Federal-gov', 'Local-gov', 'Never-worked', 'Private', 'Self-emp-inc',
    'Self-emp-not-inc', 'State-gov', 'Without-pay'
  ]),
  'marital_status': pd.api.types.CategoricalDtype(categories=[
    'Divorced', 'Married-AF-spouse', 'Married-civ-spouse',
    'Married-spouse-absent', 'Never-married', 'Separated', 'Widowed'
  ]),
  'occupation': pd.api.types.CategoricalDtype([
    'Adm-clerical', 'Armed-Forces', 'Craft-repair', 'Exec-managerial',
    'Farming-fishing', 'Handlers-cleaners', 'Machine-op-inspct',
    'Other-service', 'Priv-house-serv', 'Prof-specialty', 'Protective-serv',
    'Sales', 'Tech-support', 'Transport-moving'
  ]),
  'relationship': pd.api.types.CategoricalDtype(categories=[
    'Husband', 'Not-in-family', 'Other-relative', 'Own-child', 'Unmarried',
    'Wife'
  ]),
  'race': pd.api.types.CategoricalDtype(categories=[
    'Amer-Indian-Eskimo', 'Asian-Pac-Islander', 'Black', 'Other', 'White'
  ]),
  'native_country': pd.api.types.CategoricalDtype(categories=[
    'Cambodia', 'Canada', 'China', 'Columbia', 'Cuba', 'Dominican-Republic',
    'Ecuador', 'El-Salvador', 'England', 'France', 'Germany', 'Greece',
    'Guatemala', 'Haiti', 'Holand-Netherlands', 'Honduras', 'Hong', 'Hungary',
    'India', 'Iran', 'Ireland', 'Italy', 'Jamaica', 'Japan', 'Laos', 'Mexico',
    'Nicaragua', 'Outlying-US(Guam-USVI-etc)', 'Peru', 'Philippines', 'Poland',
    'Portugal', 'Puerto-Rico', 'Scotland', 'South', 'Taiwan', 'Thailand',
    'Trinadad&Tobago', 'United-States', 'Vietnam', 'Yugoslavia'
  ]),
  'income_bracket': pd.api.types.CategoricalDtype(categories=[
    '<=50K', '>50K'
  ])
}

# This is the label (target) we want to predict.
_LABEL_COLUMN = 'income_bracket'

### Hyperparameters for training ###

# This the training batch size
BATCH_SIZE = 128

# This is the number of epochs (passes over the full training data)
NUM_EPOCHS = 20

# Define learning rate.
LEARNING_RATE = .01

Mendownload dan melakukan prapemrosesan data

Mendownload data

Selanjutnya, tentukan fungsi untuk mendownload data pelatihan dan evaluasi. Fungsi ini juga memperbaiki ketidakteraturan kecil dalam pemformatan data.

def _download_and_clean_file(filename, url):
  """Downloads data from url, and makes changes to match the CSV format.

  The CSVs may use spaces after the comma delimters (non-standard) or include
  rows which do not represent well-formed examples. This function strips out
  some of these problems.

  Args:
    filename: filename to save url to
    url: URL of resource to download
  """
  temp_file, _ = urllib.request.urlretrieve(url)
  with tf.gfile.Open(temp_file, 'r') as temp_file_object:
    with tf.gfile.Open(filename, 'w') as file_object:
      for line in temp_file_object:
        line = line.strip()
        line = line.replace(', ', ',')
        if not line or ',' not in line:
          continue
        if line[-1] == '.':
          line = line[:-1]
        line += '\n'
        file_object.write(line)
  tf.gfile.Remove(temp_file)


def download(data_dir):
  """Downloads census data if it is not already present.

  Args:
    data_dir: directory where we will access/save the census data
  """
  tf.gfile.MakeDirs(data_dir)

  training_file_path = os.path.join(data_dir, TRAINING_FILE)
  if not tf.gfile.Exists(training_file_path):
    _download_and_clean_file(training_file_path, TRAINING_URL)

  eval_file_path = os.path.join(data_dir, EVAL_FILE)
  if not tf.gfile.Exists(eval_file_path):
    _download_and_clean_file(eval_file_path, EVAL_URL)

  return training_file_path, eval_file_path

Gunakan fungsi tersebut untuk mendownload data untuk pelatihan dan memverifikasi bahwa Anda memiliki file CSV untuk pelatihan dan evaluasi:

training_file_path, eval_file_path = download(DATA_DIR)

Selanjutnya, muat file ini menggunakan Pandas dan periksa datanya:

# This census data uses the value '?' for fields (column) that are missing data.
# We use na_values to find ? and set it to NaN values.
# https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

train_df = pd.read_csv(training_file_path, names=_CSV_COLUMNS, na_values='?')
eval_df = pd.read_csv(eval_file_path, names=_CSV_COLUMNS, na_values='?')

Tabel berikut menunjukkan kutipan data (train_df.head()) sebelum pemrosesan awal:

age workclass fnlwgt pendidikan education_num marital_status pekerjaan relationship ras gender capital_gain capital_loss hours_per_week native_country income_bracket
0 39 State-gov 77516 Sarjana 13 Belum pernah menikah Adm-clerical Tidak termasuk dalam keluarga Putih Laki-laki 2174 0 40 Amerika Serikat <=50K
1 50 Self-emp-not-inc 83311 Sarjana 13 Married-civ-spouse Eksekutif-pengelola Suami Putih Laki-laki 0 0 13 Amerika Serikat <=50K
2 38 Pribadi 215646 HS-grad 9 Bercerai Pengendali-pembersih Tidak termasuk dalam keluarga Putih Laki-laki 0 0 40 Amerika Serikat <=50K
3 53 Pribadi 234721 11 7 Married-civ-spouse Pengendali-pembersih Suami Hitam Laki-laki 0 0 40 Amerika Serikat <=50K
4 28 Pribadi 338409 Sarjana 13 Married-civ-spouse Prof-specialty Istri Hitam Perempuan 0 0 40 Kuba <=50K

Melakukan pra-pemrosesan data

Langkah prapemrosesan pertama menghapus fitur tertentu dari data dan mengonversi fitur kategoris menjadi nilai numerik untuk digunakan dengan Keras.

Pelajari lebih lanjut engineering fitur dan bias dalam data.

UNUSED_COLUMNS = ['fnlwgt', 'education', 'gender']


def preprocess(dataframe):
  """Converts categorical features to numeric. Removes unused columns.

  Args:
    dataframe: Pandas dataframe with raw data

  Returns:
    Dataframe with preprocessed data
  """
  dataframe = dataframe.drop(columns=UNUSED_COLUMNS)

  # Convert integer valued (numeric) columns to floating point
  numeric_columns = dataframe.select_dtypes(['int64']).columns
  dataframe[numeric_columns] = dataframe[numeric_columns].astype('float32')

  # Convert categorical columns to numeric
  cat_columns = dataframe.select_dtypes(['object']).columns
  dataframe[cat_columns] = dataframe[cat_columns].apply(lambda x: x.astype(
    _CATEGORICAL_TYPES[x.name]))
  dataframe[cat_columns] = dataframe[cat_columns].apply(lambda x: x.cat.codes)
  return dataframe

prepped_train_df = preprocess(train_df)
prepped_eval_df = preprocess(eval_df)

Tabel berikut (prepped_train_df.head()) menunjukkan bagaimana prapemrosesan mengubah data. Perhatikan secara khusus bahwa income_bracket, label yang Anda gunakan untuk melatih model agar dapat memprediksi, telah berubah dari <=50K dan >50K menjadi 0 dan 1:

age workclass education_num marital_status pekerjaan relationship ras capital_gain capital_loss hours_per_week native_country income_bracket
0 39,0 6 13.0 4 0 1 4 2174,0 0,0 40,0 38 0
1 50,0 5 13.0 2 3 0 4 0,0 0,0 13.0 38 0
2 38,0 3 9.0 0 5 1 4 0,0 0,0 40,0 38 0
3 53,0 3 7.0 2 5 0 2 0,0 0,0 40,0 38 0
4 28,0 3 13.0 2 9 5 2 0,0 0,0 40,0 4 0

Selanjutnya, pisahkan data menjadi fitur ("x") dan label ("y"), lalu ubah bentuk array label menjadi format untuk digunakan dengan tf.data.Dataset nanti:

# Split train and test data with labels.
# The pop() method will extract (copy) and remove the label column from the dataframe
train_x, train_y = prepped_train_df, prepped_train_df.pop(_LABEL_COLUMN)
eval_x, eval_y = prepped_eval_df, prepped_eval_df.pop(_LABEL_COLUMN)

# Reshape label columns for use with tf.data.Dataset
train_y = np.asarray(train_y).astype('float32').reshape((-1, 1))
eval_y = np.asarray(eval_y).astype('float32').reshape((-1, 1))

Menskalakan data pelatihan sehingga setiap kolom fitur numerik memiliki nilai rata-rata 0 dan deviasi standar 1 dapat meningkatkan kualitas model Anda.

Dalam sistem produksi, Anda mungkin ingin menyimpan mean dan deviasi standar dari set pelatihan dan menggunakannya untuk melakukan transformasi yang identik pada data pengujian pada waktu prediksi. Untuk memudahkan dalam latihan ini, sementara gabungkan data pelatihan dan evaluasi untuk menskalakan semuanya:

def standardize(dataframe):
  """Scales numerical columns using their means and standard deviation to get
  z-scores: the mean of each numerical column becomes 0, and the standard
  deviation becomes 1. This can help the model converge during training.

  Args:
    dataframe: Pandas dataframe

  Returns:
    Input dataframe with the numerical columns scaled to z-scores
  """
  dtypes = list(zip(dataframe.dtypes.index, map(str, dataframe.dtypes)))
  # Normalize numeric columns.
  for column, dtype in dtypes:
      if dtype == 'float32':
          dataframe[column] -= dataframe[column].mean()
          dataframe[column] /= dataframe[column].std()
  return dataframe


# Join train_x and eval_x to normalize on overall means and standard
# deviations. Then separate them again.
all_x = pd.concat([train_x, eval_x], keys=['train', 'eval'])
all_x = standardize(all_x)
train_x, eval_x = all_x.xs('train'), all_x.xs('eval')

Tabel berikutnya (train_x.head()) menunjukkan tampilan data yang telah dipraproses sepenuhnya:

age workclass education_num marital_status pekerjaan relationship ras capital_gain capital_loss hours_per_week native_country
0 0,025997 6 1,136580 4 0 1 4 0,146933 -0,217132 -0,034039 38
1 0,828278 5 1,136580 2 3 0 4 -0,144792 -0,217132 -2,212964 38
2 -0,046938 3 -0,419265 0 5 1 4 -0,144792 -0,217132 -0,034039 38
3 1,047082 3 -1,197188 2 5 0 2 -0,144792 -0,217132 -0,034039 38
4 -0,776285 3 1,136580 2 9 5 2 -0,144792 -0,217132 -0,034039 4

Mendesain dan melatih model

Membuat set data pelatihan dan validasi

Buat fungsi input untuk mengonversi fitur dan label menjadi tf.data.Dataset untuk pelatihan atau evaluasi:

def input_fn(features, labels, shuffle, num_epochs, batch_size):
  """Generates an input function to be used for model training.

  Args:
    features: numpy array of features used for training or inference
    labels: numpy array of labels for each example
    shuffle: boolean for whether to shuffle the data or not (set True for
      training, False for evaluation)
    num_epochs: number of epochs to provide the data for
    batch_size: batch size for training

  Returns:
    A tf.data.Dataset that can provide data to the Keras model for training or
      evaluation
  """
  if labels is None:
    inputs = features
  else:
    inputs = (features, labels)
  dataset = tf.data.Dataset.from_tensor_slices(inputs)

  if shuffle:
    dataset = dataset.shuffle(buffer_size=len(features))

  # We call repeat after shuffling, rather than before, to prevent separate
  # epochs from blending together.
  dataset = dataset.repeat(num_epochs)
  dataset = dataset.batch(batch_size)
  return dataset

Selanjutnya, buat set data pelatihan dan evaluasi ini.Gunakan hyperparameter NUM_EPOCHS dan BATCH_SIZE yang ditentukan sebelumnya untuk menentukan cara set data pelatihan memberikan contoh ke model selama pelatihan. Siapkan set data validasi untuk menyediakan semua contohnya dalam satu batch, untuk satu langkah validasi di akhir setiap iterasi pelatihan.

# Pass a numpy array by using DataFrame.values
training_dataset = input_fn(features=train_x.values,
                    labels=train_y,
                    shuffle=True,
                    num_epochs=NUM_EPOCHS,
                    batch_size=BATCH_SIZE)

num_eval_examples = eval_x.shape[0]

# Pass a numpy array by using DataFrame.values
validation_dataset = input_fn(features=eval_x.values,
                    labels=eval_y,
                    shuffle=False,
                    num_epochs=NUM_EPOCHS,
                    batch_size=num_eval_examples)

Mendesain Model Keras

Desain jaringan saraf Anda menggunakan Keras Sequential API.

Jaringan neural dalam (DNN) ini memiliki beberapa lapisan tersembunyi, dan lapisan terakhir menggunakan fungsi aktivasi sigmoid untuk menghasilkan nilai antara 0 dan 1:

  • Lapisan input memiliki 100 unit yang menggunakan fungsi aktivasi ReLU.
  • Lapisan tersembunyi memiliki 75 unit yang menggunakan fungsi aktivasi ReLU.
  • Lapisan tersembunyi memiliki 50 unit yang menggunakan fungsi aktivasi ReLU.
  • Lapisan tersembunyi memiliki 25 unit yang menggunakan fungsi aktivasi ReLU.
  • Lapisan output memiliki 1 unit menggunakan fungsi aktivasi sigmoid.
  • Pengoptimal menggunakan fungsi kerugian entropi silang biner, yang sesuai untuk masalah klasifikasi biner seperti ini.

Jangan ragu untuk mengubah lapisan ini untuk mencoba meningkatkan model:

def create_keras_model(input_dim, learning_rate):
  """Creates Keras Model for Binary Classification.

  Args:
    input_dim: How many features the input has
    learning_rate: Learning rate for training

  Returns:
    The compiled Keras model (still needs to be trained)
  """
  Dense = tf.keras.layers.Dense
  model = tf.keras.Sequential(
    [
        Dense(100, activation=tf.nn.relu, kernel_initializer='uniform',
                input_shape=(input_dim,)),
        Dense(75, activation=tf.nn.relu),
        Dense(50, activation=tf.nn.relu),
        Dense(25, activation=tf.nn.relu),
        Dense(1, activation=tf.nn.sigmoid)
    ])

  # Custom Optimizer:
  # https://www.tensorflow.org/api_docs/python/tf/train/RMSPropOptimizer
  optimizer = tf.keras.optimizers.RMSprop(
      lr=learning_rate)

  # Compile Keras model
  model.compile(
      loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
  return model

Selanjutnya, buat objek model Keras:

num_train_examples, input_dim = train_x.shape
print('Number of features: {}'.format(input_dim))
print('Number of examples: {}'.format(num_train_examples))

keras_model = create_keras_model(
    input_dim=input_dim,
    learning_rate=LEARNING_RATE)

Memeriksa model dengan keras_model.summary() akan menampilkan sesuatu seperti:

Number of features: 11
Number of examples: 32561
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 100)               1200      
_________________________________________________________________
dense_1 (Dense)              (None, 75)                7575      
_________________________________________________________________
dense_2 (Dense)              (None, 50)                3800      
_________________________________________________________________
dense_3 (Dense)              (None, 25)                1275      
_________________________________________________________________
dense_4 (Dense)              (None, 1)                 26        
=================================================================
Total params: 13,876
Trainable params: 13,876
Non-trainable params: 0
_________________________________________________________________

Melatih dan mengevaluasi model

Tentukan penurunan laju belajar untuk mendorong parameter model membuat perubahan yang lebih kecil seiring pelatihan berlangsung:

# Setup Learning Rate decay.
lr_decay_cb = tf.keras.callbacks.LearningRateScheduler(
    lambda epoch: LEARNING_RATE + 0.02 * (0.5 ** (1 + epoch)),
    verbose=True)

# Setup TensorBoard callback.
JOB_DIR = os.getenv('JOB_DIR')
tensorboard_cb = tf.keras.callbacks.TensorBoard(
      os.path.join(JOB_DIR, 'keras_tensorboard'),
      histogram_freq=1)

Terakhir, latih model. Berikan steps_per_epoch yang sesuai agar model dapat dilatih di seluruh set data pelatihan (dengan contoh BATCH_SIZE per langkah) selama setiap epoch. Dan instruksikan model untuk menghitung akurasi validasi dengan satu batch validasi besar di akhir setiap iterasi pelatihan.

history = keras_model.fit(training_dataset,
                          epochs=NUM_EPOCHS,
                          steps_per_epoch=int(num_train_examples/BATCH_SIZE),
                          validation_data=validation_dataset,
                          validation_steps=1,
                          callbacks=[lr_decay_cb, tensorboard_cb],
                          verbose=1)

Progres pelatihan mungkin terlihat seperti berikut:

WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.

Epoch 00001: LearningRateScheduler reducing learning rate to 0.02.
Epoch 1/20
254/254 [==============================] - 1s 5ms/step - loss: 0.6986 - acc: 0.7893 - val_loss: 0.3894 - val_acc: 0.8329

Epoch 00002: LearningRateScheduler reducing learning rate to 0.015.
Epoch 2/20
254/254 [==============================] - 1s 4ms/step - loss: 0.3574 - acc: 0.8335 - val_loss: 0.3861 - val_acc: 0.8131

...

Epoch 00019: LearningRateScheduler reducing learning rate to 0.010000038146972657.
Epoch 19/20
254/254 [==============================] - 1s 4ms/step - loss: 0.3239 - acc: 0.8512 - val_loss: 0.3334 - val_acc: 0.8496

Epoch 00020: LearningRateScheduler reducing learning rate to 0.010000019073486329.
Epoch 20/20
254/254 [==============================] - 1s 4ms/step - loss: 0.3279 - acc: 0.8504 - val_loss: 0.3174 - val_acc: 0.8523

Memvisualisasikan pelatihan dan mengekspor model terlatih

Memvisualisasikan pelatihan

Impor matplotlib untuk memvisualisasikan cara model belajar selama periode pelatihan. (Jika perlu, instal terlebih dahulu dengan pip install matplotlib.)

from matplotlib import pyplot as plt

Buat plot kerugian (entropi silang biner) dan akurasi model, seperti yang diukur di akhir setiap iterasi pelatihan:

# Visualize History for Loss.
plt.title('Keras model loss')
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['training', 'validation'], loc='upper right')
plt.show()

# Visualize History for Accuracy.
plt.title('Keras model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.legend(['training', 'validation'], loc='lower right')
plt.show()

Seiring waktu, kerugian menurun dan akurasi meningkat. Namun, apakah nilai tersebut berkonvergensi ke level yang stabil? Apakah ada perbedaan besar antara metrik pelatihan dan validasi (tanda overfitting)?

Pelajari cara meningkatkan kualitas model machine learning. Kemudian, jangan ragu untuk menyesuaikan hyperparameter atau arsitektur model dan melatihnya lagi.

Mengekspor model untuk penayangan

Gunakan tf.contrib.saved_model.save_keras_model untuk mengekspor direktori SavedModel TensorFlow. Ini adalah format yang diperlukan AI Platform saat Anda membuat resource versi model.

Karena tidak semua pengoptimal dapat diekspor ke format SavedModel, Anda mungkin melihat peringatan selama proses ekspor. Selama Anda berhasil mengekspor grafik penayangan, AI Platform dapat menggunakan SavedModel untuk menampilkan prediksi.

# Export the model to a local SavedModel directory
export_path = tf.contrib.saved_model.save_keras_model(keras_model, 'keras_export')
print("Model exported to: ", export_path)
WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.
For more information, please see:
  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
  * https://github.com/tensorflow/addons
If you depend on functionality not listed there, please file an issue.

WARNING:tensorflow:This model was compiled with a Keras optimizer (<tensorflow.python.keras.optimizers.RMSprop object at 0x7fc198c4e400>) but is being saved in TensorFlow format with `save_weights`. The model's weights will be saved, but unlike with TensorFlow optimizers in the TensorFlow format the optimizer's state will not be saved.

Consider using a TensorFlow optimizer from `tf.train`.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py:1436: update_checkpoint_state (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.train.CheckpointManager to manage checkpoints rather than manually editing the Checkpoint proto.
WARNING:tensorflow:Model was compiled with an optimizer, but the optimizer is not from `tf.train` (e.g. `tf.train.AdagradOptimizer`). Only the serving graph was exported. The train and evaluate graphs were not added to the SavedModel.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:205: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['serving_default']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: keras_export/1553710367/saved_model.pb
Model exported to:  b'keras_export/1553710367'

Anda dapat mengekspor direktori SavedModel ke sistem file lokal atau ke Cloud Storage, selama Anda memiliki izin yang diperlukan. Di lingkungan saat ini, Anda telah memberikan akses ke Cloud Storage dengan mengautentikasi akun Google Cloud dan menetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS. Tugas pelatihan AI Platform juga dapat diekspor langsung ke Cloud Storage, karena akun layanan AI Platform memiliki akses ke bucket Cloud Storage dalam projectnya sendiri.

Coba ekspor langsung ke Cloud Storage:

JOB_DIR = os.getenv('JOB_DIR')

# Export the model to a SavedModel directory in Cloud Storage
export_path = tf.contrib.saved_model.save_keras_model(keras_model, JOB_DIR + '/keras_export')
print("Model exported to: ", export_path)
WARNING:tensorflow:This model was compiled with a Keras optimizer (<tensorflow.python.keras.optimizers.RMSprop object at 0x7fc198c4e400>) but is being saved in TensorFlow format with `save_weights`. The model's weights will be saved, but unlike with TensorFlow optimizers in the TensorFlow format the optimizer's state will not be saved.

Consider using a TensorFlow optimizer from `tf.train`.
WARNING:tensorflow:Model was compiled with an optimizer, but the optimizer is not from `tf.train` (e.g. `tf.train.AdagradOptimizer`). Only the serving graph was exported. The train and evaluate graphs were not added to the SavedModel.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['serving_default']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: gs://your-bucket-name/keras-job-dir/keras_export/1553710379/saved_model.pb
Model exported to:  b'gs://your-bucket-name/keras-job-dir/keras_export/1553710379'

Sekarang Anda dapat men-deploy model ini ke AI Platform dan menayangkan prediksi dengan mengikuti langkah-langkah dari panduan memulai untuk prediksi.

Pembersihan

Untuk membersihkan semua resource Google Cloud yang digunakan dalam project ini, Anda dapat menghapus project Google Cloud yang digunakan untuk tutorial.

Atau, Anda dapat mengosongkan resource individual dengan menjalankan perintah berikut:

# Delete model version resource
gcloud ai-platform versions delete $MODEL_VERSION --quiet --model $MODEL_NAME

# Delete model resource
gcloud ai-platform models delete $MODEL_NAME --quiet

# Delete Cloud Storage objects that were created
gsutil -m rm -r $JOB_DIR

# If training job is still running, cancel it
gcloud ai-platform jobs cancel $JOB_NAME --quiet

Jika bucket Cloud Storage Anda tidak berisi objek lain dan Anda ingin menghapusnya, jalankan gsutil rm -r gs://$BUCKET_NAME.

Apa langkah selanjutnya?

  • Lihat kode pelatihan lengkap yang digunakan dalam panduan ini, yang menyusun kode untuk menerima hyperparameter kustom sebagai flag command line.
  • Baca tentang kode paket untuk tugas pelatihan AI Platform.
  • Baca tentang men-deploy model untuk menayangkan prediksi.