Keras Tutorial: Τι είναι το Keras; Πώς να εγκαταστήσετε στην Python [Παράδειγμα]

Τι είναι το Keras;

Keras είναι μια βιβλιοθήκη νευρωνικού δικτύου ανοιχτού κώδικα γραμμένη σε Python που τρέχει πάνω από το Theano ή το Tensorflow. Είναι σχεδιασμένο να είναι αρθρωτό, γρήγορο και εύκολο στη χρήση. Αναπτύχθηκε από τον François Chollet, μηχανικό της Google. Η Keras δεν χειρίζεται υπολογισμούς χαμηλού επιπέδου. Αντίθετα, χρησιμοποιεί μια άλλη βιβλιοθήκη για να το κάνει, που ονομάζεται "Backend.

Το Keras είναι ένα περιτύλιγμα API υψηλού επιπέδου για το API χαμηλού επιπέδου, με δυνατότητα εκτέλεσης πάνω από το TensorFlow, το CNTK ή το Theano. Το Keras High-Level API χειρίζεται τον τρόπο με τον οποίο φτιάχνουμε μοντέλα, ορίζοντας επίπεδα ή ρυθμίζουμε πολλαπλά μοντέλα εισόδου-εξόδου. Σε αυτό το επίπεδο, η Keras συντάσσει επίσης το μοντέλο μας με λειτουργίες απώλειας και βελτιστοποίησης, διαδικασία προπόνησης με λειτουργία fit. Το Keras στην Python δεν χειρίζεται API χαμηλού επιπέδου, όπως τη δημιουργία του υπολογιστικού γραφήματος, τη δημιουργία τανυστών ή άλλες μεταβλητές, επειδή έχει χειριστεί από τη μηχανή "backend".

Τι είναι ένα Backend;

Το Backend είναι ένας όρος στο Keras που εκτελεί όλους τους υπολογισμούς χαμηλού επιπέδου, όπως προϊόντα τανυστή, συνελίξεις και πολλά άλλα πράγματα με τη βοήθεια άλλων βιβλιοθηκών όπως η Tensorflow ή η Theano. Έτσι, η «μηχανή υποστήριξης» θα εκτελέσει τον υπολογισμό και την ανάπτυξη των μοντέλων. Το Tensorflow είναι η προεπιλεγμένη «μηχανή υποστήριξης» αλλά μπορούμε να την αλλάξουμε στη διαμόρφωση.

Theano, Tensorflow και CNTK Backend

Backend της Θεανώ

Το Theano είναι ένα έργο ανοιχτού κώδικα που αναπτύχθηκε από τον όμιλο MILA στο Πανεπιστήμιο του Μόντρεαλ, Κεμπέκ, Καναδάς. Ήταν το πρώτο Πλαίσιο που χρησιμοποιήθηκε ευρέως. Είναι μια βιβλιοθήκη Python που βοηθά σε πολυδιάστατους πίνακες για μαθηματικά operaχρησιμοποιώντας Numpy ή Scipy. Το Theano μπορεί να χρησιμοποιήσει GPU για ταχύτερους υπολογισμούς, μπορεί επίσης να δημιουργήσει αυτόματα συμβολικά γραφήματα για υπολογιστικές κλίσεις. Στην ιστοσελίδα της, η Theano ισχυρίζεται ότι μπορεί να αναγνωρίσει αριθμητικά ασταθείς εκφράσεις και να τις υπολογίσει με πιο σταθερές algorithms, αυτό είναι πολύ χρήσιμο για τις ασταθείς εκφράσεις μας.

Backend του TensorFlow

Από την άλλη πλευρά, το Tensorflow είναι το ανερχόμενο αστέρι στο πλαίσιο βαθιάς μάθησης. Αναπτύχθηκε από την ομάδα Brain της Google και είναι το πιο δημοφιλές εργαλείο βαθιάς εκμάθησης. Με πολλά χαρακτηριστικά και οι ερευνητές συμβάλλουν στην ανάπτυξη αυτού του πλαισίου για σκοπούς βαθιάς μάθησης.

Backend του CNTK

Ένας άλλος κινητήρας backend για το Keras είναι το The Microsoft Cognitive Toolkit ή CNTK. Είναι ένα ανοιχτού κώδικα πλαίσιο βαθιάς μάθησης που αναπτύχθηκε από Microsoft Ομάδα. Μπορεί να λειτουργήσει σε πολλαπλές GPU ή πολυμηχανήματα για εκπαίδευση μοντέλων βαθιάς εκμάθησης σε τεράστια κλίμακα. Σε ορισμένες περιπτώσεις, το CNTK αναφέρθηκε ταχύτερα από άλλα πλαίσια όπως το Tensorflow ή το Theano. Στη συνέχεια, σε αυτό το σεμινάριο Keras CNN, θα συγκρίνουμε τα backends των Theano, TensorFlow και CNTK.

Συγκρίνοντας τα Backends

Πρέπει να κάνουμε ένα σημείο αναφοράς για να γνωρίζουμε τη σύγκριση μεταξύ αυτών των δύο backend. Όπως μπορείτε να δείτε στο Το σημείο αναφοράς του Jeong-Yoon Lee, συγκρίνεται η απόδοση 3 διαφορετικών backend σε διαφορετικό υλικό. Και το αποτέλεσμα είναι ότι η Θεανώ είναι πιο αργή από το άλλο backend, αναφέρεται φορές 50 πιο αργά, αλλά η ακρίβεια είναι κοντά η μία στην άλλη.

Άλλος δοκιμή αναφοράς εκτελείται από Jasmeet Bhatia. Ανέφερε ότι η Theano είναι πιο αργή από τον Tensorflow για κάποια δοκιμή. Αλλά η συνολική ακρίβεια είναι σχεδόν η ίδια για κάθε δίκτυο που δοκιμάστηκε.

Έτσι, μεταξύ Theano, Tensorflow και CTK είναι προφανές ότι το TensorFlow είναι καλύτερο από το Theano. Με το TensorFlow, ο χρόνος υπολογισμού είναι πολύ μικρότερος και το CNN είναι καλύτερο από τα άλλα.

Στη συνέχεια, σε αυτό το σεμινάριο Keras Python, θα μάθουμε για τη διαφορά μεταξύ Keras και TensorFlow (Keras vs Tensorflow).

Keras vs Tensorflow

παράμετροι Keras Τάση ροής
Χαρακτηριστικά Περιτύλιγμα API υψηλού επιπέδου API χαμηλού επιπέδου
complexτητα Εύκολο στη χρήση εάν χρησιμοποιείτε γλώσσα Python Πρέπει να μάθετε τη σύνταξη της χρήσης ορισμένων συναρτήσεων Tensorflow
Σκοπός Γρήγορη ανάπτυξη για κατασκευή μοντέλου με τυπικά στρώματα Σας επιτρέπει να δημιουργήσετε ένα αυθαίρετο υπολογιστικό γράφημα ή επίπεδα μοντέλων
Εργαλεία Χρησιμοποιεί άλλο εργαλείο εντοπισμού σφαλμάτων API όπως το TFDBG Μπορείτε να χρησιμοποιήσετε εργαλεία οπτικοποίησης Tensorboard
Κοινότητα Μεγάλες ενεργές κοινότητες Μεγάλες ενεργές κοινότητες και ευρέως κοινόχρηστοι πόροι

Πλεονεκτήματα του Keras

Γρήγορη ανάπτυξη και εύκολη κατανόηση

Ο Keras είναι πολύ γρήγορος να φτιάξει ένα μοντέλο δικτύου. Αν θέλετε να φτιάξετε ένα απλό μοντέλο δικτύου με λίγες γραμμές, η Python Keras μπορεί να σας βοηθήσει σε αυτό. Δείτε το παράδειγμα Keras παρακάτω:

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'))

Λόγω του φιλικού του API, μπορούμε εύκολα να κατανοήσουμε τη διαδικασία. Γράψτε τον κώδικα με μια απλή λειτουργία και δεν χρειάζεται να ορίσετε πολλές παραμέτρους.

Μεγάλο Κομunity Υποστήριξη

Υπάρχουν πολλές κοινότητες AI που χρησιμοποιούν το Keras για το πλαίσιο Deep Learning. Πολλοί από αυτούς δημοσιεύουν τους κωδικούς τους καθώς και μαθήματα στο ευρύ κοινό.

Έχετε πολλά Backend

Μπορείτε να επιλέξετε Tensorflow, CNTK και Theano ως backend σας με το Keras. Μπορείτε να επιλέξετε διαφορετικό backend για διαφορετικά έργα ανάλογα με τις ανάγκες σας. Κάθε backend έχει το δικό του μοναδικό πλεονέκτημα.

Cross-Platform και εύκολη ανάπτυξη μοντέλου

Με μια ποικιλία υποστηριζόμενων συσκευών και πλατφορμών, μπορείτε να αναπτύξετε το Keras σε οποιαδήποτε συσκευή όπως

  • iOS με CoreML
  • Android με το Tensorflow Android,
  • Πρόγραμμα περιήγησης Ιστού με υποστήριξη .js
  • Cloud κινητήρας
  • Raspberry Pi

Υποστήριξη πολλαπλών GPU

Μπορείτε να εκπαιδεύσετε το Keras σε μία μόνο GPU ή να χρησιμοποιήσετε πολλές GPU ταυτόχρονα. Επειδή το Keras διαθέτει ενσωματωμένη υποστήριξη για παραλληλισμό δεδομένων, ώστε να μπορεί να επεξεργάζεται μεγάλους όγκους δεδομένων και να επιταχύνει τον χρόνο που απαιτείται για την εκπαίδευσή τους.

Μειονεκτήματα του Keras

Δεν είναι δυνατός ο χειρισμός του API χαμηλού επιπέδου

Το Keras χειρίζεται μόνο API υψηλού επιπέδου που εκτελείται πάνω από άλλο πλαίσιο ή μηχανή υποστήριξης όπως το Tensorflow, το Theano ή το CNTK. Επομένως, δεν είναι πολύ χρήσιμο εάν θέλετε να δημιουργήσετε το δικό σας αφηρημένο επίπεδο για τους ερευνητικούς σας σκοπούς, επειδή τα Keras έχουν ήδη προρυθμισμένα επίπεδα.

Εγκατάσταση Keras

Σε αυτήν την ενότητα, θα εξετάσουμε διάφορες διαθέσιμες μεθόδους για την εγκατάσταση του Keras

Άμεση εγκατάσταση ή εικονικό περιβάλλον

Ποιό είναι καλύτερο? Απευθείας εγκατάσταση στην τρέχουσα python ή χρήση εικονικού περιβάλλοντος; Προτείνω να χρησιμοποιήσετε ένα εικονικό περιβάλλον εάν έχετε πολλά έργα. Θέλετε να μάθετε γιατί; Αυτό συμβαίνει επειδή διαφορετικά έργα ενδέχεται να χρησιμοποιούν διαφορετική έκδοση μιας βιβλιοθήκης keras.

Για παράδειγμα, έχω ένα έργο που χρειάζεται Python 3.5 χρησιμοποιώντας OpenCV 3.3 με παλαιότερο backend Keras-Theano, αλλά στο άλλο έργο πρέπει να χρησιμοποιήσω το Keras με την πιο πρόσφατη έκδοση και ένα Tensorflow ως backend με υποστήριξη Python 3.6.6

Δεν θέλουμε η βιβλιοθήκη Keras να συγκρούεται μεταξύ τους σωστά; Επομένως, χρησιμοποιούμε ένα εικονικό περιβάλλον για να τοπικοποιήσουμε το έργο με έναν συγκεκριμένο τύπο βιβλιοθήκης ή μπορούμε να χρησιμοποιήσουμε μια άλλη πλατφόρμα όπως η Υπηρεσία Cloud για να κάνουμε τους υπολογισμούς μας για εμάς όπως Amazon Web Service.

Εγκατάσταση Keras σε Amazon Υπηρεσία Ιστού (AWS)

Amazon Η Web Service είναι μια πλατφόρμα που προσφέρει υπηρεσίες και προϊόντα Cloud Computing για ερευνητές ή για οποιονδήποτε άλλο σκοπό. Η AWS νοικιάζει το υλικό, τη δικτύωση, τη βάση δεδομένων κ.λπ. ώστε να μπορούμε να το χρησιμοποιήσουμε απευθείας από το διαδίκτυο. Μία από τις δημοφιλείς υπηρεσίες AWS για σκοπούς βαθιάς μάθησης είναι η Amazon Machine Image Deep Learning Service ή DL

Για λεπτομερείς οδηγίες σχετικά με τον τρόπο χρήσης του AWS, ανατρέξτε σε αυτό φροντιστήριο

Σημείωση για το AMI: Θα έχετε το following AMI διαθέσιμο

Εγκατάσταση Keras σε AWS

Το AWS Deep Learning AMI είναι ένα εικονικό περιβάλλον στην υπηρεσία AWS EC2 που βοηθά τους ερευνητές ή τους επαγγελματίες να εργαστούν με το Deep Learning. Η DLAMI προσφέρει από μηχανές μικρών CPU έως κινητήρες πολλαπλών GPU υψηλής ισχύος με προρυθμισμένο CUDA, cuDNN και διαθέτει μια ποικιλία πλαισίων βαθιάς εκμάθησης.

Εάν θέλετε να το χρησιμοποιήσετε άμεσα, θα πρέπει να επιλέξετε το Deep Learning AMI επειδή έρχεται προεγκατεστημένο με δημοφιλή πλαίσια βαθιάς εκμάθησης.

Ωστόσο, εάν θέλετε να δοκιμάσετε ένα προσαρμοσμένο πλαίσιο βαθιάς εκμάθησης για έρευνα, θα πρέπει να εγκαταστήσετε το Deep Learning Base AMI επειδή συνοδεύεται από βασικές βιβλιοθήκες όπως CUDA, cuDNN, προγράμματα οδήγησης GPU και άλλες απαραίτητες βιβλιοθήκες για εκτέλεση με το περιβάλλον βαθιάς μάθησης.

Πώς να εγκαταστήσετε το Keras στο Amazon SageMaker

Amazon Το SageMaker είναι μια πλατφόρμα βαθιάς εκμάθησης που σας βοηθά με την εκπαίδευση και την ανάπτυξη δικτύου βαθιάς μάθησης με τον καλύτερο αλγόριθμο.

Ως αρχάριος, αυτή είναι μακράν η πιο εύκολη μέθοδος χρήσης του Keras. Παρακάτω ακολουθεί μια διαδικασία για τον τρόπο εγκατάστασης του Keras Amazon SageMaker:

Βήμα 1) Ανοίξτε Amazon SageMaker

Στο πρώτο βήμα, Ανοίξτε το Amazon Ψαλίδι κονσόλα και κάντε κλικ στο Create instance notebook.

Εγκαταστήστε το Keras στο Amazon SageMaker

Βήμα 2) Εισαγάγετε το details

  1. Εισαγάγετε το όνομα του σημειωματάριου σας.
  2. Δημιουργήστε έναν ρόλο IAM. Θα δημιουργήσει έναν ρόλο AMI Amazon ρόλος IAM στη μορφή του AmazonSageMaker-Executionrole-YYYYMMDD|HHmmSS.
  3. Τέλος, επιλέξτε Δημιουργία παρουσίας σημειωματάριου. Μετά από λίγες στιγμές, Amazon Το Sagemaker λανσάρει μια παρουσία σημειωματάριου.

Εγκαταστήστε το Keras στο Amazon SageMaker

Note: Εάν θέλετε να αποκτήσετε πρόσβαση σε πόρους από το VPC σας, ορίστε την άμεση πρόσβαση στο Διαδίκτυο ως ενεργοποιημένη. Αλλαwise, αυτό το παράδειγμα notebook δεν θα έχει πρόσβαση στο διαδίκτυο, επομένως είναι αδύνατο να εκπαιδεύσετε ή να φιλοξενήσετε μοντέλα

Βήμα 3) Εκκινήστε την παρουσία

Κάντε κλικ στο Άνοιγμα για να εκκινήσετε το παράδειγμα

Εγκαταστήστε το Keras στο Amazon SageMaker

Βήμα 4) Ξεκινήστε την κωδικοποίηση

In Jupyter, Κάντε κλικ στο New> conda_tensorflow_p36 και είστε έτοιμοι να κωδικοποιήσετε

Εγκαταστήστε το Keras στο Amazon SageMaker

Εγκαταστήστε το Keras σε Linux

Για να ενεργοποιήσουμε το Keras με το Tensorflow ως backend κινητήρα του, πρέπει πρώτα να εγκαταστήσουμε το Tensorflow. Εκτελέστε αυτήν την εντολή για να εγκαταστήσετε το tensorflow με CPU (χωρίς GPU)

pip install --upgrade tensorflow

Εάν θέλετε να ενεργοποιήσετε την υποστήριξη GPU για tensorflow, μπορείτε να χρησιμοποιήσετε αυτήν την εντολή

pip install --upgrade tensorflow-gpu

Εγκαταστήστε το Keras σε Linux

ας ελέγξουμε στην Python για να δούμε αν η εγκατάστασή μας είναι επιτυχής πληκτρολογώντας

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
>>>

εάν δεν υπάρχει μήνυμα σφάλματος, η διαδικασία εγκατάστασης είναι επιτυχής

Εγκαταστήστε το Keras

Αφού εγκαταστήσουμε το Tensorflow, ας ξεκινήσουμε την εγκατάσταση των keras. Πληκτρολογήστε αυτήν την εντολή στο τερματικό

pip install keras

θα αρχίσει να εγκαθιστά το Keras και όλες τις εξαρτήσεις του. Θα πρέπει να δείτε κάτι σαν αυτό:

Εγκαταστήστε το Keras

Τώρα έχουμε εγκατεστημένο το Keras στο σύστημά μας!

Επαλήθευση

Πριν αρχίσουμε να χρησιμοποιούμε το Keras, θα πρέπει να ελέγξουμε αν το Keras μας χρησιμοποιεί το Tensorflow ως backend ανοίγοντας το αρχείο διαμόρφωσης:

gedit ~/.keras/keras.json

πρέπει να δείτε κάτι τέτοιο

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

όπως μπορείτε να δείτε, το "backend" χρησιμοποιεί tensorflow. Σημαίνει ότι οι keras χρησιμοποιούν το Tensorflow ως backend όπως περιμέναμε

και τώρα εκτελέστε το στο τερματικό πληκτρολογώντας

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.
>>> 

Πώς να εγκαταστήσετε το Keras στο Windows

Πριν εγκαταστήσουμε Τάση ροής και Keras, θα πρέπει να εγκαταστήσουμε Python, pip και virtualenv. Εάν έχετε ήδη εγκαταστήσει αυτές τις βιβλιοθήκες, θα πρέπει να συνεχίσετε στο επόμενο βήμα, άλλοwise Κάνε αυτό:

Εγκαταστήστε την Python 3 κάνοντας λήψη από αυτό σύνδεσμος

Εγκαταστήστε το pip τρέχοντας αυτό

Εγκαταστήστε το virtualenv με αυτήν την εντολή

pip3 install –U pip virtualenv

εγκαταστήστε Microsoft Ενημερωμένη έκδοση 2015 με δυνατότητα αναδιανομής Visual C++ 3

  • Πηγαίνετε στο Visual Studio κατεβάστε το site https://www.microsoft.com/en-us/download/details.aspx?id=53587
  • Επιλέξτε Αναδιανεμητέα και Εργαλεία δημιουργίας
  • Κατεβάστε και εγκαταστήστε το Microsoft Ενημερωμένη έκδοση 2015 με δυνατότητα αναδιανομής Visual C++ 3

Στη συνέχεια, εκτελέστε αυτό το σενάριο

pip3 install virtualenv

Ρύθμιση εικονικού περιβάλλοντος

Αυτό χρησιμοποιείται για την απομόνωση του συστήματος εργασίας με το κύριο σύστημα.

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

Ενεργοποιήστε το περιβάλλον

.\venv\Scripts\activate

Μετά την προετοιμασία του περιβάλλοντος, η εγκατάσταση του Tensorflow και του Keras παραμένει ίδια με το Linux. Στη συνέχεια, σε αυτό το σεμινάριο Deep learning with Keras, θα μάθουμε για τις βασικές αρχές Keras για Deep Learning.

Keras Fundamentals for Deep Learning

Η κύρια δομή στον Keras είναι το Μοντέλο που ορίζει το πλήρες γράφημα ενός δικτύου. Μπορείτε να προσθέσετε περισσότερα επίπεδα σε ένα υπάρχον μοντέλο για να δημιουργήσετε ένα προσαρμοσμένο μοντέλο που χρειάζεστε για το έργο σας.

Δείτε πώς μπορείτε να δημιουργήσετε ένα Διαδοχικό μοντέλο και μερικά κοινά χρησιμοποιούμενα επίπεδα στη βαθιά εκμάθηση

1. Διαδοχικό Μοντέλο

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

model = Sequential()

2. Συνδυαστικό στρώμα

Αυτό είναι ένα παράδειγμα συνελικτικού επιπέδου Keras Python ως στρώμα εισόδου με σχήμα εισόδου 320x320x3, με 48 φίλτρα μεγέθους 3×3 και χρήση ReLU ως συνάρτηση ενεργοποίησης.

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))

άλλος τύπος είναι

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

3. ΜέγPooling Στρώμα

Για τη μείωση του δείγματος της αναπαράστασης εισόδου, χρησιμοποιήστε το MaxPool2d και καθορίστε το μέγεθος του πυρήνα

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

4. Πυκνό στρώμα

προσθέτοντας ένα πλήρως συνδεδεμένο επίπεδο με τον καθορισμό μόνο του μεγέθους εξόδου

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

5. Επίπεδο εγκατάλειψης

Προσθήκη στρώματος εγκατάλειψης με πιθανότητα 50%.

model.add(Dropout(0.5))

Σύνταξη, Εκπαίδευση και Αξιολόγηση

Αφού ορίσουμε το μοντέλο μας, ας αρχίσουμε να τους εκπαιδεύουμε. Απαιτείται η μεταγλώττιση του δικτύου πρώτα με τη συνάρτηση απώλειας και τη λειτουργία βελτιστοποίησης. Αυτό θα επιτρέψει στο δίκτυο να αλλάξει βάρη και θα ελαχιστοποιήσει την απώλεια.

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

Τώρα για να ξεκινήσετε την εκπαίδευση, χρησιμοποιήστε το fit για να τροφοδοτήσετε τα δεδομένα εκπαίδευσης και επικύρωσης στο μοντέλο. Αυτό θα σας επιτρέψει να εκπαιδεύσετε το δίκτυο σε παρτίδες και να ορίσετε τις εποχές.

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

Το τελευταίο μας βήμα είναι να αξιολογήσουμε το μοντέλο με τα δεδομένα δοκιμής.

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

Ας δοκιμάσουμε να χρησιμοποιήσουμε απλή γραμμική παλινδρόμηση

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()

Μετά την εκπαίδευση των δεδομένων, η έξοδος θα πρέπει να μοιάζει με αυτό

γραμμική Παλινδρόμηση

με το αρχικό βάρος

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

και τελικό βάρος

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

Βελτιώστε τα προεκπαιδευμένα μοντέλα στο Keras και πώς να τα χρησιμοποιήσετε

Γιατί χρησιμοποιούμε μοντέλα Fine Tune και πότε τα χρησιμοποιούμε

Η μικρορύθμιση είναι μια εργασία για την προσαρμογή ενός προεκπαιδευμένου μοντέλου έτσι ώστε οι παράμετροι να προσαρμόζονται στο νέο μοντέλο. Όταν θέλουμε να εκπαιδεύσουμε από την αρχή σε ένα νέο μοντέλο, χρειαζόμαστε μεγάλο όγκο δεδομένων, ώστε το δίκτυο να μπορεί να βρει όλες τις παραμέτρους. Αλλά σε αυτή την περίπτωση, θα χρησιμοποιήσουμε ένα προεκπαιδευμένο μοντέλο, ώστε οι παράμετροι να έχουν ήδη μάθει και να έχουν βάρος.

Για παράδειγμα, αν θέλουμε να εκπαιδεύσουμε το δικό μας μοντέλο Keras για να λύσουμε ένα πρόβλημα ταξινόμησης, αλλά έχουμε μόνο ένα μικρό όγκο δεδομένων, τότε μπορούμε να το λύσουμε χρησιμοποιώντας ένα Μεταφορά μάθησης + Μέθοδος μικρορύθμισης.

Χρησιμοποιώντας ένα προεκπαιδευμένο δίκτυο και βάρη δεν χρειάζεται να εκπαιδεύσουμε ολόκληρο το δίκτυο. Απλώς πρέπει να εκπαιδεύσουμε το τελευταίο επίπεδο που χρησιμοποιείται για να λύσουμε την εργασία μας, όπως την ονομάζουμε μέθοδο Fine-Tuning.

Προετοιμασία μοντέλου δικτύου

Για το προεκπαιδευμένο μοντέλο, μπορούμε να φορτώσουμε μια ποικιλία μοντέλων που έχει ήδη η Keras στη βιβλιοθήκη της, όπως:

  • VGG16
  • InceptionV3
  • ResNet
  • MobileNet
  • Εξαίρεση
  • InceptionResNetV2

Αλλά σε αυτή τη διαδικασία, θα χρησιμοποιήσουμε το μοντέλο δικτύου VGG16 και το imageNet ως βάρος μας για το μοντέλο. Θα ρυθμίσουμε με ακρίβεια ένα δίκτυο για να ταξινομήσουμε 8 διαφορετικούς τύπους κλάσεων χρησιμοποιώντας Εικόνες από Σύνολο δεδομένων Kaggle Natural Images

Μοντέλο VGG16 archiδομή

Μοντέλο VGG16 archiδομή

πηγή

Μεταφόρτωση των δεδομένων μας στον κάδο AWS S3

Για τη διαδικασία εκπαίδευσής μας, θα χρησιμοποιήσουμε μια εικόνα φυσικών εικόνων από 8 διαφορετικές κατηγορίες όπως αεροπλάνα, αυτοκίνητο, γάτα, σκύλος, λουλούδι, φρούτα, μοτοσικλέτες και άτομα. Πρώτα, πρέπει να ανεβάσουμε τα δεδομένα μας στο Amazon Κάδος S3.

Amazon Κάδος S3

Βήμα 1) Αφού συνδεθείτε στον λογαριασμό σας στο S3, ας δημιουργήσουμε έναν κουβά χρονομετρώντας Δημιουργία κάδου

Μεταφόρτωση δεδομένων στον κάδο AWS S3

Βήμα 2) Τώρα επιλέξτε ένα όνομα κάδου και την περιοχή σας σύμφωνα με τον λογαριασμό σας. Βεβαιωθείτε ότι το όνομα του κάδου είναι διαθέσιμο. Μετά από αυτό κάντε κλικ Δημιουργία.

Μεταφόρτωση δεδομένων στον κάδο AWS S3

Βήμα 3) Όπως μπορείτε να δείτε, ο κάδος σας είναι έτοιμος για χρήση. Αλλά όπως μπορείτε να δείτε, η Access δεν είναι δημόσια, είναι καλό για εσάς αν θέλετε να την κρατήσετε ιδιωτική για τον εαυτό σας. Μπορείτε να αλλάξετε αυτόν τον κάδο για δημόσια πρόσβαση στις Ιδιότητες κάδου

Μεταφόρτωση δεδομένων στον κάδο AWS S3

Βήμα 4) Τώρα ξεκινάτε να ανεβάζετε τα δεδομένα προπόνησής σας στο Bucket σας. Εδώ θα ανεβάσω το αρχείο tar.gz που αποτελείται από εικόνες για τη διαδικασία εκπαίδευσης και δοκιμών.

Μεταφόρτωση δεδομένων στον κάδο AWS S3

Βήμα 5) Τώρα κάντε κλικ στο αρχείο σας και αντιγράψτε το Σύνδεσμος για να το κατεβάσουμε.

Μεταφόρτωση δεδομένων στον κάδο AWS S3

Προετοιμασία δεδομένων

Πρέπει να δημιουργήσουμε τα δεδομένα προπόνησής μας χρησιμοποιώντας το Keras ImageDataGenerator.

Πρώτα πρέπει να κάνετε λήψη χρησιμοποιώντας το wget με τον σύνδεσμο προς το αρχείο σας από το S3 Bucket.

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

Αφού κατεβάσετε τα δεδομένα, ας ξεκινήσουμε την Εκπαιδευτική Διαδικασία.

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)

Τα ImageDataGenerator θα δημιουργήσει δεδομένα X_training από έναν κατάλογο. Ο υποκατάλογος σε αυτόν τον κατάλογο θα χρησιμοποιηθεί ως κλάση για κάθε αντικείμενο. Η εικόνα θα φορτωθεί με τη λειτουργία χρώματος RGB, με τη λειτουργία κατηγορίας κατηγορίας για τα δεδομένα Y_training, με μέγεθος παρτίδας 16. Τέλος, ανακατέψτε τα δεδομένα.

Ας δούμε τις εικόνες μας τυχαία σχεδιάζοντάς τες με το 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()

Προετοιμασία δεδομένων

Μετά από αυτό, ας δημιουργήσουμε το μοντέλο δικτύου μας από το VGG16 με προεκπαιδευμένο βάρος imageNet. Θα παγώσουμε αυτά τα στρώματα, έτσι ώστε τα στρώματα να μην είναι εκπαιδεύσιμα για να μας βοηθήσουν να μειώσουμε τον χρόνο υπολογισμού.

Δημιουργία του Μοντέλου μας από το 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())

Όπως μπορείτε να δείτε παρακάτω, η περίληψη του μοντέλου δικτύου μας. Από μια είσοδο από τα επίπεδα VGG16, στη συνέχεια προσθέτουμε 2 πλήρως συνδεδεμένο επίπεδο που θα εξαγάγει 1024 χαρακτηριστικά και ένα επίπεδο εξόδου που θα υπολογίζει τις 8 κλάσεις με την ενεργοποίηση 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

Εκπαίδευση

# # 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()

Αποτελέσματα

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

Εκπαίδευση

Όπως μπορείτε να δείτε, οι απώλειές μας μειώνονται σημαντικά και η ακρίβεια είναι σχεδόν 100%. Για τη δοκιμή του μοντέλου μας, επιλέξαμε τυχαία εικόνες μέσω του Διαδικτύου και τις τοποθετήσαμε στον φάκελο δοκιμής με διαφορετική κατηγορία για δοκιμή

Δοκιμάζοντας το μοντέλο μας

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()

Και η δοκιμή μας είναι όπως δίνεται παρακάτω! Μόνο 1 εικόνα προβλέπεται λάθος από μια δοκιμή 14 εικόνων!

Μοντέλο δοκιμής

Νευρωνικό δίκτυο αναγνώρισης προσώπου με Keras

Γιατί χρειαζόμαστε την Αναγνώριση

Χρειαζόμαστε Αναγνώριση για να μας διευκολύνει να αναγνωρίσουμε ή να αναγνωρίσουμε το πρόσωπο ενός ατόμου, τον τύπο αντικειμένων, την εκτιμώμενη ηλικία ενός ατόμου από το πρόσωπό του ή ακόμα και να γνωρίζουμε τις εκφράσεις του προσώπου αυτού του ατόμου.

Νευρωνικό δίκτυο αναγνώρισης προσώπου με Keras

Ίσως συνειδητοποιείτε κάθε φορά που προσπαθείτε να μαρκάρετε το πρόσωπο του φίλου σας σε μια φωτογραφία, η λειτουργία στο Facebook το έχει κάνει για εσάς, δηλαδή μαρκάρει το πρόσωπο του φίλου σας χωρίς να χρειάζεται να το μαρκάρετε πρώτα. Αυτό είναι το Face Recognition που εφαρμόζεται από το Facebook για να μας διευκολύνει να κάνουμε tag φίλους.

Πως λειτουργεί, λοιπόν? Κάθε φορά που σημαδεύουμε το πρόσωπο του φίλου μας, το AI του Facebook θα το μάθει και θα προσπαθήσει να το προβλέψει μέχρι να πάρει το σωστό αποτέλεσμα. Το ίδιο σύστημα θα χρησιμοποιήσουμε για να φτιάξουμε το δικό μας Face Recognition. Ας αρχίσουμε να φτιάχνουμε τη δική μας Αναγνώριση Προσώπου χρησιμοποιώντας το Deep Learning

Μοντέλο δικτύου

Θα χρησιμοποιήσουμε ένα μοντέλο δικτύου VGG16 αλλά με βάρος VGGFace.

Μοντέλο VGG16 archiδομή

Μοντέλο δικτύου

Τι είναι το VGGFace; είναι η εφαρμογή Keras της Deep Face Recognition που εισήχθη από τους Parkhi, Omkar M. et al. «Βαθιά Αναγνώριση Προσώπου». BMVC (2015). Το πλαίσιο χρησιμοποιεί το VGG16 ως δίκτυο archiδομή.

Μπορείτε να κάνετε λήψη του VGGFace από 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()

Όπως μπορείτε να δείτε τη σύνοψη του δικτύου

_________________________________________________________________
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):

θα κάνουμε ένα Μεταφορά μάθησης + Fine Tuning για να κάνετε την εκπαίδευση πιο γρήγορη με μικρά σύνολα δεδομένων. Αρχικά, θα παγώσουμε τα βασικά στρώματα έτσι ώστε τα στρώματα να μην μπορούν να εκπαιδεύονται.

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

στη συνέχεια προσθέτουμε το δικό μας στρώμα για να αναγνωρίσουμε τα δοκιμαστικά μας πρόσωπα. Θα προσθέσουμε 2 πλήρως συνδεδεμένα στρώματα και ένα επίπεδο εξόδου με 5 άτομα προς ανίχνευση.

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)

Ας δούμε τη σύνοψη του δικτύου μας

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

Όπως μπορείτε να δείτε παραπάνω, μετά το επίπεδο pool5, θα ισοπεδωθεί σε ένα ενιαίο διάνυσμα χαρακτηριστικών που θα χρησιμοποιηθεί από το πυκνό στρώμα για την τελική αναγνώριση.

Προετοιμασία των Προσώπων μας

Τώρα ας ετοιμάσουμε τα πρόσωπά μας. Έφτιαξα έναν κατάλογο που αποτελείται από 5 διάσημους ανθρώπους

  • Jack Ma
  • Jason Statham
  • Johnny Depp
  • Ρόμπερτ Ντάουνι Τζούνιορ
  • Rowan Atkinson

Κάθε φάκελος περιέχει 10 εικόνες, για κάθε διαδικασία εκπαίδευσης και αξιολόγησης. Είναι ένας πολύ μικρός όγκος δεδομένων, αλλά αυτή είναι η πρόκληση, σωστά;

Θα χρησιμοποιήσουμε τη βοήθεια του εργαλείου Keras για να μας βοηθήσει να προετοιμάσουμε τα δεδομένα. Αυτή η συνάρτηση θα επαναληφθεί στον φάκελο δεδομένων και στη συνέχεια θα την προετοιμάσει ώστε να μπορεί να χρησιμοποιηθεί στην εκπαίδευση.

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,
)

Εκπαίδευση του μοντέλου μας

Ας ξεκινήσουμε τη διαδικασία εκπαίδευσής μας συντάσσοντας το δίκτυό μας με λειτουργία απώλειας και βελτιστοποιητή. Εδώ, χρησιμοποιούμε sparse_categorical_crossentropy ως συνάρτηση απώλειας, με τη βοήθεια του SGD ως βελτιστοποιητή μάθησης.

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

Όπως μπορείτε να δείτε, η ακρίβεια επικύρωσής μας είναι έως και 64%, αυτό είναι ένα καλό αποτέλεσμα για έναν μικρό όγκο δεδομένων εκπαίδευσης. Μπορούμε να το βελτιώσουμε προσθέτοντας περισσότερο στρώμα ή προσθέτοντας περισσότερες εικόνες εκπαίδευσης, ώστε το μοντέλο μας να μπορεί να μάθει περισσότερα για τα πρόσωπα και να επιτύχει μεγαλύτερη ακρίβεια.

Ας δοκιμάσουμε το μοντέλο μας με μια δοκιμαστική εικόνα

Δοκιμαστική εικόνα

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']

Χρησιμοποιώντας την εικόνα του Robert Downey Jr ως δοκιμαστική εικόνα, δείχνει ότι το προβλεπόμενο πρόσωπο είναι αληθινό!

Πρόβλεψη χρησιμοποιώντας Live Cam!

Τι θα λέγατε αν δοκιμάσουμε τις ικανότητές μας με την εφαρμογή της με μια είσοδο από μια κάμερα web; Χρησιμοποιώντας το OpenCV με καταρράκτη Haar Face για να βρούμε το πρόσωπό μας και με τη βοήθεια του μοντέλου δικτύου μας, μπορούμε να αναγνωρίσουμε το άτομο.

Το πρώτο βήμα είναι να προετοιμάσετε εσάς και τα πρόσωπα του φίλου σας. Όσο περισσότερα δεδομένα έχουμε τότε τόσο καλύτερο είναι το αποτέλεσμα!

Προετοιμάστε και εκπαιδεύστε το δίκτυό σας όπως το προηγούμενο βήμα, αφού ολοκληρωθεί η εκπαίδευση, προσθέστε αυτήν τη γραμμή για να λάβετε την εικόνα εισόδου από την κάμερα

#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()

Ποιό είναι καλύτερο? Keras ή Tensorflow

Ο Κέρας προσφέρει απλότητα κατά τη συγγραφή του σεναρίου. Μπορούμε να αρχίσουμε να γράφουμε και να καταλαβαίνουμε απευθείας με τον Keras, καθώς δεν είναι πολύ δύσκολο να το καταλάβουμε. Είναι πιο φιλικό προς το χρήστη και εύκολο στην εφαρμογή, δεν χρειάζεται να κάνετε πολλές μεταβλητές για να εκτελέσετε το μοντέλο. Έτσι, δεν χρειάζεται να κατανοούμε κάθε λεπτομέρεια στη διαδικασία του backend.

Από την άλλη πλευρά, το Tensorflow είναι το χαμηλό επίπεδο operaπου προσφέρουν ευελιξία και προηγμένες operaεάν θέλετε να δημιουργήσετε ένα αυθαίρετο υπολογιστικό γράφημα ή μοντέλο. Το Tensorflow μπορεί επίσης να απεικονίσει τη διαδικασία με τη βοήθεια του TensorBoard και ένα εξειδικευμένο εργαλείο εντοπισμού σφαλμάτων.

Έτσι, αν θέλετε να ξεκινήσετε να εργάζεστε με βαθιά μάθηση με όχι τόσο πολύ complexity, χρησιμοποιήστε Keras. Επειδή το Keras προσφέρει απλότητα και φιλικό προς το χρήστη στη χρήση και εύκολο στην εφαρμογή από το Tensorflow. Αλλά αν θέλετε να γράψετε τον δικό σας αλγόριθμο σε έργο βαθιάς μάθησης ή έρευνα, θα πρέπει να χρησιμοποιήσετε το Tensorflow.

Χαρακτηριστικά

Ας συνοψίσουμε λοιπόνmarize όλα όσα έχουμε συζητήσει και κάνει σε αυτό το σεμινάριο.

  • Το Keras σε ένα API υψηλού επιπέδου που χρησιμοποιείται για να διευκολύνει τα δίκτυα βαθιάς εκμάθησης με τη βοήθεια του μηχανισμού υποστήριξης.
  • Το Keras είναι εύκολο στη χρήση και κατανοητό με υποστήριξη python, ώστε να αισθάνεται πιο φυσικό από ποτέ. Είναι καλό για αρχάριους που θέλουν να μάθουν για τη βαθιά μάθηση και για ερευνητές που θέλουν εύκολο στη χρήση API.
  • Η διαδικασία εγκατάστασης είναι εύκολη και μπορείτε να χρησιμοποιήσετε ένα εικονικό περιβάλλον ή χρησιμοποιώντας μια εξωτερική πλατφόρμα όπως π.χ AWS.
  • Το Keras διαθέτει επίσης διάφορα είδη μοντέλων δικτύου, ώστε να μας διευκολύνει να χρησιμοποιούμε το διαθέσιμο μοντέλο για προεκπαιδευμένο και τελειοποιημένο μοντέλο δικτύου.
  • Επίσης, υπάρχουν πολλά σεμινάρια και άρθρα σχετικά με τη χρήση κωδικών Keras από κοινότητες σε όλο τον κόσμο για σκοπούς βαθιάς εκμάθησης.