Jalankan tutorial ini sebagai notebook di Colab | Lihat notebook di GitHub |
Tutorial ini menunjukkan cara melatih jaringan neural pada AI Platform menggunakan Kera sekuensial API dan cara menyajikan prediksi dari model tersebut.
Keras adalah API tingkat tinggi untuk membangun dan melatih model deep learning. tf.keras adalah implementasi TensorFlow untuk API ini.
Dua bagian pertama tutorial ini akan memandu Anda dalam melatih model di AI Platform menggunakan kode Keras yang telah ditulis sebelumnya, men-deploy model terlatih ke AI Platform, dan menyajikan 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 Sensus Pendapatan Amerika Serikat yang disediakan oleh Repositori UC Irvine Machine Learning. Set data ini berisi informasi tentang orang-orang dari database Sensus tahun 1994, termasuk usia, pendidikan, status perkawinan, pekerjaan, dan apakah penghasilan mereka lebih dari $50.000 per tahun atau tidak.
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 lain tentang orang tersebut (fitur).
Tutorial ini lebih berfokus pada penggunaan model ini dengan AI Platform daripada 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 lebih umum.
Biaya
Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih (Google Cloud):
- AI Platform Training
- AI Platform Prediction
- Cloud Storage
Pelajari harga Pelatihan AI Platform, harga Prediksi AI Platform, dan harga Cloud Storage, dan gunakan Kalkulator Harga untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda.
Sebelum memulai
Anda harus melakukan beberapa hal sebelum dapat melatih dan men-deploy model di AI Platform:
- Menyiapkan lingkungan pengembangan lokal Anda.
- Siapkan project Google Cloud dengan penagihan dan API yang diperlukan telah diaktifkan.
- Buat bucket Cloud Storage untuk menyimpan paket pelatihan dan model yang Anda latih.
Menyiapkan lingkungan pengembangan lokal
Anda memerlukan hal berikut untuk menyelesaikan tutorial ini:
- Git
- Python 3
- Virtualenv
- Google Cloud SDK
Panduan Google Cloud untuk Menyiapkan lingkungan pengembangan Python menyediakan petunjuk mendetail untuk memenuhi persyaratan ini. Langkah-langkah berikut memberikan serangkaian petunjuk ringkas:
Instal virtualenv dan buat lingkungan virtual yang menggunakan Python 3.
Aktifkan lingkungan tersebut.
Selesaikan langkah-langkah di bagian berikut untuk menginstal Google Cloud SDK.
Menyiapkan project Google Cloud Anda
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Aktifkan API AI Platform Training & Prediction and Compute Engine.
- Menginstal Google Cloud CLI.
-
Untuk initialize gcloud CLI, jalankan perintah berikut:
gcloud init
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Aktifkan API AI Platform Training & Prediction and Compute Engine.
- Menginstal Google Cloud CLI.
-
Untuk initialize gcloud CLI, jalankan perintah berikut:
gcloud init
Mengautentikasi akun GCP Anda
Untuk menyiapkan autentikasi, Anda harus membuat kunci akun layanan dan menetapkan variabel lingkungan untuk jalur file ke kunci akun layanan.
-
Buat akun layanan:
-
Di konsol Google Cloud, buka halaman Buat akun layanan.
- Di kolom Nama akun layanan, masukkan nama.
- Opsional: Di kolom Deskripsi akun layanan, masukkan deskripsi.
- Klik Create.
- Klik kolom Pilih peran. Di bagian Semua peran, pilih AI Platform > AI Platform Admin.
- Klik Add another role.
-
Klik kolom Pilih peran. Di bagian All roles, pilih Storage > Storage Object Admin.
-
Klik Selesai untuk membuat akun layanan.
Jangan tutup jendela browser Anda. Anda akan menggunakannya pada langkah berikutnya.
-
-
Membuat kunci akun layanan untuk autentikasi:
- Di konsol Google Cloud, klik alamat email untuk akun layanan yang telah dibuat.
- Klik Kunci.
- Klik Tambahkan kunci, lalu Buat kunci baru.
- Klik Create. File kunci JSON akan didownload ke komputer Anda.
- Klik Close.
-
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 mengirim tugas pelatihan menggunakan Cloud SDK, Anda mengupload paket Python yang berisi kode pelatihan Anda 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. Selanjutnya, Anda dapat membuat versi model AI Platform berdasarkan output ini untuk menyalurkan prediksi online.
Tetapkan nama bucket Cloud Storage sebagai variabel lingkungan. Nama ini harus unik di semua bucket Cloud Storage:
BUCKET_NAME="your-bucket-name"
Pilih region tempat AI Platform Training dan AI Platform Prediction 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
Panduan memulai untuk pelatihan di AI Platform
Bagian tutorial ini akan menuntun Anda dalam mengirimkan tugas pelatihan ke AI Platform. Tugas ini menjalankan kode sampel yang menggunakan Keras untuk melatih jaringan deep neural pada data Sensus Amerika Serikat. Tindakan ini menghasilkan model terlatih sebagai direktori TersimpanModel 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 akan diprainstal berdasarkan versi runtime yang Anda pilih.
Melatih model Anda secara lokal
Sebelum melakukan pelatihan di AI Platform, latih tugas secara lokal untuk memverifikasi struktur file dan paket sudah benar.
Untuk tugas yang kompleks atau intensif resource, sebaiknya Anda berlatih secara lokal pada sampel kecil set data untuk memverifikasi kode. 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 akan mengekspor model yang dilatih dan mencetak pesan seperti berikut:
Model exported to: local-training-output/keras_export/1553709223
Melatih model Anda menggunakan AI Platform
Selanjutnya, kirim tugas pelatihan ke AI Platform. Tindakan ini akan menjalankan modul pelatihan di cloud dan mengekspor model yang dilatih ke Cloud Storage.
Pertama, beri nama tugas pelatihan Anda dan pilih direktori dalam bucket Cloud Storage untuk menyimpan file perantara dan output. Tetapkan 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 instruksikan 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 Google Cloud Console.
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
Ini mungkin memerlukan waktu lebih lama daripada pelatihan lokal, tetapi Anda dapat mengamati progres pelatihan di shell dengan cara yang sama. Pada akhirnya, tugas pelatihan mengekspor model yang dilatih 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 pembelajaran untuk pelatihan
melalui beberapa uji coba guna memaksimalkan akurasi.
Dalam contoh ini, kode pelatihan menggunakan callback TensorBoard, yang membuat Event
Summary
TensorFlow selama pelatihan. AI Platform menggunakan peristiwa ini untuk melacak metrik
yang ingin Anda optimalkan. Pelajari penyelarasan hyperparameter dalam Pelatihan AI Platform lebih lanjut.
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 kelompok pendapatan seseorang dari informasi Sensus lainnya tentang mereka.
Membuat resource model dan versi di AI Platform
Untuk menayangkan prediksi online menggunakan model yang telah Anda latih dan ekspor dalam panduan panduan memulai untuk pelatihan, buat resource model di AI Platform dan resource versi di dalamnya. Resource versi adalah resource yang menggunakan model terlatih Anda untuk menayangkan prediksi. Struktur ini memungkinkan Anda menyesuaikan dan melatih ulang model berkali-kali dan mengatur semua versi bersama-sama dalam 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 panduan memulai untuk pelatihan mengekspor direktori TersimpanModel TensorFlow yang diberi stempel waktu ke bucket Cloud Storage Anda. AI Platform menggunakan direktori ini untuk membuat versi model. Pelajari SavedModel dan AI Platform lebih lanjut.
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 direktoriSavedModel Anda dan gunakan 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 prapemrosesan input untuk prediksi dengan cara yang sama seperti data pelatihan yang telah diproses sebelumnya. Dalam sistem produksi, Anda mungkin ingin membuat pipeline pra-pemrosesan yang dapat digunakan secara unik pada waktu pelatihan dan waktu prediksi.
Untuk latihan ini, gunakan kode pemuatan data paket pelatihan untuk memilih sampel acak dari data evaluasi. Data ini tersedia dalam bentuk yang digunakan untuk mengevaluasi akurasi setelah setiap epoch pelatihan, sehingga dapat digunakan untuk mengirim prediksi pengujian tanpa pra-pemrosesan lebih lanjut.
Buka penafsir Python (python
) dari direktori kerja 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
usia | kelas kerja | education_num | marital_status | pekerjaan | hubungan | 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
menjadi bilangan bulat (dengan pemetaan yang sama seperti yang digunakan untuk pelatihan). Kolom numerik, seperti age
, telah diskalakan ke z-score.
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]
usia | kelas kerja | fnlwgt | pendidikan | education_num | marital_status | pekerjaan | hubungan | ras | jenis kelamin | capital_gain | capital_loss | hours_per_week | native_country | income_bracket | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1979 | 51 | Pemerintah lokal | 99064 | Master | 14 | Menikah-suami istri | Spesialisasi prof | Suami | Putih | Laki-laki | 0 | 0 | 35 | Amerika Serikat | <=50 RB |
2430 | 26 | Pribadi | 197967 | HS-grad | 9 | Belum menikah | Perbaikan kerajinan | Anak sendiri | Putih | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
4214 | 22 | Pribadi | 221694 | Beberapa perguruan tinggi | 10 | Belum menikah | Layanan perlindungan | Tidak cocok bagi keluarga | Putih | Laki-laki | 0 | 0 | 60 | Amerika Serikat | <=50 RB |
10389 | 30 | Pribadi | 96480 | Assoc-voc | 11 | Belum menikah | ADM | Anak sendiri | Putih | Perempuan | 0 | 0 | 32 | Amerika Serikat | <=50 RB |
14525 | 18 | Pribadi | 146225 | 10 | 6 | Belum menikah | Layanan lainnya | Anak sendiri | Amer-India-Eskimo | Perempuan | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
15040 | 37 | Self-emp-not-inc | 50096 | Assoc-voc | 11 | Menikah-suami istri | Perbaikan kerajinan | Suami | Putih | Laki-laki | 0 | 0 | 30 | Amerika Serikat | <=50 RB |
8409 | 42 | Pribadi | 102988 | Master | 14 | Menikah-suami istri | Spesialisasi prof | Suami | Putih | Laki-laki | 0 | 0 | 55 | Ekuador | >50 RB |
10628 | 40 | Pemerintah lokal | 284086 | Master | 14 | Menikah-suami istri | Spesialisasi prof | Suami | Putih | Laki-laki | 7688 | 0 | 40 | Amerika Serikat | >50 RB |
10942 | 44 | Self-emp-not-inc | 52505 | Beberapa perguruan tinggi | 10 | Menikah-suami istri | Pemancingan pertanian | Suami | Putih | Laki-laki | 0 | 0 | 99 | Amerika Serikat | <=50 RB |
5129 | 54 | Pribadi | 106728 | Sarjana | 13 | Menikah-suami istri | Dukungan teknis | Suami | Putih | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
2096 | 21 | Pribadi | 190916 | Beberapa perguruan tinggi | 10 | Belum menikah | Penjualan | Anak sendiri | Putih | Perempuan | 0 | 0 | 20 | Amerika Serikat | <=50 RB |
12463 | 29 | Pribadi | 197565 | HS-grad | 9 | Menikah-suami istri | Layanan lain | Istri | Putih | Perempuan | 0 | 1902 | 35 | Amerika Serikat | >50 RB |
8528 | 46 | Pribadi | 193188 | Master | 14 | Belum menikah | Eksekutif | Belum Menikah | Putih | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
7093 | 20 | Pribadi | 273147 | HS-grad | 9 | Belum menikah | Peluang mesin | Anak sendiri | Hitam | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
12565 | 46 | Pribadi | 203653 | Sarjana | 13 | Bercerai | Penjualan | Kerabat lain | Hitam | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
5655 | 57 | Pribadi | 174662 | HS-grad | 9 | Menikah-suami istri | Perbaikan kerajinan | Suami | Putih | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
2322 | 48 | Pribadi | 232149 | Sarjana | 13 | Bercerai | Dukungan teknis | Anak sendiri | Putih | Perempuan | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
12652 | 39 | Pribadi | 82521 | Sarjana | 13 | Menikah-suami istri | Penjualan | Suami | Putih | Laki-laki | 0 | 0 | 45 | Amerika Serikat | >50 RB |
4755 | 33 | Pribadi | 330715 | HS-grad | 9 | Menikah-suami istri | Penjualan | Suami | Putih | Laki-laki | 0 | 0 | 55 | Amerika Serikat | <=50 RB |
4413 | 44 | Pemerintah negara bagian | 128586 | Sarjana | 13 | Belum menikah | Pemancingan pertanian | Tidak cocok bagi keluarga | Putih | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
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 penafsir 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 yang tetap 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 menyusun model juga dapat mengubah cara memformat data untuk prediksi.
Pelajari lebih lanjut cara memformat data untuk prediksi online.
Mengirimkan permintaan prediksi online
Gunakan gcloud
untuk mengirimkan permintaan prediksi online Anda:
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 berikutnya membahas pembuatan ulang kode Keras yang digunakan untuk melatih model Anda. Panduan ini mencakup bagian-bagian berikut dalam pengembangan model machine learning untuk digunakan dengan AI Platform:
- Mendownload dan melakukan pra-pemrosesan data
- Mendesain dan melatih model
- Memvisualisasikan pelatihan dan mengekspor model yang dilatih
Meskipun bagian ini memberikan insight 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 struktur kode sebagai paket pelatihan untuk
AI Platform, baca Mengemas aplikasi
pelatihan
dan merujuk ke 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 kategori menjadi fitur numerik
- Hyperparameter untuk pelatihan, seperti kecepatan pemelajaran 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 guna mendownload data untuk pelatihan dan memastikan 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 nukilan data (train_df.head()
) sebelum
prapemrosesan:
usia | kelas kerja | fnlwgt | pendidikan | education_num | marital_status | pekerjaan | hubungan | ras | jenis kelamin | capital_gain | capital_loss | hours_per_week | native_country | income_bracket | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 39 | Pemerintah negara bagian | 77516 | Sarjana | 13 | Belum menikah | ADM | Tidak cocok bagi keluarga | Putih | Laki-laki | 2174 | 0 | 40 | Amerika Serikat | <=50 RB |
1 | 50 | Self-emp-not-inc | 83311 | Sarjana | 13 | Menikah-suami istri | Eksekutif | Suami | Putih | Laki-laki | 0 | 0 | 13 | Amerika Serikat | <=50 RB |
2 | 38 | Pribadi | 215646 | HS-grad | 9 | Bercerai | Pengendali pembersih | Tidak cocok bagi keluarga | Putih | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
3 | 53 | Pribadi | 234721 | 11 | 7 | Menikah-suami istri | Pengendali pembersih | Suami | Hitam | Laki-laki | 0 | 0 | 40 | Amerika Serikat | <=50 RB |
4 | 28 | Pribadi | 338409 | Sarjana | 13 | Menikah-suami istri | Spesialisasi prof | Istri | Hitam | Perempuan | 0 | 0 | 40 | Kuba | <=50 RB |
Melakukan pra-pemrosesan data
Langkah pra-pemrosesan pertama menghapus fitur tertentu dari data dan mengonversi fitur kategoris menjadi nilai numerik untuk digunakan dengan Keras.
Pelajari rekayasa fitur dan bias dalam data lebih lanjut.
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 cara pra-pemrosesan mengubah
data. Perhatikan secara khusus bahwa income_bracket
, label yang Anda latih model untuk diprediksi, telah berubah dari <=50K
dan >50K
menjadi 0
dan 1
:
usia | kelas kerja | education_num | marital_status | pekerjaan | hubungan | 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 bentuk ulang array label ke dalam 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 rata-rata 0 dan deviasi standar 1 dapat meningkatkan kualitas model Anda.
Dalam sistem produksi, Anda mungkin ingin menyimpan sarana dan deviasi standar dari set pelatihan dan menggunakannya untuk melakukan transformasi yang sama pada data pengujian pada waktu prediksi. Untuk memudahkan latihan ini, gabungkan data pelatihan dan evaluasi untuk sementara guna 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 diproses sebelumnya:
usia | kelas kerja | education_num | marital_status | pekerjaan | hubungan | 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 untuk model selama pelatihan. Siapkan set data validasi untuk memberikan semua contohnya dalam satu batch, untuk satu langkah validasi di akhir setiap epoch 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 neural 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 ULT.
- Lapisan tersembunyi memiliki 75 unit yang menggunakan fungsi aktivasi ULT.
- Lapisan tersembunyi memiliki 50 unit yang menggunakan fungsi aktivasi ULT.
- Lapisan tersembunyi memiliki 25 unit yang menggunakan fungsi aktivasi ULT.
- Lapisan output memiliki 1 unit yang 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 memperbaiki 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)
Pemeriksaan model dengan keras_model.summary()
akan menampilkan hasil 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 peluruhan kecepatan pemelajaran untuk mendorong parameter model melakukan perubahan lebih kecil saat 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 untuk model yang akan dilatih di seluruh set data pelatihan (dengan contoh BATCH_SIZE
per langkah) selama setiap epoch. Lalu, instruksikan model untuk menghitung akurasi validasi
dengan satu batch validasi besar di akhir setiap epoch.
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 akan 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 yang dilatih
Memvisualisasikan pelatihan
Impor matplotlib
untuk memvisualisasikan cara model mempelajari periode pelatihan.
(Jika perlu, instal terlebih dahulu dengan pip install matplotlib
.)
from matplotlib import pyplot as plt
Tandai kerugian (entropi silang biner) dan akurasi model, yang diukur di akhir setiap epoch 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 berkurang dan akurasi meningkat. Tetapi apakah mereka menyatu ke tingkat yang stabil? Apakah ada perbedaan besar antara metrik pelatihan dan validasi (tanda-tanda overfit)?
Pelajari cara meningkatkan kualitas model machine learning Anda. Kemudian, Anda dapat menyesuaikan hyperparameter atau arsitektur model dan berlatih lagi.
Mengekspor model untuk penayangan
Gunakan tf.contrib.saved_model.save_keras_model untuk mengekspor direktori TensorFlowSavedModel. Ini adalah format yang diperlukan AI Platform saat Anda membuat resource versi model.
Karena tidak semua pengoptimal dapat diekspor ke formatSavedModel, Anda mungkin melihat peringatan selama proses ekspor. Selama Anda berhasil mengekspor grafik penayangan, AI Platform dapat menggunakanSavedModel 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 direktoriSavedModel ke sistem file lokal atau ke Cloud Storage, selama Anda memiliki izin yang diperlukan. Di lingkungan Anda saat ini, Anda 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 di project-nya 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'
Anda kini dapat men-deploy model ini ke AI Platform dan menyalurkan 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 membersihkan resource satu per satu 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 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 kode kemasan untuk tugas pelatihan AI Platform.
- Baca cara men-deploy model untuk menampilkan prediksi.