TensorFlow: riconoscimento automatico di caratteri scritti a mano

Ispirate dal funzionamento del cervello umano, le reti neurali profonde (Deep Neural Network) possono risolvere compiti di classificazione con un'accuratezza mai vista prima, se addestrate con una mole adeguata di dati. Il Deep Learning è emerso negli ultimi anni come una delle principali tecnologie per la produzione di sistemi intelligenti che imparano dai dati. I framework open source, come TensorFlow, hanno reso questa tecnologia ampiamente disponibile a tutti coloro che vogliano mettersi in gioco con l'apprendimento macchina (Machine Learning). In questo articolo andremo ad illustrare un esempio di implementazione in TensorFlow di una rete neurale per il riconoscimento di caratteri scritti a mano, in particolare le prime 10 cifre.

Introduzione

TensorFlow è attualmente il principale software open source per il Deep Learning, utilizzato da un numero sempre crescente  di professionisti che lavorano sulla visione artificiale, sull'elaborazione del linguaggio naturale (NLP), sul riconoscimento vocale e l'analisi predittiva in generale. In termini generali, TensorFlow è un framework progettato come interfaccia per esprimere e implementare algoritmi di apprendimento automatico, in particolare reti neurali profonde. TensorFlow è stato progettato pensando alla portabilità, ovvero l'esecuzione su un'ampia varietà di ambienti e piattaforme hardware. Con un codice essenzialmente identico, la stessa rete neurale TensorFlow potrebbe, ad esempio, essere addestrata nel cloud e distribuita su un cluster di molte macchine o su un singolo computer portatile. Potrebbe essere distribuita per fornire previsioni su un server dedicato o su piattaforme per dispositivi mobile come Android, iOS o SBC come Raspberry Pi. TensorFlow è anche compatibile, ovviamente, con i sistemi operativi Linux, macOS e Windows. TensorFlow presenta due linguaggi di frontend di alto livello. Uno di essi è Python, utilizzato dalla maggior parte dei ricercatori e data scientist. Mentre il secondo è C ++, che fornisce un'API di basso livello, utile per un'esecuzione efficiente in sistemi embedded e altri scenari.

Deep Learning

La classe di algoritmi associata all'apprendimento profondo (Deep Learning) ha riscontrato un tale successo, da lasciare i metodi tradizionali nella polvere. L'apprendimento profondo viene utilizzato oggi per capire il contenuto delle immagini o di un discorso, in sistemi che vanno da app mobile a veicoli autonomi. Nel Deep Learning, forniamo milioni di dati ad una rete di neuroni, insegnando loro a riconoscere i modelli insiti nei dati. Le reti neurali profonde prendono input grezzi (come i valori dei pixel in un'immagine) e li utilizzano per estrarre caratteristiche di livello superiore (come forme e bordi nelle immagini). In tal modo riescono a catturare concetti complessi combinando informazioni sempre più piccole, potendo così risolvere compiti impegnativi come la classificazione delle immagini.

La capacità di costruire automaticamente le rappresentazioni dei dati è un vantaggio chiave delle reti neurali profonde rispetto alle tecniche tradizionali di Machine Learning. Queste ultime, in genere, richiedono competenze nel dominio applicativo e l'ingegnerizzazione manuale delle caratteristiche (features) prima di poter avviare la fase di addestramento. Il Deep Learning è un argomento che è stato ampiamente trattato nel nostro blog. Rimandiamo quindi il lettore che volesse saperne di più sull'argomento alla lettura di precedenti articoli. Questo articolo sarà invece incentrato sull'utilizzo di TensorFlow per implementare una rete neurale.

Per affrontare la lettura dell'articolo sarebbe utile che il lettore avesse familiarità con il linguaggio di programmazione Python e con la tematica del Machine Learning.

Vai con il Flow

Per descrivere TensorFlow, partiremo subito con un esempio pratico. Dobbiamo però prima impostare l'ambiente di lavoro.

Impostare l'ambiente di lavoro

Per la scrittura e l'esecuzione del codice, utilizzeremo Google Colaboratory, anche detto Colab. E' uno strumento gratuito con cui possiamo realizzare dei notebook Jupiter. Senza addentrarci troppo nell'argomento, quello che ci interessa è che Colab ci offre un ambiente di programmazione in Python già impostato senza la necessità di installare nulla sul nostro computer. Inoltre, per eseguire il codice utilizzeremo le risorse hardware messe a disposizione da Google. Per utilizzare Colab basta:

  1. accedere al proprio account Google
  2. fare click sul seguente link
  3. quindi fare click sull'opzione in basso a destra denominata "Nuovo Blocco Note"
  4. infine fare click su "Connetti" in alto a destra e sarà così tutto pronto per iniziare

Alla fine di questo articolo è anche presente un link al file dove tutto è già impostato ed attende solo di essere eseguito e provato.

Caricare dataset e librerie

Per il nostro esempio avremo bisogno di un dataset. Useremo l'MNIST (Mixed National Institute of Standards and Technology), un dataset di 60.000 immagini (28x28 pixel ognuna) in scala di grigi, insieme a un set di prova di 10.000 immagini. Ogni immagine contiene una delle dieci cifre (da 0 a 9) scritte a mano. Si tratta di uno dei set di dati più usati nell'elaborazione delle immagini e nell'apprendimento macchina ed ha svolto un ruolo importante nello sviluppo delle reti neurali artificiali (ora generalmente indicato come apprendimento profondo). L'obiettivo del nostro esempio sarà quindi quello di realizzare un classificatore in grado di riconoscere una cifra scritta a mano.

import TensorFlow as tf 
import numpy as np
import matplotlib.pyplot as plt

from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

Le prime 3 istruzioni ci permettono di importare le librerie che utilizzeremo nello script:

  • TensorFlow chiaramente e utilizzarla nel seguito dello script in modo abbreviato come tf
  • numpy per eseguire calcoli numerici con array e utilizzarla usando l'abbreviazione np
  • matplotlib.pyplot per effettuare la visualizzazione di immagini e grafici, abbreviandola in plt

La quarta riga invece, ci permette di caricare il dataset. Grazie al metodo load_data(), il dataset può essere suddiviso assegnando i vari input ed output. In particolare:

    • x_train è il tensore che raccoglie i dati di addestramento. Un tensore altro non è che la generalizzazione del concetto di vettore: un vettore è un tensore di rango 1, una matrice è un tensore di rango 2. Il nostro x_train è un tensore di rango 3, perchè presenta 3 dimensioni. La prima dimensione è il numero di righe pari al numero di immagini cioè 60.000. La seconda e la terza dimensione sono date dalla larghezza e dalla lunghezza delle immagini cioè 28 pixel. In Figura 1 è riportata una rappresentazione grafica di x_train.
    • y_train è un vettore da 60.000 righe. In ogni riga è contenuta una cifra da 0 a 9. In sostanza, sono le etichette delle immagini in x_train. Se nella prima riga di x_train è presente l'immagine di un 5, alla prima riga di y_train ci sarà scritto 5, e così via per tutte le altre.
    • x_test è il tensore che raccoglie i dati di test, con cui valuteremo le performance della rete neurale addestrata. Dal punto di vista della struttura, è simile a x_train con l'unica differenza che presenta solo 10.000 righe.
    • y_test raccoglie le etichette delle immagini presenti in x_test.

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2158 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

4 Commenti

  1. Giuseppe Garofalo 18 Febbraio 2022
    • Andrea Garrapa 19 Febbraio 2022
  2. Andrea Garrapa 19 Febbraio 2022
  3. Giuseppe Garofalo 20 Febbraio 2022

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend