Checkpoint
Create machine learning models
/ 15
Use the model
/ 15
Save and Load Models
/ 15
Explore Callbacks
/ 15
Exercise 1
/ 15
Exercise 2
/ 15
Exercise 3
/ 10
Pengantar Computer Vision dengan TensorFlow
- GSP631
- Ringkasan
- Tujuan
- Penyiapan dan persyaratan
- Tugas 1. Membuka notebook di Vertex AI Workbench
- Tugas 2. Membuat notebook baru dan mengimpor library
- Tugas 3. Memuat dan melakukan prapemrosesan set data
- Tugas 4. Mendesain, mengompilasi, dan melatih model
- Tugas 5. Mengevaluasi performa model pada data yang belum dilihat
- Tugas 6. Menyimpan dan memuat model
- Tugas 7. Mempelajari callback
- Tugas 8. Bereksperimen dengan model
- Selamat!
GSP631
Ringkasan
TensorFlow adalah library machine learning (ML) open source yang canggih dan portabel, yang dikembangkan oleh Google dan dapat digunakan dengan set data yang sangat besar. Di lab ini, Anda akan membuat dan melatih model computer vision untuk mengenali berbagai item pakaian menggunakan TensorFlow Vertex AI Workbench.
Pengantar TensorFlow
TensorFlow menyediakan framework komputasi untuk membangun model ML. TensorFlow menyediakan berbagai toolkit yang memungkinkan Anda membuat model di tingkat abstraksi yang Anda inginkan. Di lab ini, Anda akan menggunakan tf.keras, API tingkat tinggi untuk membangun dan melatih jaringan neural guna mengklasifikasi gambar di TensorFlow.
Jaringan neural
Jaringan neural adalah model yang terinspirasi oleh otak manusia. Jaringan ini tersusun atas banyak lapisan, dengan setidaknya satu di antaranya tersembunyi, yang terdiri dari unit atau neuron sederhana yang terhubung dan diikuti oleh sejumlah nonlinearitas.
Sebuah node di jaringan neural biasanya membutuhkan beberapa nilai input dan menghasilkan satu nilai output. Neuron ini menerapkan fungsi aktivasi (transformasi nonlinear) ke sejumlah nilai input yang tertimbang untuk menghitung nilai output-nya.
Untuk mendapatkan informasi selengkapnya tentang jaringan neural, lihat Jaringan Neural: Struktur.
Tujuan
Di lab ini, Anda akan mempelajari cara:
- Mendesain, mengompilasi, melatih, dan mengevaluasi model Tensorflow
- Menyimpan dan memuat model
- Menulis callback Anda sendiri untuk menyesuaikan perilaku selama pelatihan
- Menyelesaikan serangkaian latihan untuk memandu Anda bereksperimen dengan berbagai lapisan jaringan
Penyiapan dan persyaratan
Sebelum mengklik tombol Mulai Lab
Baca petunjuk ini. Lab memiliki timer dan Anda tidak dapat menjedanya. Timer, yang dimulai saat Anda mengklik Start Lab, akan menampilkan durasi ketersediaan resource Google Cloud untuk Anda.
Lab praktik ini dapat Anda gunakan untuk melakukan sendiri aktivitas lab di lingkungan cloud sungguhan, bukan di lingkungan demo atau simulasi. Untuk mengakses lab ini, Anda akan diberi kredensial baru yang bersifat sementara dan dapat digunakan untuk login serta mengakses Google Cloud selama durasi lab.
Untuk menyelesaikan lab ini, Anda memerlukan:
- Akses ke browser internet standar (disarankan browser Chrome).
- Waktu untuk menyelesaikan lab. Ingat, setelah dimulai, lab tidak dapat dijeda.
Tugas 1. Membuka notebook di Vertex AI Workbench
-
Di Konsol Google Cloud, pada Navigation menu, klik Vertex AI > Workbench.
-
Cari instance
lalu klik tombol Open JupyterLab.
Antarmuka JupyterLab untuk instance Workbench Anda akan terbuka di tab browser baru.
Menginstal TensorFlow dan paket tambahan
-
Dari menu Launcher, di bagian Other, pilih Terminal.
-
Periksa apakah lingkungan Python Anda sudah dikonfigurasi. Salin dan tempel perintah berikut di terminal.
Contoh output:
- Jalankan perintah berikut untuk menginstal paket TensorFlow.
- Untuk mengupgrade
pip3
, jalankan perintah berikut di terminal.
Pylint adalah alat yang memeriksa error dalam kode Python, serta menandai masalah sintaksis dan gaya dalam kode sumber Python Anda.
- Jalankan perintah berikut untuk menginstal paket
pylint
.
- Instal paket yang diperlukan untuk lab ini dalam file
requirements.txt
:
Lingkungan Anda berhasil disiapkan.
Tugas 2. Membuat notebook baru dan mengimpor library
-
Klik ikon + di sebelah kiri Workbench untuk membuka Launcher baru.
-
Dari menu Launcher, di bagian Notebook, pilih Python3.
Anda akan melihat notebook Jupyter baru. Untuk mendapatkan informasi selengkapnya tentang cara menggunakan notebook Jupyter, lihat dokumentasi Notebook Jupyter.
- Impor dan konfigurasikan
logging
dangoogle-cloud-logging
untuk Cloud Logging. Pada sel pertama, tambahkan kode berikut:
- Impor
tensorflow
untuk melatih dan mengevaluasi model. Namai sebagaitf
untuk memudahkan. Tambahkan kode berikut ke sel pertama.
- Impor
numpy
guna mengurai data untuk tujuan proses debug. Namai sebagainp
untuk memudahkan. Tambahkan kode berikut ke sel pertama.
- Tambahkan kode berikut ke sel pertama untuk mengimpor
tensorflow_datasets
guna mengintegrasikan set data. TensorFlow Datasets adalah sekumpulan set data yang siap digunakan dengan TensorFlow.
-
Untuk menjalankan sel ini, klik tombol Run atau tekan Shift + Enter.
-
Simpan notebook. Klik File > Save. Namai filenya sebagai
model.ipynb
, lalu klik OK.
Tugas 3. Memuat dan melakukan prapemrosesan set data
Tentang set data
Anda akan melatih jaringan neural untuk mengklasifikasi gambar pakaian dari sebuah set data yang disebut Fashion MNIST.
Set data ini berisi 70.000 item pakaian dari 10 kategori berbeda. Gambar menunjukkan setiap potong pakaian dalam resolusi rendah (28x28 piksel), seperti terlihat di sini:
Di lab ini, 60.000 gambar akan digunakan untuk melatih jaringan dan 10.000 gambar akan digunakan untuk mengevaluasi seberapa akurat jaringan tersebut belajar mengklasifikasi gambar.
Data Fashion MNIST tersedia di set data tensorflow(tfds).
Memuat set data
Untuk memuat data Fashion MNIST, Anda akan menggunakan fungsi tfds.load()
.
- Tambahkan kode berikut ke sel kedua di notebook:
Dalam kode di atas, tetapkan argumen split
untuk menentukan bagian set data yang akan dimuat. Tetapkan as_supervised
ke True
untuk memastikan bahwa tf.data.Dataset
yang dimuat memiliki struktur 2-tuple (input, label)
.
ds_train dan ds_test merupakan jenis tf.data.Dataset
. ds_train memiliki 60.000 gambar yang akan digunakan untuk melatih model. ds_test memiliki 10.000 gambar yang akan digunakan untuk mengevaluasi model.
tfds.load()
dan argumennya, lihat panduan.Seperti apa tampilan nilai tersebut?
- Selanjutnya, tambahkan pernyataan print untuk melihat nilai minimum dan maksimum gambar pelatihan untuk item 0. Tambahkan kode berikut ke sel kedua:
Prapemrosesan Data
-
Ukuran tumpukan adalah istilah yang digunakan dalam machine learning dan mengacu pada jumlah contoh pelatihan yang digunakan dalam satu iterasi. Tetapkan nilai ini ke
32
.
Tetapkan ukuran tumpukan dengan menambahkan kode berikut ke model.ipynb
:
- Saat melatih jaringan neural, karena berbagai alasan, akan lebih mudah jika Anda menskalakan nilai piksel ke rentang antara 0 dan 1. Proses ini disebut 'normalisasi'. Karena nilai piksel untuk set data Fashion MNIST berada dalam rentang [0, 255], Anda harus membagi nilai piksel tersebut dengan 255,0 untuk menormalisasi gambar.
Kode yang ditampilkan di bawah menggunakan fungsi map()
pada tf.data.Dataset
untuk menerapkan normalisasi ke gambar di ds_train
dan ds_test
. Karena nilai pikselnya berjenis tf.uint8
, fungsi tf.cast
digunakan untuk mengonversi nilai tersebut ke tf.float32
, lalu membaginya dengan 255.0
. Set data ini juga dikonversi menjadi beberapa batch dengan memanggil metode batch()
dengan BATCH_SIZE
sebagai argumennya.
tf.data.Dataset
di sini.Tambahkan kode berikut ke bagian akhir file:
- Tambahkan lagi pernyataan print untuk nilai minimum dan maksimum sebuah gambar di set data pelatihan:
Tambahkan kode berikut ke bagian akhir file:
Tugas 4. Mendesain, mengompilasi, dan melatih model
Di bagian ini, Anda akan mendesain model menggunakan TensorFlow.
- Tambahkan kode berikut ke file:
Lihat berbagai jenis lapisan dan parameter yang digunakan dalam arsitektur model ini:
-
Sequential: Menentukan URUTAN lapisan di jaringan neural.
-
Flatten: Bentuk gambar (28x28), artinya nilai berbentuk matriks persegi. Lapisan flatten mengambil matriks persegi tersebut dan mengubahnya menjadi vektor satu dimensi.
-
Dense: Menambahkan lapisan neuron.
Setiap lapisan neuron memerlukan fungsi aktivasi untuk menentukan apakah neuron perlu diaktifkan atau tidak. Dari banyak opsi yang tersedia, lab ini menggunakan fungsi berikut:
-
Relu
secara efektif berarti jika X>0 menampilkan X, sebaliknya menampilkan 0. Fungsi ini meneruskan nilai 0 atau yang lebih besar ke lapisan berikutnya dalam jaringan. -
Softmax
mengambil serangkaian nilai, dan secara efektif memilih nilai terbesar agar Anda tidak perlu mengurutkan untuk menemukan nilai yang paling besar. Misalnya, jika output lapisan terakhir adalah [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05], softmax akan menampilkan [0,0,0,0,1,0,0,0,0].
Mengompilasi dan melatih model
Di bagian ini, pertama-tama Anda akan mengompilasi model dengan fungsi pengoptimal dan kerugian. Selanjutnya, Anda akan melatih model tersebut berdasarkan data dan label pelatihan Anda.
Tujuannya adalah agar model mencari tahu hubungan antara data pelatihan dan labelnya. Setelah pelatihan selesai, model Anda harus melihat gambar pakaian yang baru yang menyerupai data pelatihan Anda dan membuat prediksi tentang kelas yang mencakup pakaian tersebut.
Pengoptimal merupakan satu dari dua argumen yang diperlukan untuk mengompilasi model tf.keras. Optimizer
(pengoptimal) adalah algoritma yang memodifikasi atribut jaringan neural, seperti bobot dan kecepatan pembelajaran. Algoritma ini membantu mengurangi kerugian dan meningkatkan akurasi.
tf.keras
, di sini.Loss
(kerugian) menunjukkan performa model dengan angka. Makin baik performa model, makin kecil angka kerugian yang ditampilkan. Begitu pula sebaliknya.
tf.keras
di sini.Perhatikan parameter metrics=
. Parameter ini memungkinkan TensorFlow melaporkan akurasi pelatihan setelah setiap epoch dengan memeriksa hasil yang diprediksi berdasarkan jawaban yang diketahui (label). Parameter ini pada dasarnya melaporkan seberapa efektif jalannya pelatihan.
Model.fit akan melatih model untuk sejumlah epoch yang sudah ditetapkan.
- Tambahkan kode berikut ke file:
Klik Check my progress untuk memverifikasi tujuan.
Menjalankan kode
- Jalankan sel kedua dengan mengklik tombol Run atau menekan Shift + Enter.
Saat sel notebook dijalankan, Anda akan melihat kerugian dan akurasi dilaporkan setelah setiap epoch (atau pass) pelatihan. Perhatikan bahwa dengan makin bertambahnya epoch (atau pass), akurasi meningkat:
Contoh output (nilai Anda mungkin sedikit berbeda, abaikan pesan peringatan):
Untuk output # Values before normalization
, terlihat bahwa nilai minimum dan maksimum berada dalam rentang [0, 255]
. Setelah normalisasi, Anda dapat melihat semua nilai berada dalam rentang [0, 1]
.
Seiring berjalannya pelatihan, kerugian menurun dan akurasi meningkat.
Setelah model selesai dilatih, nilai akurasi akan terlihat di ujung epoch terakhir. Nilai tersebut mungkin mendekati 0.8846 seperti di atas (akurasi Anda mungkin berbeda).
Hal ini menunjukkan bahwa jaringan neural tersebut 89% akurat dalam mengklasifikasi data pelatihan. Dengan kata lain, pada 89% kesempatan, jaringan neural ini berhasil menemukan kecocokan pola antara gambar dan label. Tidak istimewa, tetapi juga tidak buruk mengingat pelatihan hanya dijalankan sebanyak lima epoch pada jaringan neural yang kecil.
Tugas 5. Mengevaluasi performa model pada data yang belum dilihat
Namun, bagaimana performa model saat dijalankan pada data yang belum dilihatnya?
Set pengujian dapat membantu menjawab pertanyaan ini. Panggil model.evaluate
, teruskan kedua set pengujian, dan model akan melaporkan kerugian untuk setiap set.
Evaluasi set pengujian:
- Tambahkan kode berikut ke sel ketiga di notebook:
- Jalankan sel dengan mengklik tombol Run atau menekan Shift + Enter.
Jika men-scroll hingga ke bagian bawah output, Anda dapat melihat hasil evaluasi di baris terakhir.
Model ini melaporkan akurasi .8708 pada set pengujian (ds_test
) yang berarti akurasinya sekitar 87%. (Nilai Anda mungkin sedikit berbeda).
Sesuai dugaan, saat dijalankan pada data yang belum diketahui, model tersebut kurang akurat dibandingkan ketika dijalankan pada data yang telah digunakan untuk melatihnya.
Sembari menggunakan TensorFlow lebih lanjut, Anda akan mempelajari cara meningkatkan akurasi ini.
Klik Check my progress untuk memverifikasi tujuan.
Tugas 6. Menyimpan dan memuat model
Progres model dapat disimpan selama dan setelah pelatihan. Artinya, model dapat melanjutkan dari posisi terakhir saat pelatihan dihentikan sehingga Anda dapat menghindari waktu pelatihan yang lama. Dengan menyimpan model, Anda dapat membagikannya dan orang lain dapat mencipta ulang hasil kerja Anda. Untuk latihan pertama ini, Anda akan menambahkan kode yang diperlukan untuk menyimpan dan memuat model.
SavedModel
dan Keras
. Format TensorFlow SavedModel
merupakan format file default di TF2.x. Namun, model dapat disimpan dalam format Keras
. Anda akan mempelajari lebih lanjut cara menyimpan model dalam kedua format file ini.- Tambahkan kode berikut ke sel keempat di notebook:
Kode di atas menunjukkan cara menyimpan model dalam dua format berbeda dan memuat kembali model yang tersimpan. Anda dapat memilih format apa pun sesuai dengan kasus penggunaan Anda. Baca lebih lanjut fungsionalitas ini di Dokumentasi TensorFlow untuk "Menyimpan dan memuat model".
- Jalankan sel dengan mengklik tombol Run atau menekan Shift + Enter.
Di bagian akhir output, Anda akan melihat dua set ringkasan model. Set pertama menunjukkan ringkasan setelah model disimpan dalam format SavedModel
. Set kedua menunjukkan ringkasan setelah model disimpan dalam format h5
.
Anda dapat melihat bahwa kedua ringkasan model tersebut identik karena kita pada dasarnya menyimpan model yang sama dalam dua format berbeda.
Klik Check my progress untuk memverifikasi tujuan.
Tugas 7. Mempelajari callback
Sebelumnya, saat melatih model, Anda telah melihat bahwa, seiring berlangsungnya pelatihan, kerugian model berkurang dan akurasinya meningkat. Setelah mencapai akurasi dan kerugian pelatihan yang diinginkan, Anda mungkin masih perlu menunggu sebentar lagi hingga pelatihan selesai.
Anda mungkin berpikir, "Bukankah lebih baik jika pelatihan dapat dihentikan saat model mencapai nilai akurasi yang diinginkan?"
Misalnya, jika akurasi 95% dirasa cukup, dan model dapat mencapainya setelah 3 epoch pelatihan, mengapa harus menunggu hingga selesainya beberapa epoch lagi?
Jawabannya adalah: Callback!
Callback adalah alat yang efektif untuk menyesuaikan perilaku model Keras selama pelatihan, evaluasi, atau inferensi. Anda dapat menetapkan callback untuk menghentikan pelatihan segera setelah model mencapai akurasi yang diinginkan pada set pelatihan.
Coba kode berikut untuk melihat apa yang terjadi jika Anda menetapkan callback untuk menghentikan pelatihan saat akurasi mencapai 84%:
-
Buka Launcher, lalu pilih Python3 untuk membuat notebook Jupyter baru.
-
Simpan file itu sebagai
callback_model.ipynb
. -
Tempel kode berikut ke sel pertama
callback_model.ipynb
:
-
Tekan Ctrl + S atau buka File > Save Notebook untuk menyimpan perubahan.
-
Jalankan kode dengan mengklik tombol Run atau menekan Shift + Enter.
Lihat bahwa pelatihan dibatalkan setelah beberapa epoch.
Klik Check my progress untuk memverifikasi tujuan.
Tugas 8. Bereksperimen dengan model
Di bagian ini, Anda akan bereksperimen dengan berbagai lapisan jaringan.
Latihan 1
Dalam Latihan ini, Anda akan mempelajari lapisan yang ada di model Anda. Apa yang terjadi saat Anda mengubah jumlah neuron?
-
Buka Launcher, lalu pilih Python3 untuk membuat notebook Jupyter baru.
-
Simpan file itu sebagai
updated_model.ipynb
. -
Tempel kode berikut ke sel pertama
updated_model.ipynb
:
- Lakukan eksperimen dengan berbagai nilai untuk lapisan padat.
Buka bagian # Define the model
, lalu ubah 64 menjadi 128 neuron:
-
Tekan Ctrl + S atau buka File > Save Notebook untuk menyimpan perubahan.
-
Jalankan kode dengan mengklik tombol Run atau menekan Shift + Enter.
Apa saja hasil yang Anda peroleh untuk kerugian, waktu pelatihan, dll.? Kira-kira apa penyebabnya?
Saat jumlah neuron ditingkatkan menjadi 128, Anda harus melakukan lebih banyak penghitungan. Hal ini akan memperlambat proses pelatihan. Dalam kasus ini, peningkatan tersebut berdampak positif karena model menjadi lebih akurat. Namun, tidak selalu 'makin banyak, makin baik'. Anda dapat mencapai titik penurunan hasil dengan sangat cepat.
Klik Check my progress untuk memverifikasi tujuan.
Latihan 2
Pertimbangkan efek lapisan tambahan dalam jaringan. Apa yang akan terjadi jika Anda menambahkan lapisan tambahan antara kedua lapisan padat itu?
- Di
updated_model.ipynb
, tambahkan lapisan di bagian# Define the model
.
Ganti definisi model Anda dengan kode berikut:
-
Tekan Ctrl + S atau buka File > Save Notebook untuk menyimpan perubahan.
-
Jalankan kode dengan mengklik tombol Run atau menekan Shift + Enter.
Jawaban: Tidak ada dampak yang signifikan -- karena data ini relatif sederhana. Untuk data yang jauh lebih kompleks, lapisan tambahan kerap diperlukan.
Klik Check my progress untuk memverifikasi tujuan.
Latihan 3
Sebelum melatih model, Anda telah menormalisasi nilai piksel ke rentang [0, 1]
. Apa dampak dari menghapus normalisasi sehingga nilai tersebut berada dalam rentang [0, 255] seperti aslinya dalam set data?
- Cobalah! Di
# Define, load and configure data
, hapus fungsi map baik yang diterapkan ke set data pelatihan maupun pengujian.
- Tambahkan kode ini di bagian akhir sel untuk mencetak nilai maksimum gambar pertama di batch 0. Tanpa normalisasi, nilai maksimum akan berada dalam rentang
[0, 255]
.
- Model
updated_model.ipynb
akhir Anda akan terlihat seperti ini:
-
Tekan Ctrl + S atau buka File > Save Notebook untuk menyimpan perubahan.
-
Jalankan kode dengan mengklik tombol Run atau menekan Shift + Enter.
Output yang diharapkan untuk # Print out max value to see the changes
Setelah menyelesaikan sejumlah epoch, Anda dapat melihat perbedaan akurasi tanpa normalisasi.
Kira-kira apa penyebab perubahan akurasi tersebut?
Klik Check my progress untuk memverifikasi tujuan.
Latihan 4
Apa yang terjadi jika Anda menghapus lapisan Flatten()
, dan mengapa?
Silakan mencobanya:
- Di bagian
# Define the model
, hapustf.keras.layers.Flatten()
:
- Simpan dan jalankan sel di
updated_model.ipynb
.
Anda mendapatkan error terkait bentuk data tersebut. Hal ini sudah diperkirakan.
Detail error tersebut mungkin tidak tampak jelas untuk saat ini, tetapi hal itu memperkuat prinsip utama bahwa lapisan pertama dalam jaringan Anda harus memiliki bentuk yang sama dengan data Anda. Saat ini, gambar input memiliki bentuk 28x28, dan 28 lapisan dari 28 neuron tidaklah memungkinkan. Oleh karena itu, akan lebih masuk akal untuk meratakan 28x28 itu menjadi 784x1.
Alih-alih menulis semua kode untuk menangani hal itu sendiri, Anda dapat menambahkan lapisan Flatten()
di awal. Ketika dimuat ke dalam model, array tersebut akan otomatis diratakan untuk Anda.
Latihan 5
Perhatikan lapisan (output) terakhir. Mengapa ada 10 neuron di lapisan terakhir? Apa yang terjadi jika jumlah neuron tidak 10?
Cari tahu dengan melatih jaringan menggunakan 5 neuron.
- Ganti bagian
# Define the model
dengan kode berikut untuk mengurungkan perubahan yang Anda buat di bagian sebelumnya:
- Ubah jumlah neuron di lapisan terakhir dari 10 menjadi 5:
- Simpan dan jalankan sel di
updated_model.ipynb
.
Apa yang terjadi: Anda mendapatkan error begitu model menemukan nilai yang tidak diharapkan.
Prinsip utama lainnya -- jumlah neuron di lapisan terakhir harus sama dengan jumlah kelas yang Anda klasifikasi. Dalam kasus ini, jumlah tersebut adalah digit 0-9, jadi ada 10 kelas. Oleh karena itu, lapisan terakhir Anda juga harus memiliki 10 neuron.
Selamat!
Selamat! Di lab ini, Anda telah mempelajari cara mendesain, mengompilasi, melatih, dan mengevaluasi model Tensorflow. Anda juga telah mempelajari cara menyimpan dan memuat model serta menulis callback Anda sendiri untuk menyesuaikan perilaku selama pelatihan. Anda juga telah menyelesaikan serangkaian latihan untuk memandu Anda bereksperimen dengan berbagai lapisan di jaringan.
Langkah berikutnya/pelajari lebih lanjut
- Lihat semua hal yang perlu diketahui di Kursus Singkat Machine Learning.
- Lakukan eksperimen di halaman Cobalah! untuk mendapatkan gambaran apa saja yang dapat Anda lakukan dengan computer vision.
- Lihat dokumentasi Vertex AI untuk mempelajari machine learning sebagai bagian dari Vertex AI.
- Hal-hal menarik terkait AI. Lihat Bereksperimen dengan Google.
- Pelajari lebih lanjut TensorFlow.
Sertifikasi dan pelatihan Google Cloud
...membantu Anda mengoptimalkan teknologi Google Cloud. Kelas kami mencakup keterampilan teknis dan praktik terbaik untuk membantu Anda memahami dengan cepat dan melanjutkan proses pembelajaran. Kami menawarkan pelatihan tingkat dasar hingga lanjutan dengan opsi on demand, live, dan virtual untuk menyesuaikan dengan jadwal Anda yang sibuk. Sertifikasi membantu Anda memvalidasi dan membuktikan keterampilan serta keahlian Anda dalam teknologi Google Cloud.
Manual Terakhir Diperbarui 12 September 2024
Lab Terakhir Diuji 12 September 2024
Hak cipta 2024 Google LLC Semua hak dilindungi undang-undang. Google dan logo Google adalah merek dagang dari Google LLC. Semua nama perusahaan dan produk lain mungkin adalah merek dagang masing-masing perusahaan yang bersangkutan.