Tutorial Keras: Apa itu Keras? Cara Memasang di Python [Contoh]

Apa itu Keras?

Keras adalah perpustakaan Jaringan Syaraf Sumber Terbuka yang tertulis Python yang berjalan di atas Theano atau Tensorflow. Ini dirancang agar modular, cepat dan mudah digunakan. Ini dikembangkan oleh François Chollet, seorang insinyur Google. Keras tidak menangani komputasi tingkat rendah. Sebaliknya, ia menggunakan perpustakaan lain untuk melakukannya, yang disebut “Backend.

Keras adalah pembungkus API tingkat tinggi untuk API tingkat rendah, yang mampu berjalan di atas TensorFlow, CNTK, atau Theano. Keras High-Level API menangani cara kita membuat model, mendefinisikan lapisan, atau menyiapkan beberapa model input-output. Pada level ini, Keras juga mengkompilasi model kita dengan fungsi loss dan optimizer, proses pelatihan dengan fungsi fit. Keras masuk Python tidak menangani API Tingkat Rendah seperti pembuatan grafik komputasi, pembuatan tensor atau variabel lainnya karena sudah ditangani oleh mesin “backend”.

Apa itu Backend?

Backend adalah istilah dalam Keras yang melakukan semua komputasi tingkat rendah seperti produk tensor, konvolusi, dan banyak hal lainnya dengan bantuan perpustakaan lain seperti Tensorflow atau Theano. Jadi, “mesin backend” akan melakukan komputasi dan pengembangan model. Tensorflow adalah “mesin backend” default tetapi kita dapat mengubahnya dalam konfigurasi.

Theano, Tensorflow, dan CNTK Backend

Bagian belakang Theano

Theano adalah proyek open source yang dikembangkan oleh kelompok MILA di Universitas Montreal, Quebec, Kanada. Ini adalah Framework pertama yang banyak digunakan. Ini adalah sebuah Python pustaka yang membantu dalam array multidimensi untuk operasi matematika menggunakan Numpy atau Scipy. Theano dapat menggunakan GPU untuk komputasi yang lebih cepat, ia juga dapat secara otomatis membuat grafik simbolik untuk menghitung gradien. Di situs webnya, Theano mengklaim bahwa ia dapat mengenali ekspresi numerik yang tidak stabil dan menghitungnya dengan algoritma yang lebih stabil, ini sangat berguna untuk ekspresi kita yang tidak stabil.

Bagian belakang TensorFlow

Di sisi lain, Tensorflow adalah bintang baru dalam kerangka pembelajaran mendalam. Dikembangkan oleh tim Brain Google, ini adalah alat pembelajaran mendalam yang paling populer. Dengan banyak fitur, dan peneliti berkontribusi membantu mengembangkan kerangka ini untuk tujuan pembelajaran mendalam.

Bagian belakang CNTK

Mesin backend lain untuk Keras adalah The Microsoft Perangkat Kognitif atau CNTK. Ini adalah kerangka pembelajaran mendalam sumber terbuka yang dikembangkan oleh Microsoft Tim. Ini dapat berjalan pada multi GPU atau multi-mesin untuk melatih model pembelajaran mendalam dalam skala besar. Dalam beberapa kasus, CNTK dilaporkan lebih cepat dibandingkan framework lain seperti Tensorflow atau Theano. Selanjutnya dalam tutorial Keras CNN ini, kita akan membandingkan backend Theano, TensorFlow, dan CNTK.

Membandingkan Backend

Kita perlu melakukan benchmark untuk mengetahui perbandingan kedua backend ini. Seperti yang Anda lihat di Patokan Jeong-Yoon Lee, kinerja 3 backend berbeda pada perangkat keras berbeda dibandingkan. Dan hasilnya adalah Theano lebih lambat dibandingkan backend lainnya, dilaporkan 50 kali lebih lambat, tetapi akurasinya mendekati satu sama lain.

Lain tes benchmark dilakukan oleh Jasmeet Bhatia. Dia melaporkan bahwa Theano lebih lambat dari Tensorflow untuk beberapa pengujian. Namun akurasi keseluruhan hampir sama untuk setiap jaringan yang diuji.

Jadi, antara Theano, Tensorflow, dan CTK, terlihat jelas bahwa TensorFlow lebih baik daripada Theano. Dengan TensorFlow, waktu komputasi jauh lebih singkat dan CNN lebih baik dibandingkan yang lain.

Selanjutnya di Keras ini Python tutorialnya, kita akan belajar tentang perbedaan Keras dan TensorFlow (Keras vs Tensorflow).

Keras vs Tensorflow

Parameters Keras aliran tensor
Tipe Pembungkus API Tingkat Tinggi API Tingkat Rendah
Kompleksitas Mudah digunakan jika Anda Python bahasa Anda perlu mempelajari sintaks penggunaan beberapa fungsi Tensorflow
Tujuan Penerapan cepat untuk membuat model dengan lapisan standar Memungkinkan Anda membuat grafik komputasi atau lapisan model yang sewenang-wenang
Tools Menggunakan alat debug API lainnya seperti TFDBG Anda dapat menggunakan alat visualisasi Tensorboard
Komunitas Komunitas aktif yang besar Komunitas besar yang aktif dan sumber daya yang dibagikan secara luas

Keunggulan Keras

Penerapan Cepat dan Mudah dimengerti

Keras sangat cepat membuat model jaringan. Jika Anda ingin membuat model jaringan sederhana dengan beberapa baris, Python Keras dapat membantu Anda dalam hal itu. Lihatlah contoh Keras di bawah ini:

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()
model.add(Dense(64, activation='relu', input_dim=50)) #input shape of 50
model.add(Dense(28, activation='relu')) #input shape of 50
model.add(Dense(10, activation='softmax'))

Karena API-nya ramah, kita dapat dengan mudah memahami prosesnya. Menulis kode dengan fungsi sederhana dan tidak perlu mengatur banyak parameter.

Dukungan Komunitas Besar

Ada banyak komunitas AI yang menggunakan Keras untuk kerangka Deep Learning mereka. Banyak dari mereka juga mempublikasikan kode mereka dan tutorialnya kepada masyarakat umum.

Memiliki banyak Backend

Anda dapat memilih Tensorflow, CNTK, dan Theano sebagai backend Anda dengan Keras. Anda dapat memilih backend berbeda untuk proyek berbeda bergantung pada kebutuhan Anda. Setiap backend memiliki keunggulan uniknya masing-masing.

Penerapan Model Lintas Platform dan Mudah

Dengan berbagai perangkat dan platform yang didukung, Anda dapat menerapkan Keras di perangkat apa pun

  • iOS dengan CoreML
  • Android dengan Tensorflow Android,
  • Browser web dengan dukungan .js
  • Mesin awan
  • raspberry Pi

Dukungan Multi GPU

Anda dapat melatih Keras pada satu GPU atau menggunakan beberapa GPU sekaligus. Karena Keras memiliki dukungan bawaan untuk paralelisme data sehingga dapat memproses data dalam jumlah besar dan mempercepat waktu yang dibutuhkan untuk melatihnya.

Kekurangan Keras

Tidak dapat menangani API tingkat rendah

Keras hanya menangani API tingkat tinggi yang berjalan di atas kerangka kerja atau mesin backend lain seperti Tensorflow, Theano, atau CNTK. Jadi tidak terlalu berguna jika Anda ingin membuat layer abstrak sendiri untuk keperluan penelitian karena Keras sudah memiliki lapisan yang sudah dikonfigurasi sebelumnya.

Menginstal Keras

Di bagian ini, kita akan melihat berbagai metode yang tersedia untuk menginstal Keras

Instal langsung atau Lingkungan Virtual

Mana yang lebih baik? Instal langsung ke python saat ini atau gunakan lingkungan virtual? Saya sarankan menggunakan lingkungan virtual jika Anda memiliki banyak proyek. Ingin tahu alasannya? Ini karena proyek yang berbeda mungkin menggunakan versi perpustakaan keras yang berbeda.

Misalnya, saya punya proyek yang perlu Python 3.5 menggunakan OpenCV 3.3 dengan backend Keras-Theano yang lebih lama tetapi di proyek lain saya harus menggunakan Keras dengan versi terbaru dan Tensorflow sebagai backendnya Python Dukungan 3.6.6

Kami tidak ingin perpustakaan Keras saling bertentangan, bukan? Jadi kami menggunakan Lingkungan Virtual untuk melokalisasi proyek dengan jenis perpustakaan tertentu atau kami dapat menggunakan platform lain seperti Layanan Cloud untuk melakukan komputasi untuk kami seperti Amazon Layanan web.

Menginstal Keras aktif Amazon Layanan Web (AWS)

Amazon Web Service adalah platform yang menawarkan layanan dan produk Cloud Computing untuk peneliti atau tujuan lainnya. AWS menyewakan perangkat keras, jaringan, Database, dll sehingga kami dapat menggunakannya langsung dari internet. Salah satu layanan AWS yang populer untuk tujuan pembelajaran mendalam adalah Amazon Layanan Pembelajaran Mendalam Gambar Mesin atau DL

Untuk instruksi mendetail tentang cara menggunakan AWS, lihat ini tutorial

Catatan pada AMI: Anda akan memiliki AMI berikut yang tersedia

Menginstal Keras di AWS

AWS Deep Learning AMI adalah lingkungan virtual di Layanan AWS EC2 yang membantu peneliti atau praktisi untuk bekerja dengan Deep Learning. DLAMI menawarkan mulai dari mesin CPU kecil hingga mesin multi GPU bertenaga tinggi dengan CUDA, cuDNN yang telah dikonfigurasi sebelumnya, dan dilengkapi dengan berbagai kerangka pembelajaran mendalam.

Jika Anda ingin menggunakannya secara instan, Anda harus memilih Deep Learning AMI karena sudah diinstal sebelumnya dengan kerangka pembelajaran mendalam yang populer.

Namun jika Anda ingin mencoba kerangka pembelajaran mendalam khusus untuk penelitian, Anda harus menginstal AMI Basis Pembelajaran Mendalam karena ia dilengkapi dengan pustaka dasar seperti CUDA, cuDNN, driver GPU, dan pustaka lain yang diperlukan untuk dijalankan dengan lingkungan pembelajaran mendalam Anda.

Cara Memasang Keras di Amazon SageMaker

Amazon SageMaker adalah platform pembelajaran mendalam untuk membantu Anda melatih dan menerapkan jaringan pembelajaran mendalam dengan algoritma terbaik.

Sebagai seorang pemula, ini adalah metode termudah untuk menggunakan Keras. Di bawah ini adalah proses cara menginstal Keras Amazon Pembuat Sage:

Langkah 1) Buka Amazon SageMaker

Pada langkah pertama, Buka Amazon Pembuat Sagem konsol dan klik Buat instance notebook.

Instal Keras aktif Amazon SageMaker

Langkah 2) Masukkan detailnya

  1. Masukkan nama buku catatan Anda.
  2. Buat peran IAM. Ini akan membuat peran AMI Amazon Peran IAM dalam format AmazonSageMaker-Peran Eksekusi-YYYYMMDD|HHmmSS.
  3. Terakhir, pilih Buat instans buku catatan. Setelah beberapa saat, Amazon Sagemaker meluncurkan contoh notebook.

Instal Keras aktif Amazon SageMaker

Note: Jika Anda ingin mengakses sumber daya dari VPC Anda, tetapkan akses internet langsung sebagai diaktifkan. Jika tidak, instans notebook ini tidak akan memiliki akses internet, sehingga tidak mungkin untuk melatih atau menghosting model.

Langkah 3) Luncurkan instance

Klik Buka untuk meluncurkan instance

Instal Keras aktif Amazon SageMaker

Langkah 4) Mulai coding

In Jupyter, Klik Baru> conda_tensorflow_p36 dan Anda siap membuat kode

Instal Keras aktif Amazon SageMaker

Instal Keras di Linux

Untuk mengaktifkan Keras dengan Tensorflow sebagai mesin backendnya, kita perlu menginstal Tensorflow terlebih dahulu. Jalankan perintah ini untuk menginstal tensorflow dengan CPU (tanpa GPU)

pip install --upgrade tensorflow

jika Anda ingin mengaktifkan dukungan GPU untuk tensorflow Anda dapat menggunakan perintah ini

pip install --upgrade tensorflow-gpu

Instal Keras di Linux

mari kita check in Python untuk melihat apakah instalasi kita berhasil dengan mengetik

user@user:~$ python
Python 3.6.4 (default, Mar 20 2018, 11:10:20) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>>

jika tidak ada pesan error maka proses instalasi berhasil

Instal Keras

Setelah kita menginstal Tensorflow, mari mulai menginstal keras. Ketik perintah ini di terminal

pip install keras

itu akan mulai menginstal Keras dan juga semua dependensinya. Anda akan melihat sesuatu seperti ini:

Instal Keras

Sekarang kami telah menginstal Keras di sistem kami!

Verifikasi

Sebelum kita mulai menggunakan Keras, kita harus memeriksa apakah Keras kita menggunakan Tensorflow sebagai backend dengan membuka file konfigurasi:

gedit ~/.keras/keras.json

Anda akan melihat sesuatu seperti ini

{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "tensorflow",
    "image_data_format": "channels_last"
}

seperti yang Anda lihat, "backend" menggunakan tensorflow. Artinya keras menggunakan Tensorflow sebagai backendnya seperti yang kita harapkan

dan sekarang jalankan di terminal dengan mengetik

user@user:~$ python3
Python 3.6.4 (default, Mar 20 2018, 11:10:20) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>> 

Cara Memasang Keras di Windows

Sebelum kita menginstal aliran tensor dan Keras, kita harus menginstal Python, pip, dan virtualenv. Jika Anda sudah menginstal pustaka ini, Anda harus melanjutkan ke langkah berikutnya, jika tidak, lakukan hal berikut:

Install Python 3 dengan mengunduh dari ini link

Instal pip dengan menjalankan ini

Instal virtualenv dengan perintah ini

pip3 install –U pip virtualenv

Install Microsoft visual C++ Pembaruan 2015 yang Dapat Didistribusikan Ulang 3

Kemudian jalankan skrip ini

pip3 install virtualenv

Siapkan Lingkungan Virtual

Ini digunakan untuk mengisolasi sistem kerja dengan sistem utama.

virtualenv –-system-site-packages –p python3 ./venv

Aktifkan lingkungan

.\venv\Scripts\activate

Setelah menyiapkan lingkungan, instalasi Tensorflow dan Keras tetap sama seperti Linux. Selanjutnya dalam tutorial Pembelajaran Mendalam dengan Keras ini, kita akan belajar tentang dasar-dasar Keras untuk Pembelajaran Mendalam.

Dasar-dasar Keras untuk Pembelajaran Mendalam

Struktur utama di Keras adalah Model yang mendefinisikan grafik lengkap suatu jaringan. Anda dapat menambahkan lebih banyak lapisan ke model yang sudah ada untuk membangun model kustom yang Anda perlukan untuk proyek Anda.

Berikut cara membuat Model Sequential dan beberapa lapisan yang umum digunakan dalam deep learning

1. Model Berurutan

from keras.models import Sequential
from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout

model = Sequential()

2. Lapisan Konvolusi

Ini adalah Keras Python contoh convolutional layer sebagai input layer dengan bentuk input 320x320x3, dengan 48 filter ukuran 3×3 dan menggunakan ReLU sebagai fungsi aktivasi.

input_shape=(320,320,3) #this is the input shape of an image 320x320x3
model.add(Conv2D(48, (3, 3), activation='relu', input_shape= input_shape))

tipe lainnya adalah

model.add(Conv2D(48, (3, 3), activation='relu'))

3. MaksPooling Lapisan

Untuk menurunkan sampel representasi input, gunakan MaxPool2d dan tentukan ukuran kernel

model.add(MaxPooling2D(pool_size=(2, 2)))

4. Lapisan Padat

menambahkan Lapisan Terhubung Sepenuhnya hanya dengan menentukan Ukuran keluaran

model.add(Dense(256, activation='relu'))

5. Lapisan Putus Sekolah

Menambahkan lapisan putus sekolah dengan probabilitas 50%.

model.add(Dropout(0.5))

Menyusun, Melatih, dan Mengevaluasi

Setelah kita mendefinisikan model kita, mari kita mulai melatihnya. Diperlukan kompilasi jaringan terlebih dahulu dengan fungsi loss dan fungsi optimizer. Hal ini akan memungkinkan jaringan untuk mengubah bobot dan meminimalkan kerugian.

model.compile(loss='mean_squared_error', optimizer='adam')

Sekarang untuk memulai pelatihan, gunakan fit untuk memasukkan data pelatihan dan validasi ke model. Ini akan memungkinkan Anda untuk melatih jaringan dalam batch dan mengatur waktu.

model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))

Langkah terakhir kita adalah mengevaluasi model dengan data pengujian.

score = model.evaluate(x_test, y_test, batch_size=32)

Mari kita coba menggunakan regresi linier sederhana

import keras
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
import matplotlib.pyplot as plt 
 
x = data = np.linspace(1,2,200)
y = x*4 + np.random.randn(*x.shape) * 0.3


model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear'))

model.compile(optimizer='sgd', loss='mse', metrics=['mse'])

weights = model.layers[0].get_weights()
w_init = weights[0][0][0]
b_init = weights[1][0]
print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init)) 


model.fit(x,y, batch_size=1, epochs=30, shuffle=False)

weights = model.layers[0].get_weights()
w_final = weights[0][0][0]
b_final = weights[1][0]
print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final))

predict = model.predict(data)

plt.plot(data, predict, 'b', data , y, 'k.')
plt.show()

Setelah data dilatih, outputnya akan terlihat seperti ini

linear Regression

dengan berat awalnya

Linear regression model is initialized with weights w: 0.37, b: 0.00

dan berat akhir

Linear regression model is trained to have weight w: 3.70, b: 0.61

Sempurnakan Model Terlatih di Keras dan Cara Menggunakannya

Mengapa kami menggunakan Model Fine Tune dan kapan kami menggunakannya

Penyempurnaan adalah tugas untuk mengubah model yang telah dilatih sebelumnya sehingga parameternya dapat beradaptasi dengan model baru. Saat kita ingin melatih model baru dari awal, kita memerlukan data dalam jumlah besar, agar jaringan dapat menemukan semua parameter. Namun dalam kasus ini, kami akan menggunakan model terlatih sehingga parameternya sudah dipelajari dan memiliki bobot.

Misalnya, jika kita ingin melatih model Keras kita sendiri untuk menyelesaikan masalah klasifikasi tetapi kita hanya memiliki sedikit data, maka kita dapat menyelesaikannya dengan menggunakan a Transfer Belajar + Metode Penyempurnaan.

Dengan menggunakan jaringan & bobot yang telah dilatih sebelumnya, kita tidak perlu melatih seluruh jaringan. Kita hanya perlu melatih lapisan terakhir yang digunakan untuk menyelesaikan tugas kita yang kita sebut metode Fine-Tuning.

Persiapan Model Jaringan

Untuk model yang telah dilatih sebelumnya, kita dapat memuat berbagai model yang sudah dimiliki Keras di perpustakaannya seperti:

  • VGG16
  • AwalV3
  • ResNet
  • Jaringan Seluler
  • *ception
  • AwalResNetV2

Namun dalam proses ini, kami akan menggunakan model jaringan VGG16 dan imageNet sebagai bobot model kami. Kami akan menyempurnakan jaringan untuk mengklasifikasikan 8 jenis kelas berbeda menggunakan Gambar dari Kumpulan Data Gambar Alami Kaggle

Arsitektur model VGG16

Arsitektur model VGG16

sumber

Mengunggah Data Kami ke AWS S3 Bucket

Untuk proses latihannya kita akan menggunakan gambar gambar alam dari 8 kelas yang berbeda seperti pesawat terbang, mobil, kucing, anjing, bunga, buah, sepeda motor, dan orang. Pertama, kita perlu mengunggah data kita ke Amazon ember S3.

Amazon Ember S3

Langkah 1) Setelah login ke akun S3 Anda, mari buat bucket dengan clocking Buat Bucket

Mengunggah Data ke Bucket AWS S3

Langkah 2) Sekarang pilih Nama Bucket dan Wilayah Anda sesuai dengan akun Anda. Pastikan nama bucket tersedia. Setelah itu klik Buat.

Mengunggah Data ke Bucket AWS S3

Langkah 3) Seperti yang Anda lihat, Bucket Anda siap digunakan. Namun seperti yang Anda lihat, Aksesnya Bukan untuk publik, ada baiknya Anda jika ingin merahasiakannya untuk Anda sendiri. Anda dapat mengubah bucket ini untuk Akses Publik di Properti Bucket

Mengunggah Data ke Bucket AWS S3

Langkah 4) Sekarang Anda mulai mengunggah data pelatihan Anda ke Bucket Anda. Disini saya akan mengupload file tar.gz yang berisi gambar untuk proses pelatihan dan pengujian.

Mengunggah Data ke Bucket AWS S3

Langkah 5) Sekarang klik pada file Anda dan salin Link agar kita bisa mendownloadnya.

Mengunggah Data ke Bucket AWS S3

Persiapan data

Kita perlu menghasilkan data pelatihan menggunakan Keras ImageDataGenerator.

Pertama, Anda harus mengunduh menggunakan wget dengan tautan ke file Anda dari S3 Bucket.

!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz		
!tar -xzf images.tar.gz

Setelah Anda mengunduh data, mari kita mulai Proses Pelatihan.

from keras.preprocessing.image import ImageDataGenerator
import numpy as np
import matplotlib.pyplot as plt

train_path = 'images/train/'
test_path = 'images/test/'
batch_size = 16
image_size = 224
num_class = 8


train_datagen = ImageDataGenerator(validation_split=0.3,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True)

train_generator = train_datagen.flow_from_directory(
                        directory=train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='categorical',
                        color_mode='rgb',
                        shuffle=True)

Data GambarGenerator akan membuat data X_training dari direktori. Subdirektori dalam direktori tersebut akan digunakan sebagai kelas untuk setiap objek. Gambar akan dimuat dengan mode warna RGB, dengan mode kelas kategorikal untuk data Y_training, dengan ukuran batch 16. Terakhir, kocok datanya.

Mari kita lihat gambar kita secara acak dengan memplotnya menggunakan matplotlib

x_batch, y_batch = train_generator.next()

fig=plt.figure()
columns = 4
rows = 4
for i in range(1, columns*rows):
    num = np.random.randint(batch_size)
    image = x_batch[num].astype(np.int)
    fig.add_subplot(rows, columns, i)
    plt.imshow(image)
plt.show()

Persiapan data

Setelah itu mari kita buat model jaringan kita dari VGG16 dengan bobot terlatih imageNet. Kami akan membekukan lapisan ini sehingga lapisan tersebut tidak dapat dilatih untuk membantu kami mengurangi waktu komputasi.

Membuat Model kami dari VGG16

import keras
from keras.models import Model, load_model
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.vgg16 import VGG16


#Load the VGG model
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3))

print(base_model.summary())

    # Freeze the layers 
for layer in base_model.layers:
    layer.trainable = False
 
# # Create the model
model = keras.models.Sequential()

# # Add the vgg convolutional base model
model.add(base_model)
 
# # Add new layers
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(num_class, activation='softmax'))
 
# # Show a summary of the model. Check the number of trainable parameters    
print(model.summary())

Seperti yang Anda lihat di bawah, ringkasan model jaringan kami. Dari masukan dari VGG16 Layers, kemudian kita tambahkan 2 Fully Connected Layer yang akan mengekstrak 1024 fitur dan satu output layer yang akan menghitung 8 kelas dengan aktivasi softmax.

Layer (type)                 Output Shape              Param #   
=================================================================
vgg16 (Model)                (None, 7, 7, 512)         14714688  
_________________________________________________________________
flatten_1 (Flatten)          (None, 25088)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 1024)              25691136  
_________________________________________________________________
dense_2 (Dense)              (None, 1024)              1049600   
_________________________________________________________________
dense_3 (Dense)              (None, 8)                 8200      
=================================================================
Total params: 41,463,624
Trainable params: 26,748,936
Non-trainable params: 14,714,688

Pelatihan

# # Compile the model
from keras.optimizers import SGD

model.compile(loss='categorical_crossentropy',
          optimizer=SGD(lr=1e-3),
          metrics=['accuracy'])

# # Start the training process
# model.fit(x_train, y_train, validation_split=0.30, batch_size=32, epochs=50, verbose=2)

# # #save the model
# model.save('catdog.h5')

history = model.fit_generator(
        train_generator,
        steps_per_epoch=train_generator.n/batch_size,
        epochs=10)
        
model.save('fine_tune.h5')

# summarize history for accuracy
import matplotlib.pyplot as plt

plt.plot(history.history['loss'])
plt.title('loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['loss'], loc='upper left')
plt.show()

Hasil

Epoch 1/10
432/431 [==============================] - 53s 123ms/step - loss: 0.5524 - acc: 0.9474 
Epoch 2/10
432/431 [==============================] - 52s 119ms/step - loss: 0.1571 - acc: 0.9831
Epoch 3/10
432/431 [==============================] - 51s 119ms/step - loss: 0.1087 - acc: 0.9871
Epoch 4/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0624 - acc: 0.9926
Epoch 5/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0591 - acc: 0.9938
Epoch 6/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0498 - acc: 0.9936
Epoch 7/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0403 - acc: 0.9958
Epoch 8/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0248 - acc: 0.9959
Epoch 9/10
432/431 [==============================] - 51s 119ms/step - loss: 0.0466 - acc: 0.9942
Epoch 10/10
432/431 [==============================] - 52s 120ms/step - loss: 0.0338 - acc: 0.9947

Pelatihan

Seperti yang Anda lihat, kerugian kami berkurang secara signifikan dan akurasinya hampir 100%. Untuk menguji model kami, kami mengambil gambar secara acak melalui internet dan meletakkannya di folder pengujian dengan kelas berbeda untuk diuji

Menguji Model Kami

model = load_model('fine_tune.h5')

test_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(
                        directory=train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='categorical',
                        color_mode='rgb',
                        shuffle=True)

test_generator = test_datagen.flow_from_directory(
                        directory=test_path, 
                        target_size=(image_size, image_size),
                        color_mode='rgb',
                        shuffle=False,
                        class_mode='categorical',
                        batch_size=1)

filenames = test_generator.filenames
nb_samples = len(filenames)

fig=plt.figure()
columns = 4
rows = 4
for i in range(1, columns*rows -1):
    x_batch, y_batch = test_generator.next()

    name = model.predict(x_batch)
    name = np.argmax(name, axis=-1)
    true_name = y_batch
    true_name = np.argmax(true_name, axis=-1)

    label_map = (test_generator.class_indices)
    label_map = dict((v,k) for k,v in label_map.items()) #flip k,v
    predictions = [label_map[k] for k in name]
    true_value = [label_map[k] for k in true_name]

    image = x_batch[0].astype(np.int)
    fig.add_subplot(rows, columns, i)
    plt.title(str(predictions[0]) + ':' + str(true_value[0]))
    plt.imshow(image)
plt.show()

Dan pengujian kami seperti yang diberikan di bawah ini! Hanya 1 gambar yang diprediksi salah dari pengujian 14 gambar!

Model Pengujian

Jaringan Syaraf Pengenalan Wajah dengan Keras

Mengapa kita membutuhkan Pengakuan

Kita membutuhkan Recognition untuk memudahkan kita mengenali atau mengidentifikasi wajah seseorang, jenis benda, perkiraan usia seseorang dari wajahnya, atau bahkan mengetahui ekspresi wajah orang tersebut.

Jaringan Syaraf Pengenalan Wajah dengan Keras

Mungkin Anda menyadari setiap kali Anda mencoba menandai wajah teman Anda di sebuah foto, fitur di Facebook telah melakukannya untuk Anda, yaitu menandai wajah teman Anda tanpa Anda perlu menandainya terlebih dahulu. Inilah Face Recognition yang diterapkan Facebook untuk memudahkan kita menandai teman.

Jadi bagaimana cara kerjanya? Setiap kali kita menandai wajah teman kita, AI Facebook akan mempelajarinya dan mencoba memprediksinya hingga mendapatkan hasil yang tepat. Sistem yang sama akan kita gunakan untuk membuat Pengenalan Wajah kita sendiri. Mari mulai membuat Pengenalan Wajah kita sendiri menggunakan Deep Learning

Model Jaringan

Kami akan menggunakan Model Jaringan VGG16 tetapi dengan bobot VGGFace.

Arsitektur model VGG16

Model Jaringan

Apa itu VGGFace? Ini adalah implementasi Keras dari Deep Face Recognition yang diperkenalkan oleh Parkhi, Omkar M. et al. “Deep Face Recognition.” BMVC (2015). Kerangka kerja ini menggunakan VGG16 sebagai arsitektur jaringan.

Anda dapat mengunduh VGGFace dari github

from keras.applications.vgg16 import VGG16
from keras_vggface.vggface import VGGFace

face_model = VGGFace(model='vgg16', 
                weights='vggface',
                input_shape=(224,224,3)) 
face_model.summary()

Seperti yang Anda lihat ringkasan jaringan

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
conv1_1 (Conv2D)             (None, 224, 224, 64)      1792      
_________________________________________________________________
conv1_2 (Conv2D)             (None, 224, 224, 64)      36928     
_________________________________________________________________
pool1 (MaxPooling2D)         (None, 112, 112, 64)      0         
_________________________________________________________________
conv2_1 (Conv2D)             (None, 112, 112, 128)     73856     
_________________________________________________________________
conv2_2 (Conv2D)             (None, 112, 112, 128)     147584    
_________________________________________________________________
pool2 (MaxPooling2D)         (None, 56, 56, 128)       0         
_________________________________________________________________
conv3_1 (Conv2D)             (None, 56, 56, 256)       295168    
_________________________________________________________________
conv3_2 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
conv3_3 (Conv2D)             (None, 56, 56, 256)       590080    
_________________________________________________________________
pool3 (MaxPooling2D)         (None, 28, 28, 256)       0         
_________________________________________________________________
conv4_1 (Conv2D)             (None, 28, 28, 512)       1180160   
_________________________________________________________________
conv4_2 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
conv4_3 (Conv2D)             (None, 28, 28, 512)       2359808   
_________________________________________________________________
pool4 (MaxPooling2D)         (None, 14, 14, 512)       0         
_________________________________________________________________
conv5_1 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_2 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
conv5_3 (Conv2D)             (None, 14, 14, 512)       2359808   
_________________________________________________________________
pool5 (MaxPooling2D)         (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc6 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc6/relu (Activation)        (None, 4096)              0         
_________________________________________________________________
fc7 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
fc7/relu (Activation)        (None, 4096)              0         
_________________________________________________________________
fc8 (Dense)                  (None, 2622)              10742334  
_________________________________________________________________
fc8/softmax (Activation)     (None, 2622)              0         
=================================================================
Total params: 145,002,878
Trainable params: 145,002,878
Non-trainable params: 0
_________________________________________________________________
Traceback (most recent call last):

kami akan melakukan a Transfer Belajar + Penyempurnaan untuk mempercepat pelatihan dengan kumpulan data kecil. Pertama, kita akan membekukan lapisan dasar sehingga lapisan tersebut tidak dapat dilatih.

for layer in face_model.layers:
    layer.trainable = False

lalu kita menambahkan layer kita sendiri untuk mengenali wajah pengujian kita. Kami akan menambahkan 2 lapisan yang terhubung sepenuhnya dan lapisan keluaran dengan 5 orang untuk dideteksi.

from keras.models import Model, Sequential
from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dense, Dropout, Activation

person_count = 5

last_layer = face_model.get_layer('pool5').output

x = Flatten(name='flatten')(last_layer)
x = Dense(1024, activation='relu', name='fc6')(x)
x = Dense(1024, activation='relu', name='fc7')(x)
out = Dense(person_count, activation='softmax', name='fc8')(x)

custom_face = Model(face_model.input, out)

Mari kita lihat ringkasan jaringan kita

Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0
_________________________________________________________________
conv1_1 (Conv2D)             (None, 224, 224, 64)      1792
_________________________________________________________________
conv1_2 (Conv2D)             (None, 224, 224, 64)      36928
_________________________________________________________________
pool1 (MaxPooling2D)         (None, 112, 112, 64)      0
_________________________________________________________________
conv2_1 (Conv2D)             (None, 112, 112, 128)     73856
_________________________________________________________________
conv2_2 (Conv2D)             (None, 112, 112, 128)     147584
_________________________________________________________________
pool2 (MaxPooling2D)         (None, 56, 56, 128)       0
_________________________________________________________________
conv3_1 (Conv2D)             (None, 56, 56, 256)       295168
_________________________________________________________________
conv3_2 (Conv2D)             (None, 56, 56, 256)       590080
_________________________________________________________________
conv3_3 (Conv2D)             (None, 56, 56, 256)       590080
_________________________________________________________________
pool3 (MaxPooling2D)         (None, 28, 28, 256)       0
_________________________________________________________________
conv4_1 (Conv2D)             (None, 28, 28, 512)       1180160
_________________________________________________________________
conv4_2 (Conv2D)             (None, 28, 28, 512)       2359808
_________________________________________________________________
conv4_3 (Conv2D)             (None, 28, 28, 512)       2359808
_________________________________________________________________
pool4 (MaxPooling2D)         (None, 14, 14, 512)       0
_________________________________________________________________
conv5_1 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
conv5_2 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
conv5_3 (Conv2D)             (None, 14, 14, 512)       2359808
_________________________________________________________________
pool5 (MaxPooling2D)         (None, 7, 7, 512)         0
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0
_________________________________________________________________
fc6 (Dense)                  (None, 1024)              25691136
_________________________________________________________________
fc7 (Dense)                  (None, 1024)              1049600
_________________________________________________________________
fc8 (Dense)                  (None, 5)                 5125
=================================================================
Total params: 41,460,549
Trainable params: 26,745,861
Non-trainable params: 14,714,688

Seperti yang Anda lihat di atas, setelah lapisan pool5, lapisan tersebut akan diratakan menjadi satu vektor fitur yang akan digunakan oleh lapisan padat untuk pengenalan akhir.

Mempersiapkan Wajah kita

Sekarang mari kita persiapkan wajah kita. Saya membuat direktori yang terdiri dari 5 orang terkenal

  • Jack Ma
  • Jason Statham
  • Johnny Depp
  • Robert Downey Jr
  • Rowan Atkinson

Setiap folder berisi 10 gambar, untuk setiap proses pelatihan dan evaluasi. Jumlah datanya sangat kecil, tetapi itulah tantangannya, bukan?

Kami akan menggunakan bantuan alat Keras untuk membantu kami menyiapkan data. Fungsi ini akan melakukan iterasi pada folder dataset lalu menyiapkannya agar dapat digunakan dalam pelatihan.

from keras.preprocessing.image import ImageDataGenerator
batch_size = 5
train_path = 'data/'
eval_path = 'eval/'

train_datagen = ImageDataGenerator(rescale=1./255,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True)

valid_datagen = ImageDataGenerator(rescale=1./255,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True)

train_generator = train_datagen.flow_from_directory(
                        train_path,
                        target_size=(image_size,image_size),
                        batch_size=batch_size,
                        class_mode='sparse',
                        color_mode='rgb')

valid_generator = valid_datagen.flow_from_directory(
    directory=eval_path,
    target_size=(224, 224),
    color_mode='rgb',
    batch_size=batch_size,
    class_mode='sparse',
    shuffle=True,
)

Melatih Model Kami

Mari kita mulai proses pelatihan kita dengan mengkompilasi jaringan kita dengan fungsi kerugian dan pengoptimal. Di sini, kami menggunakan sparse_categorical_crossentropy sebagai fungsi kerugian, dengan bantuan SGD sebagai pengoptimal pembelajaran kami.

from keras.optimizers import SGD

custom_face.compile(loss='sparse_categorical_crossentropy',
                         optimizer=SGD(lr=1e-4, momentum=0.9),
                         metrics=['accuracy'])

history = custom_face.fit_generator(
        train_generator,
        validation_data=valid_generator,
        steps_per_epoch=49/batch_size,
        validation_steps=valid_generator.n,
        epochs=50)

custom_face.evaluate_generator(generator=valid_generator)
        
custom_face.save('vgg_face.h5')
Epoch 25/50
10/9 [==============================] - 60s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5659 - val_acc: 0.5851
Epoch 26/50
10/9 [==============================] - 59s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5638 - val_acc: 0.5809
Epoch 27/50
10/9 [==============================] - 60s 6s/step - loss: 1.4779 - acc: 0.8597 - val_loss: 1.5613 - val_acc: 0.5477
Epoch 28/50
10/9 [==============================] - 60s 6s/step - loss: 1.4755 - acc: 0.9199 - val_loss: 1.5576 - val_acc: 0.5809
Epoch 29/50
10/9 [==============================] - 60s 6s/step - loss: 1.4794 - acc: 0.9153 - val_loss: 1.5531 - val_acc: 0.5892
Epoch 30/50
10/9 [==============================] - 60s 6s/step - loss: 1.4714 - acc: 0.8953 - val_loss: 1.5510 - val_acc: 0.6017
Epoch 31/50
10/9 [==============================] - 60s 6s/step - loss: 1.4552 - acc: 0.9199 - val_loss: 1.5509 - val_acc: 0.5809
Epoch 32/50
10/9 [==============================] - 60s 6s/step - loss: 1.4504 - acc: 0.9199 - val_loss: 1.5492 - val_acc: 0.5975
Epoch 33/50
10/9 [==============================] - 60s 6s/step - loss: 1.4497 - acc: 0.8998 - val_loss: 1.5490 - val_acc: 0.5851
Epoch 34/50
10/9 [==============================] - 60s 6s/step - loss: 1.4453 - acc: 0.9399 - val_loss: 1.5529 - val_acc: 0.5643
Epoch 35/50
10/9 [==============================] - 60s 6s/step - loss: 1.4399 - acc: 0.9599 - val_loss: 1.5451 - val_acc: 0.5768
Epoch 36/50
10/9 [==============================] - 60s 6s/step - loss: 1.4373 - acc: 0.8998 - val_loss: 1.5424 - val_acc: 0.5768
Epoch 37/50
10/9 [==============================] - 60s 6s/step - loss: 1.4231 - acc: 0.9199 - val_loss: 1.5389 - val_acc: 0.6183
Epoch 38/50
10/9 [==============================] - 59s 6s/step - loss: 1.4247 - acc: 0.9199 - val_loss: 1.5372 - val_acc: 0.5934
Epoch 39/50
10/9 [==============================] - 60s 6s/step - loss: 1.4153 - acc: 0.9399 - val_loss: 1.5406 - val_acc: 0.5560
Epoch 40/50
10/9 [==============================] - 60s 6s/step - loss: 1.4074 - acc: 0.9800 - val_loss: 1.5327 - val_acc: 0.6224
Epoch 41/50
10/9 [==============================] - 60s 6s/step - loss: 1.4023 - acc: 0.9800 - val_loss: 1.5305 - val_acc: 0.6100
Epoch 42/50
10/9 [==============================] - 59s 6s/step - loss: 1.3938 - acc: 0.9800 - val_loss: 1.5269 - val_acc: 0.5975
Epoch 43/50
10/9 [==============================] - 60s 6s/step - loss: 1.3897 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.6432
Epoch 44/50
10/9 [==============================] - 60s 6s/step - loss: 1.3828 - acc: 0.9800 - val_loss: 1.5210 - val_acc: 0.6556
Epoch 45/50
10/9 [==============================] - 59s 6s/step - loss: 1.3848 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.5975
Epoch 46/50
10/9 [==============================] - 60s 6s/step - loss: 1.3716 - acc: 0.9800 - val_loss: 1.5216 - val_acc: 0.6432
Epoch 47/50
10/9 [==============================] - 60s 6s/step - loss: 1.3721 - acc: 0.9800 - val_loss: 1.5195 - val_acc: 0.6266
Epoch 48/50
10/9 [==============================] - 60s 6s/step - loss: 1.3622 - acc: 0.9599 - val_loss: 1.5108 - val_acc: 0.6141
Epoch 49/50
10/9 [==============================] - 60s 6s/step - loss: 1.3452 - acc: 0.9399 - val_loss: 1.5140 - val_acc: 0.6432
Epoch 50/50
10/9 [==============================] - 60s 6s/step - loss: 1.3387 - acc: 0.9599 - val_loss: 1.5100 - val_acc: 0.6266

Seperti yang Anda lihat, akurasi validasi kami mencapai 64%, ini adalah hasil yang bagus untuk sejumlah kecil data pelatihan. Kita dapat memperbaikinya dengan menambahkan lebih banyak lapisan atau menambahkan lebih banyak gambar pelatihan sehingga model kita dapat mempelajari lebih lanjut tentang wajah dan mencapai akurasi yang lebih tinggi.

Mari kita uji model kita dengan gambar uji

Gambar Uji

from keras.models import load_model
from keras.preprocessing.image import load_img, save_img, img_to_array
from keras_vggface.utils import preprocess_input

test_img = image.load_img('test.jpg', target_size=(224, 224))
img_test = image.img_to_array(test_img)
img_test = np.expand_dims(img_test, axis=0)
img_test = utils.preprocess_input(img_test)
predictions = model.predict(img_test)
predicted_class=np.argmax(predictions,axis=1)

labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class]
print(predictions)
['RobertDJr']

menggunakan gambar Robert Downey Jr. sebagai gambar pengujian kami, ini menunjukkan bahwa wajah yang diprediksi itu benar!

Prediksi menggunakan Live Cam!

Bagaimana jika kita menguji kemampuan kita dengan mengimplementasikannya dengan masukan dari webcam? Menggunakan OpenCV dengan Haar Face cascade untuk menemukan wajah kita dan dengan bantuan model jaringan kita, kita dapat mengenali orang tersebut.

Langkah pertama adalah mempersiapkan wajah Anda dan teman Anda. Semakin banyak data yang kita miliki maka semakin baik hasilnya!

Persiapkan dan latih jaringan Anda seperti langkah sebelumnya, setelah pelatihan selesai, tambahkan baris ini untuk mendapatkan gambar masukan dari kamera

#Load trained model
from keras.models import load_model
from keras_vggface import utils
import cv2

image_size = 224
device_id = 0 #camera_device id 

model = load_model('my faces.h5')

#make labels according to your dataset folder 
labels = dict(fisrtname=0,secondname=1) #and so on
print(labels)

cascade_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
camera = cv2.VideoCapture(device_id)

while camera.isOpened():
    ok, cam_frame = camera.read()
    if not ok:
        break
    
    gray_img=cv2.cvtColor(cam_frame, cv2.COLOR_BGR2GRAY)
    faces= cascade_classifier.detectMultiScale(gray_img, minNeighbors=5)

    for (x,y,w,h) in faces:
        cv2.rectangle(cam_frame,(x,y),(x+w,y+h),(255,255,0),2)
        roi_color = cam_frame [y:y+h, x:x+w]
        roi color = cv2.cvtColor(roi_color, cv2.COLOR_BGR2RGB)
        roi_color = cv2.resize(roi_color, (image_size, image_size))
        image = roi_color.astype(np.float32, copy=False)
        image = np.expand_dims(image, axis=0)
        image = preprocess_input(image, version=1) # or version=2
        preds = model.predict(image)
        predicted_class=np.argmax(preds,axis=1)

        labels = dict((v,k) for k,v in labels.items())
        name = [labels[k] for k in predicted_class]

        cv2.putText(cam_frame,str(name), 
                    (x + 10, y + 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255), 2)
        
    cv2.imshow('video image', cam_frame)
    key = cv2.waitKey(30)
    if key == 27: # press 'ESC' to quit
        break

camera.release()
cv2.destroyAllWindows()

Mana yang lebih baik? Keras atau Tensorflow

Keras menawarkan kesederhanaan saat menulis naskah. Kita bisa mulai menulis dan memahaminya langsung dengan Keras karena tidak terlalu sulit untuk memahaminya. Lebih user-friendly dan mudah diimplementasikan, tidak perlu membuat banyak variabel untuk menjalankan model. Jadi, kita tidak perlu memahami setiap detail dalam proses backend.

Di sisi lain, Tensorflow adalah operasi tingkat rendah yang menawarkan fleksibilitas dan operasi tingkat lanjut jika Anda ingin membuat grafik atau model komputasi yang sewenang-wenang. Tensorflow juga dapat memvisualisasikan proses dengan bantuan Papan Tensor dan alat debugger khusus.

Jadi, jika Anda ingin mulai bekerja dengan deep learning tanpa terlalu banyak kerumitan, gunakan Keras. Karena Keras menawarkan kesederhanaan dan mudah digunakan serta mudah diimplementasikan daripada Tensorflow. Namun, jika Anda ingin menulis algoritme Anda sendiri dalam proyek atau penelitian deep learning, Anda harus menggunakan Tensorflow.

Kesimpulan

Jadi mari kita rangkum semua yang telah kita bahas dan lakukan dalam tutorial ini.

  • Keras dalam API tingkat tinggi yang digunakan untuk membuat jaringan pembelajaran mendalam lebih mudah dengan bantuan mesin backend.
  • Keras mudah digunakan dan dipahami dengan dukungan python sehingga terasa lebih alami dari sebelumnya. Ini bagus untuk pemula yang ingin mempelajari pembelajaran mendalam dan bagi peneliti yang ingin menggunakan API dengan mudah.
  • Proses instalasinya mudah dan Anda dapat menggunakan lingkungan virtual atau menggunakan platform eksternal seperti AWS.
  • Keras juga hadir dengan berbagai macam model jaringan sehingga memudahkan kita menggunakan model yang tersedia untuk pra-pelatihan dan penyempurnaan model jaringan kita sendiri.
  • Selain itu, terdapat banyak tutorial dan artikel tentang penggunaan Keras dari komunitas kode di seluruh dunia untuk tujuan pembelajaran mendalam.