Ταξινόμηση εικόνων TensorFlow: Το μόνο που χρειάζεται να ξέρετε για το Building Classifiers



Αυτό το άρθρο TensorFlow Image Classification θα σας παρέχει μια λεπτομερή και περιεκτική γνώση της ταξινόμησης εικόνας.

Image Classification μια εργασία που ακόμα και ένα μωρό μπορεί να κάνει σε δευτερόλεπτα, αλλά για ένα μηχάνημα, ήταν δύσκολο έργο μέχρι τις πρόσφατες εξελίξεις στο και Βαθιά μάθηση . Τα αυτοκινούμενα αυτοκίνητα μπορούν να ανιχνεύσουν αντικείμενα και να λάβουν τα απαραίτητα μέτρα σε πραγματικό χρόνο και τα περισσότερα από αυτά είναι δυνατά λόγω Ταξινόμηση εικόνας. Σε αυτό το άρθρο, θα σας καθοδηγήσω στα ακόλουθα θέματα:

Τι είναι το TensorFlow;

TensorFlow είναι το Πλαίσιο Μηχανικής Εκμάθησης Ανοιχτού Κώδικα της Google για προγραμματισμό ροής δεδομένων σε μια σειρά εργασιών. Οι κόμβοι στο γράφημα αντιπροσωπεύουν μαθηματικές λειτουργίες, ενώ οι ακμές του γραφήματος αντιπροσωπεύουν τις πολυδιάστατες συστοιχίες δεδομένων που επικοινωνούνται μεταξύ τους.





TensorFlow-Image-Recognition
Οι τανυστές είναι απλώς πολυδιάστατοι πίνακες, επέκταση δισδιάστατων πινάκων σε δεδομένα με υψηλότερη διάσταση. Υπάρχουν πολλές δυνατότητες του Tensorflow που το καθιστούν κατάλληλο για Deep Learning και η βασική βιβλιοθήκη ανοιχτού κώδικα σάς βοηθά να αναπτύξετε και να εκπαιδεύσετε μοντέλα ML.

Τι είναι η ταξινόμηση εικόνας;

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



υπερχείλιση και υπερφόρτωση σε Java

Τώρα Ανάλογα με την αλληλεπίδραση μεταξύ του αναλυτή και του υπολογιστή κατά την ταξινόμηση, υπάρχουν δύο τύποι ταξινόμησης:



  • Επίβλεψη &
  • Χωρίς επίβλεψη

Λοιπόν, χωρίς να χάνουμε χρόνο ας περάσουμε στην ταξινόμηση εικόνων TensorFlow. Έχω 2 παραδείγματα: εύκολο και δύσκολο. Ας προχωρήσουμε με το εύκολο.

TensorFlow Ταξινόμηση εικόνας: Fashion MNIST

Σύνολο δεδομένων μόδας MNIST

Εδώ πρόκειται να χρησιμοποιήσουμε το σύνολο δεδομένων Fashion MNIST, το οποίο περιέχει 70.000 εικόνες σε κλίμακα του γκρι σε 10 κατηγορίες. Θα χρησιμοποιήσουμε 60000 για εκπαίδευση και τα υπόλοιπα 10000 για δοκιμές. Μπορείτε να αποκτήσετε πρόσβαση στο Fashion MNIST απευθείας από το TensorFlow, απλώς εισαγάγετε και φορτώστε τα δεδομένα.

  • Ας εισαγάγουμε πρώτα τις βιβλιοθήκες
από __future__ import absolute_import, Division, print_function # TensorFlow και tf.keras import tensorflow as tf from tensorflow import keras # Helper libraries εισαγωγή numpy as np import matplotlib.pyplot as plt
  • Ας φορτώσουμε τα δεδομένα
fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data ()
  • Στη συνέχεια, θα χαρτογραφήσουμε τις εικόνες σε τάξεις
class_names = ['T-shirt / top', 'Pouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
  • Εξερεύνηση των δεδομένων
σιδηροδρομικές εικόνες.σχήμα 
# Κάθε ετικέτα κυμαίνεται μεταξύ 0-9
σιδηροδρομικές ετικέτες 
test_images.σχήμα
  • Τώρα, ήρθε η ώρα να προ-επεξεργαστείτε τα δεδομένα.
παρακαλώ.φιγούρα() παρακαλώ.εμφανίζω(σιδηροδρομικές εικόνες[0]) παρακαλώ.γραμμή χρωμάτων() παρακαλώ.πλέγμα(Ψευδής) παρακαλώ.προβολή() 
#Εάν ελέγξετε την πρώτη εικόνα στο σετ προπόνησης, θα δείτε ότι οι τιμές των pixel πέφτουν από 0 έως 255.

  • Πρέπει να κλιμακώσουμε τις εικόνες από 0-1 για να τις τροφοδοτήσουμε στο Νευρωνικό Δίκτυο
σιδηροδρομικές εικόνες = σιδηροδρομικές εικόνες / 255.0 test_images = test_images / 255.0
  • Ας εμφανίσουμε μερικές εικόνες.
παρακαλώ.φιγούρα(σύκο=(10,10)) Για Εγώ σε εύρος(25): παρακαλώ.υποπεριοχή(5,5,Εγώ+ένας) παρακαλώ.xticks([]) παρακαλώ.yticks([]) παρακαλώ.πλέγμα(Ψευδής) παρακαλώ.εμφανίζω(σιδηροδρομικές εικόνες[Εγώ], cmap=παρακαλώ.εκ.δυάδικος) παρακαλώ.xlabel(class_names[σιδηροδρομικές ετικέτες[Εγώ]]) παρακαλώ.προβολή()
 

  • Ρυθμίστε τα επίπεδα
μοντέλο = σκληρός.Ακολουθητικός([ σκληρός.στρώματα.Ισοπεδώνω(input_shape=(28, 28)), σκληρός.στρώματα.Πυκνός(128, δραστηριοποίηση=στ.αρ.relu), σκληρός.στρώματα.Πυκνός(10, δραστηριοποίηση=στ.αρ.softmax) ])
  • Συντάξτε το μοντέλο
μοντέλο.συντάσσω(βελτιστοποιητής='Αδάμ', απώλεια='sparse_categorical_crossentropy', μετρήσεις=['ακρίβεια'])
  • Εκπαίδευση μοντέλων
μοντέλο.κατάλληλος(σιδηροδρομικές εικόνες, σιδηροδρομικές ετικέτες, εποχές=10)

  • Αξιολόγηση της ακρίβειας
test_loss, test_acc = μοντέλο.αξιολογώ(test_images, δοκιμές_ετικέτες) Τυπώνω('Ακρίβεια δοκιμής:', test_acc)

  • Κάνοντας προβλέψεις
προβλέψεις = μοντέλο.προλέγω(test_images)
προβλέψεις[0]

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

π.χ..argmax(προβλέψεις[0])Το #Model είναι πιο σίγουρο ότι είναι ένα μποτάκι στον αστράγαλο. Ας δούμε αν είναι σωστό

Έξοδος: 9

πώς να προειδοποιείτε σε javascript
δοκιμές_ετικέτες[0]

Έξοδος: 9

  • Τώρα, ήρθε η ώρα να δούμε το πλήρες σύνολο των 10 καναλιών
ορισμός plot_image(Εγώ, predactions_array, true_label, π.χ.): predactions_array, true_label, π.χ. = predactions_array[Εγώ], true_label[Εγώ], π.χ.[Εγώ] παρακαλώ.πλέγμα(Ψευδής) παρακαλώ.xticks([]) παρακαλώ.yticks([]) παρακαλώ.εμφανίζω(π.χ., cmap=παρακαλώ.εκ.δυάδικος) predicated_label = π.χ..argmax(predactions_array) αν predicated_label == true_label: χρώμα = 'πράσινος' αλλού: χρώμα = 'καθαρά' παρακαλώ.xlabel('{} {: 2.0στ}% ({}).μορφή(class_names[predicated_label], 100*π.χ..Μέγιστη(predactions_array), class_names[true_label]), χρώμα=χρώμα) ορισμός plot_value_array(Εγώ, predactions_array, true_label): predactions_array, true_label = predactions_array[Εγώ], true_label[Εγώ] παρακαλώ.πλέγμα(Ψευδής) παρακαλώ.xticks([]) παρακαλώ.yticks([]) αυτό το σχέδιο = παρακαλώ.μπαρ(εύρος(10), predactions_array, χρώμα='# 777777') παρακαλώ.γλιμ([0, ένας]) predicated_label = π.χ..argmax(predactions_array) αυτό το σχέδιο[predicated_label].σετ_χρώμα('καθαρά') αυτό το σχέδιο[true_label].σετ_χρώμα('πράσινος')
  • Ας δούμε πρώτα την 0η και τη 10η εικόνα
Εγώ = 0 παρακαλώ.φιγούρα(σύκο=(6,3)) παρακαλώ.υποπεριοχή(ένας,2,ένας) plot_image(Εγώ, προβλέψεις, δοκιμές_ετικέτες, test_images) παρακαλώ.υποπεριοχή(ένας,2,2) plot_value_array(Εγώ, προβλέψεις, δοκιμές_ετικέτες) παρακαλώ.προβολή()

Εγώ = 10 παρακαλώ.φιγούρα(σύκο=(6,3)) παρακαλώ.υποπεριοχή(ένας,2,ένας) plot_image(Εγώ, προβλέψεις, δοκιμές_ετικέτες, test_images) παρακαλώ.υποπεριοχή(ένας,2,2) plot_value_array(Εγώ, προβλέψεις, δοκιμές_ετικέτες) παρακαλώ.προβολή()

  • Τώρα, ας σχεδιάσουμε πολλές εικόνες και τις προβλέψεις τους. Οι σωστές είναι πράσινες, ενώ οι λανθασμένες είναι κόκκινες.
αριθ. σειρές = 5 αριθ ._cols = 3 αριθμοί_εικονίδια = αριθ. σειρές*αριθ ._cols παρακαλώ.φιγούρα(σύκο=(2*2*αριθ ._cols, 2*αριθ. σειρές)) Για Εγώ σε εύρος(αριθμοί_εικονίδια): παρακαλώ.υποπεριοχή(αριθ. σειρές, 2*αριθ ._cols, 2*Εγώ+ένας) plot_image(Εγώ, προβλέψεις, δοκιμές_ετικέτες, test_images) παρακαλώ.υποπεριοχή(αριθ. σειρές, 2*αριθ ._cols, 2*Εγώ+2) plot_value_array(Εγώ, προβλέψεις, δοκιμές_ετικέτες) παρακαλώ.προβολή()

  • Τέλος, θα χρησιμοποιήσουμε το εκπαιδευμένο μοντέλο για να κάνουμε μια πρόβλεψη για μια μόνο εικόνα.
# Τραβήξτε μια εικόνα από το σύνολο δεδομένων δοκιμής π.χ. = test_images[0] Τυπώνω(π.χ..σχήμα)
# Προσθέστε την εικόνα σε μια παρτίδα όπου είναι το μόνο μέλος. π.χ. = (π.χ..επέκταση_dims(π.χ.,0)) Τυπώνω(π.χ..σχήμα)
predactions_single = μοντέλο.προλέγω(π.χ.) Τυπώνω(predactions_single)

plot_value_array(0, predactions_single, δοκιμές_ετικέτες) παρακαλώ.xticks(εύρος(10), class_names, περιστροφή=Τέσσερα πέντε) παρακαλώ.προβολή()

  • Όπως μπορείτε να δείτε την πρόβλεψη για τη μοναδική μας εικόνα σε παρτίδες.
prediction_result = π.χ..argmax(predactions_single[0])

Έξοδος: 9

CIFAR-10: CNN

Το σύνολο δεδομένων CIFAR-10 αποτελείται από αεροπλάνα, σκύλους, γάτες και άλλα αντικείμενα. Θα προεπεξεργαστείτε τις εικόνες και, στη συνέχεια, θα εκπαιδεύσετε ένα συνελικτικό νευρικό δίκτυο σε όλα τα δείγματα. Οι εικόνες πρέπει να είναι κανονικοποιημένες και οι ετικέτες να είναι κωδικοποιημένες. Αυτή η υπόθεση χρήσης σίγουρα θα ξεκαθαρίσει τις αμφιβολίες σας σχετικά με την ταξινόμηση εικόνας TensorFlow.

  • Λήψη των δεδομένων
από urllib.request εισαγωγή urlretrieve από os. μονοπάτι εισαγωγή είναι αρχείο, είναι αιθάλη από tqdm εισαγωγή tqdm εισαγωγή tarfile cifar10_dataset_folder_path = «cifar-10-batches-py» τάξη ΛήψηProgress(tqdm): last_block = 0 ορισμός άγκιστρο(εαυτός, block_num=ένας, block_size=ένας, συνολικό μέγεθος=Κανένας): εαυτός.σύνολο = συνολικό μέγεθος εαυτός.εκσυγχρονίζω((block_num - εαυτός.last_block) * block_size) εαυτός.last_block = block_num » ελέγξτε εάν το αρχείο δεδομένων (zip) έχει ήδη ληφθεί αν όχι, πραγματοποιήστε λήψη από το «https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz» και αποθηκεύστε το ως cifar-10-python.tar.gz » αν δεν είναι αρχείο(«cifar-10-python.tar.gz»): με ΛήψηProgress(μονάδα='ΣΙ', μονάδα_ κλίμακας=Αληθής, μινιμαλιστές=ένας, κατεβ='Σύνολο δεδομένων CIFAR-10') όπως και pbar: urlretrieve( 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz', «cifar-10-python.tar.gz», pbar.άγκιστρο) αν δεν είναι αιθάλη(cifar10_dataset_folder_path): με tarfile.Άνοιξε(«cifar-10-python.tar.gz») όπως και πίσσα: πίσσα.αποσυμπίεση όλων() πίσσα.Κλείσε()
  • Εισαγωγή απαραίτητων βιβλιοθηκών
εισαγωγή πίκλα εισαγωγή αδυσώπητος όπως και π.χ. εισαγωγή matplotlib.pyplot όπως και παρακαλώ
  • Κατανόηση των δεδομένων

Η αρχική δέσμη δεδομένων είναι 10000 × 3072 τάση εκφρασμένη σε συστοιχία numpy, όπου το 10000 είναι ο αριθμός δειγμάτων δεδομένων. Η εικόνα είναι έγχρωμη και μεγέθους 32 × 32. Η τροφοδοσία μπορεί να γίνει είτε σε μορφή (πλάτος x ύψος x κανάλι) ή (κανάλι_ευρώ x πλάτος x ύψος). Ας ορίσουμε τις ετικέτες.

ορισμός load_label_names(): ΕΠΙΣΤΡΟΦΗ ['αεροπλάνο', 'αυτοκίνητο', 'πουλί', 'Γάτα', 'ελάφι', 'σκύλος', 'βάτραχος', 'άλογο', 'πλοίο', 'φορτηγό']
  • Αναδιαμόρφωση των δεδομένων

Πρόκειται να αναδιαμορφώσουμε τα δεδομένα σε δύο στάδια

τι είναι ένας δυναμικός πίνακας

Πρώτον, διαιρέστε το διάνυσμα γραμμής (3072) σε 3 κομμάτια. Κάθε κομμάτι αντιστοιχεί σε κάθε κανάλι. Αυτό έχει ως αποτέλεσμα (3 x 1024) διάσταση ενός τανυστή. Στη συνέχεια, διαιρέστε τον τανυστή που προκύπτει από το προηγούμενο βήμα με 32. 32 εδώ σημαίνει το πλάτος μιας εικόνας. Αυτό έχει ως αποτέλεσμα (3x32x32).

Δεύτερον, πρέπει να μεταφέρουμε τα δεδομένα από (κανάλι_αριθμού, πλάτος, ύψος) έως (πλάτος, ύψος, κανάλι_ευρώ). Για αυτό, θα χρησιμοποιήσουμε τη συνάρτηση μεταφοράς.

ορισμός load_cfar10_batch(cifar10_dataset_folder_path, batch_id): με Άνοιξε(cifar10_dataset_folder_path + '/ data_batch_' + Π(batch_id), τρόπος=«rb») όπως και αρχείο: # σημειώστε ότι ο τύπος κωδικοποίησης είναι 'latin1' σύνολο παραγωγής = πίκλα.φορτώνω(αρχείο, κωδικοποίηση=«λατινικά») χαρακτηριστικά = σύνολο παραγωγής['δεδομένα'].αναπλάσσω((Λέν(σύνολο παραγωγής['δεδομένα']), 3, 32, 32)).μεταθέτω(0, 2, 3, ένας) ετικέτες = σύνολο παραγωγής[«ετικέτες»] ΕΠΙΣΤΡΟΦΗ χαρακτηριστικά, επιγραφή
  • Εξερεύνηση των δεδομένων
ορισμός display_stats(cifar10_dataset_folder_path, batch_id, sample_id): χαρακτηριστικά, ετικέτες = load_cfar10_batch(cifar10_dataset_folder_path, batch_id) αν δεν (0 <= sample_id < Λέν(χαρακτηριστικά)): Τυπώνω('{}δείγματα σε παρτίδα{}.{}είναι εκτός εμβέλειας. '.μορφή(Λέν(χαρακτηριστικά), batch_id, sample_id)) ΕΠΙΣΤΡΟΦΗ Κανένας Τυπώνω(' Στατιστικά παρτίδας #{}: '.μορφή(batch_id)) Τυπώνω(# δειγμάτων:{} '.μορφή(Λέν(χαρακτηριστικά))) ονόματα ετικέτας = load_label_names() ετικέτες_counts = υπαγορεύω(φερμουάρ(*π.χ..μοναδικός(ετικέτες, επιστροφή_καταβολών=Αληθής))) Για κλειδί, αξία σε ετικέτες_counts.αντικείμενα(): Τυπώνω(«Αριθμός ετικετών [{}] ({}):{}'.μορφή(κλειδί, ονόματα ετικέτας[κλειδί].ανώτερος(), αξία)) sample_image = χαρακτηριστικά[sample_id] δείγμα_ετικέτα = ετικέτες[sample_id] Τυπώνω(' Παράδειγμα εικόνας{}: '.μορφή(sample_id)) Τυπώνω('Εικόνα - Ελάχιστη τιμή:{}Μέγιστη τιμή:{}'.μορφή(sample_image.ελάχ(), sample_image.Μέγιστη())) Τυπώνω('Εικόνα - Σχήμα:{}'.μορφή(sample_image.σχήμα)) Τυπώνω('Ετικέτα - Αναγνωριστικό ετικέτας:{}Ονομα:{}'.μορφή(δείγμα_ετικέτα, ονόματα ετικέτας[δείγμα_ετικέτα])) παρακαλώ.εμφανίζω(sample_image)
%matplotlib στη γραμμή %διαμόρφωση InlineBackend.σχήμα_μορφής = 'αμφιβληστροειδής χιτώνας' εισαγωγή αδυσώπητος όπως και π.χ. # Εξερευνήστε το σύνολο δεδομένων batch_id = 3 sample_id = 7000 display_stats(cifar10_dataset_folder_path, batch_id, sample_id)

  • Εφαρμογή συναρτήσεων προεπεξεργασίας

Θα ομαλοποιήσουμε τα δεδομένα μέσω Κανονικοποίησης Ελάχιστης-Μέγιστης. Αυτό απλώς κάνει όλες τις τιμές x να κυμαίνονται μεταξύ 0 και 1.
y = (x-min) / (max-min)

ορισμός ομαλύνω(Χ): » διαφωνία - x: εισαγωγή δεδομένων εικόνας σε εύθραυστη συστοιχία [32, 32, 3] ΕΠΙΣΤΡΟΦΗ - κανονικοποιημένο x » ελάχιστο_val = π.χ..ελάχ(Χ) max_val = π.χ..Μέγιστη(Χ) Χ = (Χ-ελάχιστο_val) / (max_val-ελάχιστο_val) ΕΠΙΣΤΡΟΦΗ Χ
  • One-Hot Encode
ορισμός one_hot_encode(Χ): » διαφωνία - x: μια λίστα με ετικέτες ΕΠΙΣΤΡΟΦΗ - μία θερμή μήτρα κωδικοποίησης (αριθμός ετικετών, αριθμός κλάσης) » κωδικοποιημένο = π.χ..μηδενικά((Λέν(Χ), 10)) Για idx, Ώρες σε απαριθμώ(Χ): κωδικοποιημένο[idx] [Ώρες] = ένας ΕΠΙΣΤΡΟΦΗ κωδικοποιημένο
  • Προεπεξεργασία και αποθήκευση των δεδομένων
ορισμός _preprocess_and_save(ομαλύνω, one_hot_encode, χαρακτηριστικά, ετικέτες, όνομα αρχείου): χαρακτηριστικά = ομαλύνω(χαρακτηριστικά) ετικέτες = one_hot_encode(ετικέτες) πίκλα.εγκαταλείπω((χαρακτηριστικά, ετικέτες), Άνοιξε(όνομα αρχείου, «wb»)) ορισμός preprocess_and_save_data(cifar10_dataset_folder_path, ομαλύνω, one_hot_encode): παρτίδες = 5 valid_features = [] έγκυρες ετικέτες = [] Για batch_i σε εύρος(ένας, παρτίδες + ένας): χαρακτηριστικά, ετικέτες = load_cfar10_batch(cifar10_dataset_folder_path, batch_i) # εύρεση ευρετηρίου να είναι το σημείο ως δεδομένα επικύρωσης σε ολόκληρο το σύνολο δεδομένων της παρτίδας (10%) index_of_validation = int(Λέν(χαρακτηριστικά) * 0.1) # προεπεξεργασία του 90% ολόκληρου του συνόλου δεδομένων της παρτίδας # - ομαλοποιήστε τις λειτουργίες # - one_hot_encode οι ετικέτες # - αποθηκεύστε σε ένα νέο αρχείο με το όνομα, 'preprocess_batch_' + batch_number # - κάθε αρχείο για κάθε παρτίδα _preprocess_and_save(ομαλύνω, one_hot_encode, χαρακτηριστικά[:-index_of_validation], ετικέτες[:-index_of_validation], 'preprocess_batch_' + Π(batch_i) + '.Π') # σε αντίθεση με το σύνολο δεδομένων εκπαίδευσης, το σύνολο δεδομένων επικύρωσης θα προστεθεί σε όλο το σύνολο δεδομένων δέσμης # - πάρτε το 10% του συνολικού συνόλου δεδομένων της παρτίδας # - προσθέστε τα σε μια λίστα με # - valid_features # - έγκυρες_ετικέτες valid_features.επεκτείνω(χαρακτηριστικά[-index_of_validation:]) έγκυρες ετικέτες.επεκτείνω(ετικέτες[-index_of_validation:]) # προεπεξεργασία του συνόλου δεδομένων στοίβαξης επικύρωσης _preprocess_and_save(ομαλύνω, one_hot_encode, π.χ..πίνακας(valid_features), π.χ..πίνακας(έγκυρες ετικέτες), 'preprocess_validation.p') # φορτώστε το σύνολο δεδομένων δοκιμής με Άνοιξε(cifar10_dataset_folder_path + '/ test_batch', τρόπος=«rb») όπως και αρχείο: σύνολο παραγωγής = πίκλα.φορτώνω(αρχείο, κωδικοποίηση=«λατινικά») # προεπεξεργασία των δεδομένων δοκιμής δοκιμές_δεδομένα = σύνολο παραγωγής['δεδομένα'].αναπλάσσω((Λέν(σύνολο παραγωγής['δεδομένα']), 3, 32, 32)).μεταθέτω(0, 2, 3, ένας) δοκιμές_ετικέτες = σύνολο παραγωγής[«ετικέτες»] # Προεπεξεργασία και αποθήκευση όλων των δεδομένων δοκιμών _preprocess_and_save(ομαλύνω, one_hot_encode, π.χ..πίνακας(δοκιμές_δεδομένα), π.χ..πίνακας(δοκιμές_ετικέτες), 'preprocess_training.p')
preprocess_and_save_data(cifar10_dataset_folder_path, ομαλύνω, one_hot_encode)
  • Σημείο ελέγχου
εισαγωγή πίκλα valid_features, έγκυρες ετικέτες = πίκλα.φορτώνω(Άνοιξε('preprocess_validation.p', τρόπος=«rb»))
  • Δημιουργία δικτύου

Το σύνολο του μοντέλου αποτελείται από 14 επίπεδα συνολικά.

εισαγωγή τάση ροής όπως και στ ορισμός conv_net(Χ, keep_prob): conv1_filter = στ.Μεταβλητός(στ.περικομμένο_πλάσιο(σχήμα=[3, 3, 3, 64], σημαίνω=0, stddev=0,08)) conv2_filter = στ.Μεταβλητός(στ.περικομμένο_πλάσιο(σχήμα=[3, 3, 64, 128], σημαίνω=0, stddev=0,08)) conv3_filter = στ.Μεταβλητός(στ.περικομμένο_πλάσιο(σχήμα=[5, 5, 128, 256], σημαίνω=0, stddev=0,08)) conv4_filter = στ.Μεταβλητός(στ.περικομμένο_πλάσιο(σχήμα=[5, 5, 256, 512], σημαίνω=0, stddev=0,08)) # 1, 2 μετατρ1 = στ.αρ.μετατρ(Χ, conv1_filter, βήματα=[ένας,ένας,ένας,ένας], υλικό παραγεμίσματος='ΙΔΙΟ') μετατρ1 = στ.αρ.relu(μετατρ1) conv1_pool = στ.αρ.max_pool(μετατρ1, κ. μέγεθος=[ένας,2,2,ένας], βήματα=[ένας,2,2,ένας], υλικό παραγεμίσματος='ΙΔΙΟ') conv1_bn = στ.στρώματα.batch_normalization(conv1_pool) # 3. 4 μετατρ2 = στ.αρ.μετατρ(conv1_bn, conv2_filter, βήματα=[ένας,ένας,ένας,ένας], υλικό παραγεμίσματος='ΙΔΙΟ') μετατρ2 = στ.αρ.relu(μετατρ2) conv2_pool = στ.αρ.max_pool(μετατρ2, κ. μέγεθος=[ένας,2,2,ένας], βήματα=[ένας,2,2,ένας], υλικό παραγεμίσματος='ΙΔΙΟ') conv2_bn = στ.στρώματα.batch_normalization(conv2_pool) # 5, 6 μετατρ. 3 = στ.αρ.μετατρ(conv2_bn, conv3_filter, βήματα=[ένας,ένας,ένας,ένας], υλικό παραγεμίσματος='ΙΔΙΟ') μετατρ. 3 = στ.αρ.relu(μετατρ. 3) conv3_pool = στ.αρ.max_pool(μετατρ. 3, κ. μέγεθος=[ένας,2,2,ένας], βήματα=[ένας,2,2,ένας], υλικό παραγεμίσματος='ΙΔΙΟ') conv3_bn = στ.στρώματα.batch_normalization(conv3_pool) # 7, 8 μετατρ4 = στ.αρ.μετατρ(conv3_bn, conv4_filter, βήματα=[ένας,ένας,ένας,ένας], υλικό παραγεμίσματος='ΙΔΙΟ') μετατρ4 = στ.αρ.relu(μετατρ4) conv4_pool = στ.αρ.max_pool(μετατρ4, κ. μέγεθος=[ένας,2,2,ένας], βήματα=[ένας,2,2,ένας], υλικό παραγεμίσματος='ΙΔΙΟ') conv4_bn = στ.στρώματα.batch_normalization(conv4_pool) # 9 επίπεδος = στ.συνεισφορά.στρώματα.ισοπεδώνω(conv4_bn) # 10 πλήρης1 = στ.συνεισφορά.στρώματα.πλήρως_συνδεδεμένο(εισόδους=επίπεδος, num_outputs=128, ενεργοποίηση_fn=στ.αρ.relu) πλήρης1 = στ.αρ.εγκατάλειψη(πλήρης1, keep_prob) πλήρης1 = στ.στρώματα.batch_normalization(πλήρης1) # έντεκα πλήρης2 = στ.συνεισφορά.στρώματα.πλήρως_συνδεδεμένο(εισόδους=πλήρης1, num_outputs=256, ενεργοποίηση_fn=στ.αρ.relu) πλήρης2 = στ.αρ.εγκατάλειψη(πλήρης2, keep_prob) πλήρης2 = στ.στρώματα.batch_normalization(πλήρης2) # 12 πλήρης3 = στ.συνεισφορά.στρώματα.πλήρως_συνδεδεμένο(εισόδους=πλήρης2, num_outputs=512, ενεργοποίηση_fn=στ.αρ.relu) πλήρης3 = στ.αρ.εγκατάλειψη(πλήρης3, keep_prob) πλήρης3 = στ.στρώματα.batch_normalization(πλήρης3) # 13 πλήρης4 = στ.συνεισφορά.στρώματα.πλήρως_συνδεδεμένο(εισόδους=πλήρης3, num_outputs=1024, ενεργοποίηση_fn=στ.αρ.relu) πλήρης4 = στ.αρ.εγκατάλειψη(πλήρης4, keep_prob) πλήρης4 = στ.στρώματα.batch_normalization(πλήρης4) # 14 έξω = στ.συνεισφορά.στρώματα.πλήρως_συνδεδεμένο(εισόδους=πλήρης3, num_outputs=10, ενεργοποίηση_fn=Κανένας) ΕΠΙΣΤΡΟΦΗ έξω
  • Υπερπαραμέτρους
εποχές = 10 μέγεθος παρτίδας = 128 keep_probability = 0.7 εκμάθηση_ ρυθμός = 0,001
λογότυπα = conv_net(Χ, keep_prob) μοντέλο = στ.Ταυτότητα(λογότυπα, όνομα=«ημερολόγια») # Όνομα logits Tensor, ώστε να μπορούν να φορτωθούν από το δίσκο μετά την προπόνηση # Απώλεια και βελτιστοποίηση κόστος = στ.μείωση_μεσα(στ.αρ.softmax_cross_entropy_with_logits(λογότυπα=λογότυπα, ετικέτες=Υ)) βελτιστοποιητής = στ.τρένο.AdamOptimizer(εκμάθηση_ ρυθμός=εκμάθηση_ ρυθμός).σμικροποιώ(κόστος) # Ακρίβεια σωστή_περίοδος = στ.ίσος(στ.argmax(λογότυπα, ένας), στ.argmax(Υ, ένας)) ακρίβεια = στ.μείωση_μεσα(στ.εκμαγείο(σωστή_περίοδος, στ.επιπλέει32), όνομα='ακρίβεια')
  • Εκπαιδεύστε το Νευρωνικό Δίκτυο
# Ενιαία βελτιστοποίηση 
ορισμός
train_neural_network(συνεδρία, βελτιστοποιητής, keep_probability, feature_batch, label_batch): συνεδρία.τρέξιμο(βελτιστοποιητής, feed_dict={ Χ: feature_batch, Υ: label_batch, keep_prob: keep_probability })
# Εμφάνιση στατιστικών print_stats(συνεδρία, feature_batch, label_batch, κόστος, ακρίβεια): απώλεια = sess.τρέξιμο(κόστος, feed_dict={ Χ: feature_batch, Υ: label_batch, keep_prob: ένας. }) ισχύει_acc = sess.τρέξιμο(ακρίβεια, feed_dict={ Χ: valid_features, Υ: έγκυρες ετικέτες, keep_prob: ένας. }) Τυπώνω('Απώλεια:{:> 10.4στ}Ακρίβεια επικύρωσης:{: .6f}'.μορφή(απώλεια, ισχύει_acc))
  • Πλήρης εκπαίδευση και αποθήκευση του μοντέλου
ορισμός batch_features_labels(χαρακτηριστικά, ετικέτες, μέγεθος παρτίδας): » Διαχωρίστε τα χαρακτηριστικά και τις ετικέτες σε παρτίδες » Για αρχή σε εύρος(0, Λέν(χαρακτηριστικά), μέγεθος παρτίδας): τέλος = ελάχ(αρχή + μέγεθος παρτίδας, Λέν(χαρακτηριστικά)) απόδοση παραγωγής χαρακτηριστικά[αρχή:τέλος], ετικέτες[αρχή:τέλος] ορισμός load_preprocess_training_batch(batch_id, μέγεθος παρτίδας): » Φορτώστε τα Προεπεξεργασμένα δεδομένα εκπαίδευσης και επιστρέψτε τα σε παρτίδες ή λιγότερες » όνομα αρχείου = 'preprocess_batch_' + Π(batch_id) + '.Π' χαρακτηριστικά, ετικέτες = πίκλα.φορτώνω(Άνοιξε(όνομα αρχείου, τρόπος=«rb»)) # Επιστρέψτε τα δεδομένα εκπαίδευσης σε παρτίδες μεγέθους ή λιγότερο ΕΠΙΣΤΡΟΦΗ batch_features_labels(χαρακτηριστικά, ετικέτες, μέγεθος παρτίδας)
# Αποθήκευση μοντέλου και διαδρομής 
save_model_path
= './image_classification' Τυπώνω('Εκπαίδευση...') με στ.Συνεδρία() όπως και sess: # Αρχικοποίηση των μεταβλητών sess.τρέξιμο(στ.global_variables_initializer()) # Κύκλος προπόνησης Για εποχή σε εύρος(εποχές): # Βρόχος σε όλες τις παρτίδες παρτίδες = 5 Για batch_i σε εύρος(ένας, παρτίδες + ένας): Για batch_features, μαζικές ετικέτες σε load_preprocess_training_batch(batch_i, μέγεθος παρτίδας): train_neural_network(sess, βελτιστοποιητής, keep_probability, batch_features, μαζικές ετικέτες) Τυπώνω('Εποχή{:> 2}, Παρτίδα CIFAR-10{}: '.μορφή(εποχή + ένας, batch_i), τέλος=») print_stats(sess, batch_features, μαζικές ετικέτες, κόστος, ακρίβεια) # Αποθήκευση μοντέλου οικονόμος = στ.τρένο.Οικονόμος() save_path = οικονόμος.αποθηκεύσετε(sess, save_model_path)

Τώρα, το σημαντικό μέρος της ταξινόμησης εικόνας Tensorflow ολοκληρώθηκε. Τώρα, ήρθε η ώρα να δοκιμάσετε το μοντέλο.

  • Δοκιμή του μοντέλου
εισαγωγή πίκλα εισαγωγή αδυσώπητος όπως και π.χ. εισαγωγή matplotlib.pyplot όπως και παρακαλώ από sklearn.preprocessing εισαγωγή ΕτικέταBinarizer ορισμός batch_features_labels(χαρακτηριστικά, ετικέτες, μέγεθος παρτίδας): » Διαχωρίστε τα χαρακτηριστικά και τις ετικέτες σε παρτίδες » Για αρχή σε εύρος(0, Λέν(χαρακτηριστικά), μέγεθος παρτίδας): τέλος = ελάχ(αρχή + μέγεθος παρτίδας, Λέν(χαρακτηριστικά)) απόδοση παραγωγής χαρακτηριστικά[αρχή:τέλος], ετικέτες[αρχή:τέλος] ορισμός display_image_predictions(χαρακτηριστικά, ετικέτες, προβλέψεις, top_n_predictions): n_ τάξεις = 10 ονόματα ετικέτας = load_label_names() label_binarizer = ΕτικέταBinarizer() label_binarizer.κατάλληλος(εύρος(n_ τάξεις)) ετικέτες_ids = label_binarizer.inverse_transform(π.χ..πίνακας(ετικέτες)) Σύκο, axies = παρακαλώ.υποπεριοχές(στενεύει=top_n_predictions, ncols=2, σύκο=(είκοσι, 10)) Σύκο.σφιχτό παιχνίδι() Σύκο.υπότιτλος(«Προβλέψεις Softmax», μέγεθος γραμματοσειράς=είκοσι, Υ=1.1) n_προβλέψεις = 3 περιθώριο = 0,05 ind = π.χ..Ενα ΕΥΡΟΣ(n_προβλέψεις) πλάτος = (ένας. - 2. * περιθώριο) / n_προβλέψεις Για εικόνα_ε, (χαρακτηριστικό, ετικέτα_id, pred_indicies, pred_values) σε απαριθμώ(φερμουάρ(χαρακτηριστικά, ετικέτες_ids, προβλέψεις.δείκτες, προβλέψεις.αξίες)): αν (εικόνα_ε < top_n_predictions): pred_names = [ονόματα ετικέτας[pred_i] Για pred_i σε pred_indicies] σωστό όνομα = ονόματα ετικέτας[ετικέτα_id] axies[εικόνα_ε] [0].εμφανίζω((χαρακτηριστικό*255).άτυπος(π.χ..int32, αντίγραφο=Ψευδής)) axies[εικόνα_ε] [0].set_title(σωστό όνομα) axies[εικόνα_ε] [0].set_axis_off() axies[εικόνα_ε] [ένας].μπαχ(ind + περιθώριο, pred_values[:3], πλάτος) axies[εικόνα_ε] [ένας].set_yticks(ind + περιθώριο) axies[εικόνα_ε] [ένας].set_yticklabels(pred_names[::-ένας]) axies[εικόνα_ε] [ένας].set_xticks([0, 0,5, 1.0])
%matplotlib στη γραμμή %διαμόρφωση InlineBackend.σχήμα_μορφής = 'αμφιβληστροειδής χιτώνας' εισαγωγή τάση ροής όπως και στ εισαγωγή πίκλα εισαγωγή τυχαίος save_model_path = './image_classification' μέγεθος παρτίδας = 64 n_ δείγματα = 10 top_n_predictions = 5 ορισμός test_model(): δοκιμές_δεδομένα, δοκιμές_ετικέτες = πίκλα.φορτώνω(Άνοιξε('preprocess_training.p', τρόπος=«rb»)) φόρτωση_γράφου = στ.Γραφική παράσταση() με στ.Συνεδρία(γραφική παράσταση=φόρτωση_γράφου) όπως και sess: # Μοντέλο φόρτωσης φορτωτής = στ.τρένο.import_meta_graph(save_model_path + «.μετα») φορτωτής.επαναφέρω(sess, save_model_path) # Λάβετε Tensors από φορτωμένο μοντέλο φορτωμένο_x = φόρτωση_γράφου.get_tensor_by_name('είσοδος_x: 0') φορτωμένο_y = φόρτωση_γράφου.get_tensor_by_name('έξοδος_y: 0') φορτωμένο_keep_prob = φόρτωση_γράφου.get_tensor_by_name('keep_prob: 0') φόρτωσε_όνομα = φόρτωση_γράφου.get_tensor_by_name('logits: 0') φόρτωσε_acc = φόρτωση_γράφου.get_tensor_by_name(«ακρίβεια: 0») # Λάβετε ακρίβεια σε παρτίδες για περιορισμούς μνήμης test_batch_acc_total = 0 test_batch_count = 0 Για train_feature_batch, train_label_batch σε batch_features_labels(δοκιμές_δεδομένα, δοκιμές_ετικέτες, μέγεθος παρτίδας): test_batch_acc_total + = sess.τρέξιμο( φόρτωσε_acc, feed_dict={φορτωμένο_x: train_feature_batch, φορτωμένο_y: train_label_batch, φορτωμένο_keep_prob: 1.0}) test_batch_count + = ένας Τυπώνω(«Ακρίβεια δοκιμών:{} '.μορφή(test_batch_acc_total/test_batch_count)) # Εκτύπωση τυχαίων δειγμάτων random_test_features, τυχαία_test_labels = πλειάδα(φερμουάρ(*τυχαίος.δείγμα(λίστα(φερμουάρ(δοκιμές_δεδομένα, δοκιμές_ετικέτες)), n_ δείγματα))) random_test_predictions = sess.τρέξιμο( στ.αρ.κορυφή_κ(στ.αρ.softmax(φόρτωσε_όνομα), top_n_predictions), feed_dict={φορτωμένο_x: random_test_features, φορτωμένο_y: τυχαία_test_labels, φορτωμένο_keep_prob: 1.0}) display_image_predictions(random_test_features, τυχαία_test_labels, random_test_predictions, top_n_predictions) test_model()

Παραγωγή: Δοκιμή ακρίβειας: 0,5882762738853503

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

Έτσι, με αυτό, καταλήγουμε στο τέλος αυτού του άρθρου TensorFlow Image Classification. Είμαι βέβαιος ότι μπορείτε τώρα να χρησιμοποιήσετε το ίδιο για να ταξινομήσετε οποιοδήποτε είδος εικόνων και δεν είστε αρχάριος στην ταξινόμηση εικόνων.

Το Edureka's με την πιστοποίηση Python Η επιμόρφωση επιμελείται από επαγγελματίες του κλάδου σύμφωνα με τις απαιτήσεις και τις απαιτήσεις του κλάδου. Θα κυριαρχήσετε τις έννοιες όπως η λειτουργία SoftMax, το Autoencoder Neural Networks, το Restricted Boltzmann Machine (RBM), το Keras & το TFLearn. Το μάθημα έχει επιμεληθεί ειδικά από ειδικούς του κλάδου με μελέτες περιπτώσεων σε πραγματικό χρόνο.