Telusuri sepuluh pembaruan terpenting yang diperkenalkan di TensorFlow 2.0 yang baru dirilis, dan pelajari cara mengimplementasikan beberapa di antaranya.
TensorFlow 2.0 alpha kini telah dirilis. Kerangka kerja ini memiliki dampak signifikan pada komunitas deep learning. Praktisi, peneliti, pengembang menyukai kerangka ini dan mengadopsinya seperti belum pernah terjadi sebelumnya. Ini jelas menjadi salah satu alasan utama di balik lonjakan berbagai aplikasi deep learning keren yang kita lihat saat ini. Meski begitu, TensorFlow 1.xjuga memiliki kekurangan (seperti banyak kerangka kerja lainnya). Seperti yang dikatakan Martin Wicke (Software Engineer dari tim TensorFlow) selama TF Dev Summit '19 -
Kami telah banyak belajar sejak 1.0.
Dengan semua pelajaran dari basis pengguna yang luas, isu-isu di GitHub, tim TensorFlow merilis TensorFlow 2.0 alpha yang hadir dengan sejumlah perubahan penting demi peningkatan kinerja, pengalaman pengguna, dan seterusnya. Ini memungkinkan Anda membuat prototipe dengan cepat dan mencakup banyak praktik deep learning modern. Dalam artikel ini, Anda akan mempelajari beberapa perubahan tersebut melalui implementasi yang ringkas.
Catatan bahwa pembaruan yang dibahas di sini adalah yang paling signifikan menurut penulis. Anda memerlukan pengalaman sebelumnya dengan TensorFlow dan Keras untuk mengikuti artikel ini. Berikut beberapa sumber yang mungkin berguna jika Anda ingin menyegarkan kembali pengetahuan tentang TensorFlow dan Keras -
Memperbarui ke TensorFlow 2.0 dilakukan dengan menjalankan baris kode berikut dari Jupyter Notebook:
!pip install tensorflow==2.0.0-alpha0
Varian GPU juga dapat diinstal dengan cara yang sama (memerlukan CUDA terlebih dahulu):
!pip install tensorflow-gpu==2.0.0-alpha0
Anda dapat mempelajari lebih lanjut tentang proses instalasi di sini.
Beberapa pembaruan yang akan Anda pelajari mencakup implementasi kode. Dalam kasus tersebut, Anda memerlukan dataset. Untuk artikel ini, Anda akan menggunakan dataset Adult dari UCI Archive.
import pandas as pd
columns =["Age","WorkClass","fnlwgt","Education","EducationNum","MaritalStatus","Occupation","Relationship","Race","Gender","CapitalGain","CapitalLoss","HoursPerWeek","NativeCountry","Income"]
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data',
header=None,
names=columns)
data.head()Didukung oleh
Age
WorkClass
fnlwgt
Education
EducationNum
MaritalStatus
Occupation
Relationship
Race
Gender
CapitalGain
CapitalLoss
HoursPerWeek
NativeCountry
Income
0
39
State-gov
77516
Bachelors
13
Never-married
Adm-clerical
Not-in-family
White
Male
2174
0
40
United-States
<=50K
1
50
Self-emp-not-inc
83311
Bachelors
13
Married-civ-spouse
Exec-managerial
Husband
White
Male
0
0
13
United-States
<=50K
2
38
Private
215646
HS-grad
9
Divorced
Handlers-cleaners
Not-in-family
White
Male
0
0
40
United-States
<=50K
3
53
Private
234721
11th
7
Married-civ-spouse
Handlers-cleaners
Husband
Black
Male
0
0
40
United-States
<=50K
4
28
Private
338409
Bachelors
13
Married-civ-spouse
Prof-specialty
Wife
Black
Female
0
0
40
Cuba
<=50K
Dataset ini merepresentasikan tugas klasifikasi biner, yaitu memprediksi apakah seseorang akan berpenghasilan lebih dari $50k per tahun atau tidak berdasarkan serangkaian detail pribadi.
Mari lakukan prapemrosesan data dasar lalu atur pemisahan data dengan rasio 80:20:
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
import numpy as np
# Label Encode
le = LabelEncoder()
data = data.apply(le.fit_transform)# Segregate data features & convert into NumPy arrays
X = data.iloc[:,0:-1].values
y = data['Income'].values
# Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)Didukung oleh
Sampai tahap ini, Anda seharusnya memiliki lingkungan kerja dengan TensorFlow 2.0 terpasang dan dataset dimuat ke dalam workspace Anda. Sekarang Anda dapat melanjutkan ke pembaruan.
1. Eager execution secara bawaan
Di TensorFlow 2.0, Anda tidak lagi perlu membuat session dan menjalankan computational graph di dalamnya. Eager execution diaktifkan secara default pada rilis 2.0 sehingga Anda dapat membangun model dan langsung menjalankannya. Anda dapat memilih untuk menonaktifkan eager execution seperti ini:
tf.compat.v1.disable_eager_execution() (dengan asumsi tensorflow diimpor dengan alias tf.)
Berikut perbandingan berbasis kode kecil yang menunjukkan perbedaan ini -
2. tf.function dan AutoGraph
Sementara eager execution memungkinkan pemrograman imperatif, saat menyangkut pelatihan terdistribusi, optimisasi skala penuh, lingkungan produksi, eksekusi graph ala TensorFlow 1.x memiliki keunggulan dibanding eager execution. Di TensorFlow 2.0, Anda tetap memiliki eksekusi berbasis graph namun dengan cara yang lebih fleksibel. Ini dicapai dengan tf.function dan AutoGraph.
tf.function memungkinkan Anda mendefinisikan graph TensorFlow dengan sintaks ala Python melalui fitur AutoGraph. AutoGraph mendukung beragam kompatibilitas Python termasuk if-statement, for-loop, while-loop, Iterators, dll. Namun ada keterbatasan. Di sini Anda dapat menemukan daftar lengkap dukungan yang tersedia saat ini. Di bawah ini contoh yang menunjukkan betapa mudahnya mendefinisikan graph TensorFlow hanya dengan sebuah decorator.
import tensorflow as tf
# Define the forward pass@tf.functiondefsingle_layer(x, y):return tf.nn.relu(tf.matmul(x, y))# Generate random data drawn from a uniform distribution
x = tf.random.uniform((2,3))
y = tf.random.uniform((3,5))
single_layer(x, y)Didukung oleh
<tf.Tensor: id=73, shape=(2,5), dtype=float32, numpy=array([[0.5779363,0.11255255,0.26296678,0.12809312,0.23484911],[0.5932371,0.1793559,0.2845083,0.23249313,0.21367362]],
dtype=float32)>Didukung oleh
Perhatikan bahwa Anda tidak perlu membuat session atau placeholder apa pun untuk menjalankan fungsi single_layer(). Ini salah satu fitur praktis dari tf.function. Di balik layar, ia melakukan semua optimisasi yang diperlukan agar kode Anda berjalan lebih cepat.
3. tf.variable_scope tidak lagi diperlukan
Di TensorFlow 1.x, untuk dapat menggunakan tf.layers sebagai variabel dan menggunakannya kembali, Anda harus memakai blok tf.variable. Namun ini tidak lagi diperlukan di TensorFlow 2.0. Berkat kehadiran keras sebagai API tingkat tinggi utama di TensorFlow 2.0, semua layer yang dibuat menggunakan tf.layers dapat dengan mudah dimasukkan ke dalam definisi tf.keras.Sequential. Ini membuat kode jauh lebih mudah dibaca, dan Anda juga dapat melacak variabel serta loss.
Berikut contohnya:
# Define the model
model = tf.keras.Sequential([
tf.keras.layers.Dropout(rate=0.2, input_shape=X_train.shape[1:]),
tf.keras.layers.Dense(units=64, activation='relu'),
tf.keras.layers.Dropout(rate=0.2),
tf.keras.layers.Dense(units=64, activation='relu'),
tf.keras.layers.Dropout(rate=0.2),
tf.keras.layers.Dense(units=1, activation='sigmoid')])# Get the output probabilities
out_probs = model(X_train.astype(np.float32), training=True)print(out_probs)Didukung oleh
tf.Tensor([[1.][0.12573627][1.]...[1.][1.][1.]], shape=(26048,1), dtype=float32)Didukung oleh
Pada contoh di atas, Anda meneruskan data pelatihan melalui model hanya untuk mendapatkan probabilitas keluaran mentah. Perhatikan bahwa ini hanya forward pass. Tentu saja, Anda dapat melanjutkan dan melatih model Anda -
model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit(X_train, y_train,
validation_data=(X_test, y_test),
epochs=5, batch_size=64)Didukung oleh
Dalam riset machine learning atau bahkan aplikasi industri, sering kali ada kebutuhan untuk menulis layer kustom guna memenuhi use case tertentu. TensorFlow 2.0 membuat penulisan layer kustom menjadi sangat mudah dan menggunakannya bersama layer yang ada. Anda juga dapat menyesuaikan forward pass model Anda dengan cara apa pun yang Anda inginkan.
Untuk membuat layer kustom, opsi termudah adalah mewarisi kelas Layer dari tf.keras.layers lalu mendefinisikannya sesuai kebutuhan. Anda akan membuat layer kustom, lalu mendefinisikan komputasi forward-nya. Berikut adalah keluaran dari eksekusi help(tf.keras.layers.Layer). Ini memberi tahu hal-hal yang perlu Anda tentukan agar berhasil:
Mengikuti saran dari cuplikan di atas, Anda akan -
Mendefinisikan konstruktor dengan jumlah keluaran
Di metode build() Anda akan menambahkan bobot untuk layer Anda
Terakhir di metode call() Anda akan mendefinisikan forward pass dengan merangkai perkalian matriks dan relu()
classMyDenseLayer(tf.keras.layers.Layer):# Define the constructordef__init__(self, num_outputs):super(MyDenseLayer, self).__init__()
self.num_outputs = num_outputs
# Define the build function to add the weightsdefbuild(self, input_shape):
self.kernel = self.add_variable("kernel",
shape=[input_shape[-1],
self.num_outputs])# Define the forward passdefcall(self,input):
matmul = tf.matmul(input, self.kernel)return tf.nn.relu(matmul)# Initialize the layer with 10 output units
layer = MyDenseLayer(10)# Supply the input shape
layer(tf.random.uniform((10,3)))# Display the trainable parameters of the layerprint(layer.trainable_variables)Didukung oleh
[<tf.Variable 'my_dense_layer_7/kernel:0' shape=(3,10) dtype=float32, numpy=array([[0.43613756,0.21344548,0.37803996,0.65583944,0.11884308,0.13909656,0.30802298,0.5313586,0.04967308,0.32889426],[0.1680265,-0.59944266,-0.4014195,0.14887196,0.07071263,0.37862527,-0.5822403,-0.5963166,0.3106798,0.05353856],[-0.44345278,-0.23122305,-0.62959856,-0.43062705,0.13194847,-0.60124606,-0.62745696,0.12254918,-0.09806103,-0.45324165]],
dtype=float32)>]Didukung oleh
Anda dapat mengomposisikan beberapa layer dengan mewarisi kelas Model dari tf.keras. Anda dapat mempelajari lebih lanjut tentang komposisi model di sini.
5. Fleksibilitas dalam Pelatihan Model
TensorFlow dapat menggunakan automatic differentiation untuk menghitung gradien fungsi loss terhadap parameter model. tf.GradientTape membuat tape dalam sebuah konteks yang digunakan TensorFlow untuk melacak gradien yang direkam dari setiap komputasi di tape tersebut. Untuk memahaminya, mari mendefinisikan model dengan cara yang lebih low-level dengan mewarisi kelas tf.keras.Model.
from tensorflow.keras import Model
classCustomModel(Model):def__init__(self):super(CustomModel, self).__init__()
self.do1 = tf.keras.layers.Dropout(rate=0.2, input_shape=(14,))
self.fc1 = tf.keras.layers.Dense(units=64, activation='relu')
self.do2 = tf.keras.layers.Dropout(rate=0.2)
self.fc2 = tf.keras.layers.Dense(units=64, activation='relu')
self.do3 = tf.keras.layers.Dropout(rate=0.2)
self.out = tf.keras.layers.Dense(units=1, activation='sigmoid')defcall(self, x):
x = self.do1(x)
x = self.fc1(x)
x = self.do2(x)
x = self.fc2(x)
x = self.do3(x)return self.out(x)
model = CustomModel()Didukung oleh
Perhatikan bahwa topologi model ini persis sama seperti yang Anda definisikan sebelumnya. Untuk dapat melatih model ini menggunakan automatic differentiation, Anda perlu mendefinisikan fungsi loss dan optimizer secara berbeda -
loss_func = tf.keras.losses.BinaryCrossentropy()
optimizer = tf.keras.optimizers.Adam()Didukung oleh
Anda kini akan mendefinisikan metrik yang akan digunakan untuk mengukur kinerja jaringan selama pelatihan. Yang dimaksud kinerja di sini adalah loss dan akurasi model.
# Average the loss across the batch size within an epoch
train_loss = tf.keras.metrics.Mean(name='train_loss')
train_acc = tf.keras.metrics.BinaryAccuracy(name='train_acc')
valid_loss = tf.keras.metrics.Mean(name='test_loss')
valid_acc = tf.keras.metrics.BinaryAccuracy(name='valid_acc')Didukung oleh
tf.data menyediakan metode utilitas untuk mendefinisikan pipeline data input. Ini sangat berguna terutama saat Anda menangani data dalam jumlah besar.
Anda sekarang akan mendefinisikan generator data, yang akan menghasilkan batch data selama pelatihan model.
Anda sekarang siap melatih model menggunakan tf.GradientTape. Pertama, Anda akan mendefinisikan metode yang akan melatih model dengan data yang baru saja Anda definisikan menggunakan tf.data.DataSet. Anda juga akan membungkus langkah-langkah pelatihan model dengan decorator tf.function untuk memanfaatkan peningkatan kecepatan komputasi yang ditawarkannya.
Pelatihan dan validasi model
# Train the model@tf.functiondefmodel_train(features, labels):# Define the GradientTape contextwith tf.GradientTape()as tape:# Get the probabilities
predictions = model(features)# Calculate the loss
loss = loss_func(labels, predictions)# Get the gradients
gradients = tape.gradient(loss, model.trainable_variables)# Update the weights
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
train_loss(loss)
train_acc(labels, predictions)Didukung oleh
# Validating the model@tf.functiondefmodel_validate(features, labels):
predictions = model(features)
t_loss = loss_func(labels, predictions)
valid_loss(t_loss)
valid_acc(labels, predictions)Didukung oleh
Gunakan dua metode di atas untuk melatih dan memvalidasi model selama 5 epoch.
for epoch inrange(5):for features, labels in train_ds:
model_train(features, labels)for test_features, test_labels in test_ds:
model_validate(test_features, test_labels)
template ='Epoch {}, train_loss: {}, train_acc: {}, train_loss: {}, test_acc: {}'print(template.format(epoch+1,
train_loss.result(),
train_acc.result()*100,
valid_loss.result(),
valid_acc.result()*100))Didukung oleh
Contoh ini terinspirasi dari contoh ini dari para penulis TensorFlow 2.0.
6. TensorFlow Datasets
Modul terpisah bernama DataSets digunakan untuk beroperasi dengan model jaringan secara elegan. Anda sudah melihat ini pada contoh sebelumnya. Di bagian ini, Anda akan melihat bagaimana memuat dataset MNIST sesuai kebutuhan Anda.
Anda dapat memasang pustaka tensorflow_datasets dengan pip. Setelah terpasang, Anda siap melangkah. Pustaka ini menyediakan beberapa fungsi utilitas untuk membantu Anda menyiapkan pipeline konstruksi dataset secara fleksibel. Anda dapat mempelajari lebih lanjut tentang fungsi-fungsi ini di sini dan di sini. Sekarang Anda akan melihat bagaimana membangun pipeline input data untuk memuat dataset MNIST.
import tensorflow_datasets as tfds
# You can fetch the DatasetBuilder class by string
mnist_builder = tfds.builder("mnist")# Download the dataset
mnist_builder.download_and_prepare()# Construct a tf.data.Dataset: train and test
ds_train, ds_test = mnist_builder.as_dataset(split=[tfds.Split.TRAIN, tfds.Split.TEST])Didukung oleh
Anda dapat mengabaikan peringatan. Perhatikan betapa elegan tensorflow_datasets menangani pipeline.
# Prepare batches of 128 from the training set
ds_train = ds_train.batch(128)# Load in the dataset in the simplest way possiblefor features in ds_train:
image, label = features["image"], features["label"]Didukung oleh
Sekarang Anda dapat menampilkan gambar pertama dari kumpulan gambar yang Anda muat. Catatan bahwa tensorflow_datasets bekerja dalam mode eager maupun dalam pengaturan berbasis graph.
import matplotlib.pyplot as plt
%matplotlib inline
# You can convert a TensorFlow tensor just by using# .numpy()
plt.imshow(image[0].numpy().reshape(28,28), cmap=plt.cm.binary)
plt.show()Didukung oleh
7. Kebijakan Automatic Mixed Precision
Kebijakan mixed precision diusulkan oleh NVIDIA tahun lalu. Anda dapat menemukan paper aslinya di sini. Gagasan singkat di balik kebijakan mixed precision adalah menggunakan campuran presisi setengah (FP16) dan penuh (FP32) dan mengambil keunggulan dari keduanya. Ini menunjukkan hasil yang luar biasa dalam pelatihan jaringan saraf yang sangat dalam (baik dari segi waktu maupun skor).
Jika Anda berada di lingkungan GPU yang mendukung CUDA (misalnya Generasi Volta, Tesla T4) dan Anda memasang varian GPU dari TensorFlow 2.0, Anda dapat menginstruksikan TensorFlow untuk melatih dengan mixed precision seperti ini -
Ini akan otomatis me-cast operasi pada graph TensorFlow sesuai kebijakan. Anda akan melihat peningkatan kinerja yang cukup baik pada model Anda. Anda juga dapat mengoptimalkan operasi inti TensorFlow dengan kebijakan mixed precision. Lihat artikel ini untuk mengetahui lebih lanjut.
Harap dicatat fitur ini hanya didukung di container TensorFlow dari NVIDIA. Untuk dapat mengintegrasikan pelatihan mixed-precision secara native di tf.keras, saya sarankan melihat artikel ini. Saya ingin berterima kasih kepada Abhishek Thanki yang telah menunjukkan hal ini kepada saya.
8. Pelatihan Terdistribusi
TensorFlow 2.0 membuat proses pendistribusian pelatihan ke banyak GPU menjadi sangat mudah. Ini sangat berguna untuk keperluan produksi saat Anda harus memenuhi beban yang sangat berat. Semudah menempatkan blok pelatihan model Anda di dalam blok with.
Pertama, tentukan strategi distribusi seperti ini:
Strategi mirrored membuat satu replika per GPU dan variabel model dicerminkan secara merata di seluruh GPU. Anda sekarang dapat menggunakan strategi yang ditentukan seperti berikut:
with mirrored_strategy.scope():
model = tf.keras.Sequential([tf.keras.layers.Dense(1, input_shape=(1,))])
model.compile(loss='mse', optimizer='sgd')
model.fit(X_train, y_train,
validation_data=(X_test, y_test),
batch_size=128,
epochs=10)Didukung oleh
Catatan bahwa potongan kode di atas hanya akan berguna jika Anda memiliki banyak GPU yang dikonfigurasi pada satu sistem. Ada sejumlah strategi distribusi yang dapat Anda konfigurasikan. Anda dapat mempelajari lebih lanjut di sini.
9. TensorBoard di dalam Jupyter Notebook
Ini mungkin bagian paling menarik dari pembaruan ini. Anda dapat memvisualisasikan pelatihan model langsung di dalam Jupyter Notebook melalui TensorBoard. TensorBoard baru dilengkapi banyak fitur menarik seperti profiling memori, melihat data gambar termasuk confusion matrix, graph model konseptual, dan sebagainya. Anda dapat mempelajari lebih lanjut di sini.
Pada bagian ini, Anda akan mengonfigurasi lingkungan sehingga TensorBoard ditampilkan di dalam Jupyter Notebook. Pertama Anda harus memuat ekstensi notebook tensorboard.notebook -
Anda sekarang akan mendefinisikan callback TensorBoard menggunakan modul tf.keras.callbacks.
from datetime import datetime
import os
# Make a directory to keep the training logs
os.mkdir("logs")# Set the callback
logdir ="logs"
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir)Didukung oleh
Bangun ulang model menggunakan API Sequential dari tf.keras -
# Define the model
model = tf.keras.Sequential([
tf.keras.layers.Dropout(rate=0.2, input_shape=X_train.shape[1:]),
tf.keras.layers.Dense(units=64, activation='relu'),
tf.keras.layers.Dropout(rate=0.2),
tf.keras.layers.Dense(units=64, activation='relu'),
tf.keras.layers.Dropout(rate=0.2),
tf.keras.layers.Dense(units=1, activation='sigmoid')])# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])Didukung oleh
Train dan test set telah dimodifikasi untuk kegunaan yang berbeda. Jadi, ada baiknya membaginya lagi -
# Split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)Didukung oleh
Anda siap untuk melatih model -
# The TensorBoard extension%tensorboard --logdir logs/# Pass the TensorBoard callback you defined
model.fit(X_train, y_train,
validation_data=(X_test, y_test),
batch_size=64,
epochs=10,
callbacks=[tensorboard_callback],
verbose=False)Didukung oleh
<iframe
width="100%"
height="800"
src="http://localhost:6006"
frameborder="0"
allowfullscreen
></iframe><tensorflow.python.keras.callbacks.History at 0x7fc215b69400>Didukung oleh
Dashboard TensorBoard seharusnya dimuat di Jupyter Notebook Anda, dan Anda dapat menelusuri metrik pelatihan serta validasi.
10. TensorFlow untuk Swift
Terlepas dari semua kesuksesan luar biasa, satu hal yang cukup menyedihkan tentang Python adalah bahwa Python itu lambat. Untuk membantu peneliti, praktisi, bahkan pemula, tim TensorFlow telah mengembangkan versi untuk Swift. Meskipun belum siap produksi seperti varian Python, ini jelas memiliki potensi. Swift memungkinkan interaksi level rendah dan modul kompilasi tingkat lanjut. Di sini Anda akan menemukan semua hal terkait varian TensorFlow untuk Swift. Anda juga dianjurkan untuk menyimak wawancara ini bersama Jeremy Howard yang dipandu oleh Josh Gordon di mana Jeremy berbagi pandangannya mengenai arah ini.
Apa Selanjutnya?
Anda telah sampai di akhir artikel ini. Keindahan deep learning terletak pada penerapannya. Langkah berikutnya yang segera dapat Anda lakukan adalah mencoba ide-ide yang dibahas dalam artikel ini dan mengintegrasikannya. Pembaruan TensorFlow ini merupakan salah satu yang paling komprehensif dan ramah pengembang. Anda dianjurkan untuk melihat daftar tonton YouTube dari TensorFlow Dev Summit tahun ini yang akan memberi Anda pembaruan tambahan tentang TensorFlow lattice, TensorFlow probability, TensorFlow lite, dan seterusnya.
Jika Anda tertarik memperkuat pengetahuan deep learning, Anda dapat melihat kursus berikut:
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
TensorFlow 2.0 alphakini telah dirilis. Kerangka kerja ini memiliki dampak signifikan pada komunitas deep learning. Praktisi, peneliti, pengembang menyukai kerangka ini dan mengadopsinya seperti belum pernah terjadi sebelumnya. Ini jelas menjadi salah satu alasan utama di balik lonjakan berbagai aplikasi deep learning keren yang kita lihat saat ini. Meski begitu,TensorFlow 1.xjuga memiliki kekurangan (seperti banyak kerangka kerja lainnya). Seperti yang dikatakan Martin Wicke (Software Engineer dari timTensorFlow) selama TF Dev Summit '19 -Dengan semua pelajaran dari basis pengguna yang luas, isu-isu di GitHub, tim
TensorFlowmerilisTensorFlow 2.0 alphayang hadir dengan sejumlah perubahan penting demi peningkatan kinerja, pengalaman pengguna, dan seterusnya. Ini memungkinkan Anda membuat prototipe dengan cepat dan mencakup banyak praktik deep learning modern. Dalam artikel ini, Anda akan mempelajari beberapa perubahan tersebut melalui implementasi yang ringkas.Catatan bahwa pembaruan yang dibahas di sini adalah yang paling signifikan menurut penulis. Anda memerlukan pengalaman sebelumnya dengan
TensorFlowdanKerasuntuk mengikuti artikel ini. Berikut beberapa sumber yang mungkin berguna jika Anda ingin menyegarkan kembali pengetahuan tentangTensorFlowdanKeras-Instalasi dan Dataset Demo
Memperbarui ke
TensorFlow 2.0dilakukan dengan menjalankan baris kode berikut dari Jupyter Notebook:!pip install tensorflow==2.0.0-alpha0Varian GPU juga dapat diinstal dengan cara yang sama (memerlukan CUDA terlebih dahulu):
!pip install tensorflow-gpu==2.0.0-alpha0Anda dapat mempelajari lebih lanjut tentang proses instalasi di sini.
Beberapa pembaruan yang akan Anda pelajari mencakup implementasi kode. Dalam kasus tersebut, Anda memerlukan dataset. Untuk artikel ini, Anda akan menggunakan dataset Adult dari UCI Archive.
Dataset ini merepresentasikan tugas klasifikasi biner, yaitu memprediksi apakah seseorang akan berpenghasilan lebih dari $50k per tahun atau tidak berdasarkan serangkaian detail pribadi.
Mari lakukan prapemrosesan data dasar lalu atur pemisahan data dengan rasio 80:20:
Sampai tahap ini, Anda seharusnya memiliki lingkungan kerja dengan
TensorFlow 2.0terpasang dan dataset dimuat ke dalam workspace Anda. Sekarang Anda dapat melanjutkan ke pembaruan.1. Eager execution secara bawaan
Di
TensorFlow 2.0, Anda tidak lagi perlu membuat session dan menjalankan computational graph di dalamnya. Eager execution diaktifkan secara default pada rilis 2.0 sehingga Anda dapat membangun model dan langsung menjalankannya. Anda dapat memilih untuk menonaktifkan eager execution seperti ini:tf.compat.v1.disable_eager_execution()(dengan asumsitensorflowdiimpor dengan aliastf.)Berikut perbandingan berbasis kode kecil yang menunjukkan perbedaan ini -
2. tf.function dan AutoGraph
Sementara eager execution memungkinkan pemrograman imperatif, saat menyangkut pelatihan terdistribusi, optimisasi skala penuh, lingkungan produksi, eksekusi graph ala
TensorFlow 1.xmemiliki keunggulan dibanding eager execution. DiTensorFlow 2.0, Anda tetap memiliki eksekusi berbasis graph namun dengan cara yang lebih fleksibel. Ini dicapai dengantf.functiondanAutoGraph.tf.functionmemungkinkan Anda mendefinisikan graphTensorFlowdengan sintaks ala Python melalui fiturAutoGraph.AutoGraphmendukung beragam kompatibilitas Python termasukif-statement,for-loop,while-loop,Iterators, dll. Namun ada keterbatasan. Di sini Anda dapat menemukan daftar lengkap dukungan yang tersedia saat ini. Di bawah ini contoh yang menunjukkan betapa mudahnya mendefinisikan graphTensorFlowhanya dengan sebuahdecorator.Perhatikan bahwa Anda tidak perlu membuat session atau placeholder apa pun untuk menjalankan fungsi
single_layer(). Ini salah satu fitur praktis daritf.function. Di balik layar, ia melakukan semua optimisasi yang diperlukan agar kode Anda berjalan lebih cepat.3.
tf.variable_scopetidak lagi diperlukanDi
TensorFlow 1.x, untuk dapat menggunakantf.layerssebagai variabel dan menggunakannya kembali, Anda harus memakai bloktf.variable. Namun ini tidak lagi diperlukan diTensorFlow 2.0. Berkat kehadirankerassebagai API tingkat tinggi utama diTensorFlow 2.0, semua layer yang dibuat menggunakantf.layersdapat dengan mudah dimasukkan ke dalam definisitf.keras.Sequential. Ini membuat kode jauh lebih mudah dibaca, dan Anda juga dapat melacak variabel serta loss.Berikut contohnya:
Pada contoh di atas, Anda meneruskan data pelatihan melalui
modelhanya untuk mendapatkan probabilitas keluaran mentah. Perhatikan bahwa ini hanya forward pass. Tentu saja, Anda dapat melanjutkan dan melatih model Anda -Anda dapat memperoleh daftar parameter trainable model per layer seperti ini -
4. Custom Layer Jadi Sangat Mudah
Dalam riset machine learning atau bahkan aplikasi industri, sering kali ada kebutuhan untuk menulis layer kustom guna memenuhi use case tertentu.
TensorFlow 2.0membuat penulisan layer kustom menjadi sangat mudah dan menggunakannya bersama layer yang ada. Anda juga dapat menyesuaikan forward pass model Anda dengan cara apa pun yang Anda inginkan.Untuk membuat layer kustom, opsi termudah adalah mewarisi kelas
Layerdaritf.keras.layerslalu mendefinisikannya sesuai kebutuhan. Anda akan membuat layer kustom, lalu mendefinisikan komputasi forward-nya. Berikut adalah keluaran dari eksekusihelp(tf.keras.layers.Layer). Ini memberi tahu hal-hal yang perlu Anda tentukan agar berhasil:Mengikuti saran dari cuplikan di atas, Anda akan -
build()Anda akan menambahkan bobot untuk layer Andacall()Anda akan mendefinisikan forward pass dengan merangkai perkalian matriks danrelu()Anda dapat mengomposisikan beberapa layer dengan mewarisi kelas
Modeldaritf.keras. Anda dapat mempelajari lebih lanjut tentang komposisi model di sini.5. Fleksibilitas dalam Pelatihan Model
TensorFlowdapat menggunakan automatic differentiation untuk menghitung gradien fungsi loss terhadap parameter model.tf.GradientTapemembuat tape dalam sebuah konteks yang digunakanTensorFlowuntuk melacak gradien yang direkam dari setiap komputasi di tape tersebut. Untuk memahaminya, mari mendefinisikan model dengan cara yang lebih low-level dengan mewarisi kelastf.keras.Model.Perhatikan bahwa topologi model ini persis sama seperti yang Anda definisikan sebelumnya. Untuk dapat melatih model ini menggunakan automatic differentiation, Anda perlu mendefinisikan fungsi loss dan optimizer secara berbeda -
Anda kini akan mendefinisikan metrik yang akan digunakan untuk mengukur kinerja jaringan selama pelatihan. Yang dimaksud kinerja di sini adalah loss dan akurasi model.
tf.datamenyediakan metode utilitas untuk mendefinisikan pipeline data input. Ini sangat berguna terutama saat Anda menangani data dalam jumlah besar.Anda sekarang akan mendefinisikan generator data, yang akan menghasilkan batch data selama pelatihan model.
Anda sekarang siap melatih model menggunakan
tf.GradientTape. Pertama, Anda akan mendefinisikan metode yang akan melatih model dengan data yang baru saja Anda definisikan menggunakantf.data.DataSet. Anda juga akan membungkus langkah-langkah pelatihan model dengan decoratortf.functionuntuk memanfaatkan peningkatan kecepatan komputasi yang ditawarkannya.Pelatihan dan validasi model
Gunakan dua metode di atas untuk melatih dan memvalidasi model selama 5 epoch.
Contoh ini terinspirasi dari contoh ini dari para penulis
TensorFlow 2.0.6. TensorFlow Datasets
Modul terpisah bernama
DataSetsdigunakan untuk beroperasi dengan model jaringan secara elegan. Anda sudah melihat ini pada contoh sebelumnya. Di bagian ini, Anda akan melihat bagaimana memuat dataset MNIST sesuai kebutuhan Anda.Anda dapat memasang pustaka
tensorflow_datasetsdenganpip. Setelah terpasang, Anda siap melangkah. Pustaka ini menyediakan beberapa fungsi utilitas untuk membantu Anda menyiapkan pipeline konstruksi dataset secara fleksibel. Anda dapat mempelajari lebih lanjut tentang fungsi-fungsi ini di sini dan di sini. Sekarang Anda akan melihat bagaimana membangun pipeline input data untuk memuat dataset MNIST.Anda dapat mengabaikan peringatan. Perhatikan betapa elegan
tensorflow_datasetsmenangani pipeline.Sekarang Anda dapat menampilkan gambar pertama dari kumpulan gambar yang Anda muat. Catatan bahwa
tensorflow_datasetsbekerja dalam mode eager maupun dalam pengaturan berbasis graph.7. Kebijakan Automatic Mixed Precision
Kebijakan mixed precision diusulkan oleh NVIDIA tahun lalu. Anda dapat menemukan paper aslinya di sini. Gagasan singkat di balik kebijakan mixed precision adalah menggunakan campuran presisi setengah (FP16) dan penuh (FP32) dan mengambil keunggulan dari keduanya. Ini menunjukkan hasil yang luar biasa dalam pelatihan jaringan saraf yang sangat dalam (baik dari segi waktu maupun skor).
Jika Anda berada di lingkungan GPU yang mendukung CUDA (misalnya Generasi Volta, Tesla T4) dan Anda memasang varian GPU dari
TensorFlow 2.0, Anda dapat menginstruksikanTensorFlowuntuk melatih dengan mixed precision seperti ini -os.environ['TF_ENABLE_AUTO_MIXED_PRECISION'] = '1'Ini akan otomatis me-cast operasi pada graph TensorFlow sesuai kebijakan. Anda akan melihat peningkatan kinerja yang cukup baik pada model Anda. Anda juga dapat mengoptimalkan operasi inti TensorFlow dengan kebijakan mixed precision. Lihat artikel ini untuk mengetahui lebih lanjut.
Harap dicatat fitur ini hanya didukung di container TensorFlow dari NVIDIA. Untuk dapat mengintegrasikan pelatihan mixed-precision secara native di tf.keras, saya sarankan melihat artikel ini. Saya ingin berterima kasih kepada Abhishek Thanki yang telah menunjukkan hal ini kepada saya.
8. Pelatihan Terdistribusi
TensorFlow 2.0membuat proses pendistribusian pelatihan ke banyak GPU menjadi sangat mudah. Ini sangat berguna untuk keperluan produksi saat Anda harus memenuhi beban yang sangat berat. Semudah menempatkan blok pelatihan model Anda di dalam blokwith.Pertama, tentukan strategi distribusi seperti ini:
mirrored_strategy = tf.distribute.MirroredStrategy()Strategi mirrored membuat satu replika per GPU dan variabel model dicerminkan secara merata di seluruh GPU. Anda sekarang dapat menggunakan strategi yang ditentukan seperti berikut:
Catatan bahwa potongan kode di atas hanya akan berguna jika Anda memiliki banyak GPU yang dikonfigurasi pada satu sistem. Ada sejumlah strategi distribusi yang dapat Anda konfigurasikan. Anda dapat mempelajari lebih lanjut di sini.
9. TensorBoard di dalam Jupyter Notebook
Ini mungkin bagian paling menarik dari pembaruan ini. Anda dapat memvisualisasikan pelatihan model langsung di dalam Jupyter Notebook melalui
TensorBoard.TensorBoardbaru dilengkapi banyak fitur menarik seperti profiling memori, melihat data gambar termasuk confusion matrix, graph model konseptual, dan sebagainya. Anda dapat mempelajari lebih lanjut di sini.Pada bagian ini, Anda akan mengonfigurasi lingkungan sehingga
TensorBoardditampilkan di dalam Jupyter Notebook. Pertama Anda harus memuat ekstensi notebooktensorboard.notebook-Anda sekarang akan mendefinisikan callback
TensorBoardmenggunakan modultf.keras.callbacks.Bangun ulang model menggunakan API
Sequentialdaritf.keras-Train dan test set telah dimodifikasi untuk kegunaan yang berbeda. Jadi, ada baiknya membaginya lagi -
Anda siap untuk melatih model -
Dashboard
TensorBoardseharusnya dimuat di Jupyter Notebook Anda, dan Anda dapat menelusuri metrik pelatihan serta validasi.10. TensorFlow untuk Swift
Terlepas dari semua kesuksesan luar biasa, satu hal yang cukup menyedihkan tentang Python adalah bahwa Python itu lambat. Untuk membantu peneliti, praktisi, bahkan pemula, tim
TensorFlowtelah mengembangkan versi untuk Swift. Meskipun belum siap produksi seperti varian Python, ini jelas memiliki potensi. Swift memungkinkan interaksi level rendah dan modul kompilasi tingkat lanjut. Di sini Anda akan menemukan semua hal terkait varian TensorFlow untuk Swift. Anda juga dianjurkan untuk menyimak wawancara ini bersama Jeremy Howard yang dipandu oleh Josh Gordon di mana Jeremy berbagi pandangannya mengenai arah ini.Apa Selanjutnya?
Anda telah sampai di akhir artikel ini. Keindahan deep learning terletak pada penerapannya. Langkah berikutnya yang segera dapat Anda lakukan adalah mencoba ide-ide yang dibahas dalam artikel ini dan mengintegrasikannya. Pembaruan
TensorFlowini merupakan salah satu yang paling komprehensif dan ramah pengembang. Anda dianjurkan untuk melihat daftar tonton YouTube dariTensorFlowDev Summit tahun ini yang akan memberi Anda pembaruan tambahan tentangTensorFlow lattice,TensorFlow probability,TensorFlow lite, dan seterusnya.Jika Anda tertarik memperkuat pengetahuan deep learning, Anda dapat melihat kursus berikut:
Selamat
eager_executing!