Der Bereich des maschi­nel­len Ler­nens sowie des­sen Teil­ge­biete, wer­den in vie­len Berei­chen immer rele­van­ter. Vor allem der Bereich des Deep Lear­ning, also der tie­fen neu­ro­na­len Netze, fin­det nun auch in immer mehr Ein­satz­be­rei­chen wirt­schaft­li­che Anwen­dun­gen und ent­wächst der rein aka­de­mi­schen For­schung. Erst kürz­lich konnte die Firma Deep Mind, eine Toch­ter von Alpha­bet Inc., dem Mut­ter­kon­zern von Google bahn­bre­chende Erfolge in dem sehr rele­van­ten Bereich der Pro­te­in­fal­tung ver­zeich­nen. Dem Deep Mind Team gelang es dabei sehr prä­zise Vor­her­sa­gen zu der Fal­tung von ver­schie­de­nen Pro­te­inen zu tref­fen, die bis­her in einem auf­wän­di­gen Pro­zess und meist manu­ell iden­ti­fi­ziert wer­den mussten.

Neu­ro­nale Netze wer­den jedoch auch in vie­len ande­ren Berei­chen, allen voran der Bil­der­ken­nung und der Ver­ar­bei­tung von natür­li­cher Spra­che ver­wen­det. Dar­aus erge­ben sich viel­ver­spre­chende Anwen­dun­gen für Unter­neh­men. Von der auto­ma­ti­schen Erken­nung feh­ler­haf­ter Teile in der Indus­trie mit­tels Bil­der­ken­nung bis hin zu intel­li­gen­ten Chat­bots, die im Han­del ohne mensch­li­ches Zutun die Fra­gen der Kun­den beant­wor­ten können.

In vie­len Unter­neh­men gibt es jedoch noch diverse Bar­rie­ren, die dazu füh­ren, dass diese Tech­nik noch immer nicht sehr weit ver­brei­tet ist. Eines der Hin­der­nisse ist sicher­lich die Kom­ple­xi­tät des The­mas und die damit ver­bun­dene nötige Exper­tise im Umgang mit neu­ro­na­len Net­zen. Genau an die­sem Punkt setzt fast.ai an.

fast.ai – eine kurze Vorstellung

Die Web­site von fast.ai bie­tet einen sehr popu­lä­ren und prak­tisch ori­en­tier­ten Online­kurs zum Thema Deep Lear­ning. Die­ser baut auf der gleich­na­mi­gen high-level Python Biblio­thek namens “fast.ai” auf. Bei der fast.ai Biblio­thek han­delt es sich um eine mehr­schich­tige Biblio­thek, die auf PyTorch, einer der zwei bekann­tes­ten Deep Lear­ning Libra­ries (TensorFlow/Google & PyTorch/Facebook), auf­baut. Die Biblio­thek wurde von aner­kann­ten For­schern auf dem Gebiet der neu­ro­na­len Netze ent­wi­ckelt, die sie bereits in zahl­lo­sen Pro­jek­ten ange­wen­det und ver­fei­nert haben.

Fast.ai – Warum sich der Ein­satz lohnt

Der enorme Nut­zen von fast.ai, beson­ders im Unter­neh­mens­um­feld, liegt in meh­re­ren Tat­sa­chen begrün­det. Zum einen erlaubt fast.ai durch die mehr­schich­tige Archi­tek­tur einen ver­gleichs­weise schnel­len und ein­fa­chen Ein­stieg in das The­men­feld der neu­ro­na­len Netze und bie­tet eine erstaun­li­che Fle­xi­bi­li­tät mit tief­grei­fen­den Funk­tio­nen. Abbil­dung 1 zeigt die Archi­tek­tur der Biblio­thek, die auf der obers­ten Ebene direk­ten Zugriff auf die leis­tungs­starke und anwen­dungs­ori­en­tierte Schicht bie­tet, aber dar­un­ter viele wei­ter rei­chende Ein­griffs­mög­lich­kei­ten zulässt. Mit die­ser Her­an­ge­hens­weise kön­nen bereits sehr gute Ergeb­nisse erzielt wer­den, auch ohne bereits einen Experten auf dem Gebiet im Unter­neh­men zu haben.

fast ai Bild1
Abbil­dung 1 fast.ai mehr­schich­tige Archi­tek­tur. (Quelle)

Wei­ter­hin erlaubt der Ein­satz einer Biblio­thek wie fast.ai auch größt­mög­li­che Unab­hän­gig­keit von (Cloud-)Anbietern, wel­che heut­zu­tage einige der “klas­si­schen” Deep Lear­ning Auf­ga­ben, wie die Bil­der­ken­nung in ihr Ser­vice­an­ge­bot mit auf­ge­nom­men haben und mit ihren pro­prie­tä­ren Deep Lear­ning Model­len betreiben.

Bis­he­rige Erfahrung

Die bis­he­ri­gen Erfah­run­gen ori­en­tie­ren sich pri­mär an der obers­ten Abs­trak­ti­ons­schicht der fast.ai Library, also den Appli­ca­ti­ons. Auf­grund des zuge­hö­ri­gen Kur­ses, sowie der gro­ßen Com­mu­nity an Ler­nen­den, ist die Doku­men­ta­tion aus­ge­spro­chen gut. Somit gibt es zu prak­tisch jeder Frage bereits eine Ant­wort. Die Doku­men­ta­tion ist klar ver­ständ­lich und auch ohne tief­grei­fende Vor­kennt­nisse leicht nach­zu­voll­zie­hen. Dar­über hin­aus gibt es viele Bei­spiele, die man auf ein­fa­che Art und Weise nach­bauen und an seine Bedürf­nisse anpas­sen kann.
Dies gilt nicht nur für einen ein­zel­nen spe­zi­el­len Bereich, son­dern für alle Teile der Biblio­thek. Dar­über hin­aus wird die Biblio­thek mitt­ler­weile von vie­len Cloud Anbie­tern unter­stützt, sodass auch ohne eigene Hard­ware auf­wen­dige Modelle trai­niert und benutzt wer­den kön­nen. Als einer der größ­ten Anbie­ter sei hier Paper­space genannt.

Bei­spiel von fast.ai anhand eines simp­len Image Classifiers

Ziel der Übung soll es sein, zu demons­trie­ren, wie schnell und ein­fach sich mit Hilfe der fast.ai Biblio­thek ein simp­ler Image Clas­si­fier mit erstaun­lich guter Treff­si­cher­heit trai­nie­ren lässt. In dem simp­len Bei­spiel soll es darum gehen, dass der resul­tie­rende Clas­si­fier zwi­schen einem Ele­fan­ten und einem Nas­horn unter­schie­den kann. Das gesamte Bei­spiel läuft in einer inter­ak­ti­ven Jupy­ter Note­book Umge­bung und bedient sich dem Teil der Biblio­thek, der sich mit der Bil­der­ken­nung beschäf­tigt. Das Bei­spiel ori­en­tiert sich an Kapi­tel zwei des Buches “Deep Lear­ning for Coders with Fas­tai and Pytorch: AI Appli­ca­ti­ons Wit­hout a PhD”, Howard, J. und Gug­ger, S., 2020, O’Reilly Media, Incorporated.

Schritt 0: Setup

Wir gehen davon aus, dass die fast.ai Library mit allen Abhän­gig­kei­ten bereits instal­liert und ein­ge­rich­tet ist. Am ein­fachs­ten ist dies sicher­lich bei einem Cloud Anbie­ter, der fast.ai offi­zi­ell unter­stützt, so z.B. gra­di­ent von Paper­space. Sollte man die Biblio­thek jedoch lokal benut­zen wol­len, so fin­det man auch dazu viele hilf­rei­che Res­sour­cen auf der offi­zi­el­len fast.ai Web­site. Ist alles instal­liert, müs­sen wir anfäng­lich nur die nöti­gen Biblio­the­ken einbinden.

from fastai.vision import *from fastai.vision.utils import *from fastai.vision.data import *from requests import *from pathlib import Path
Schritt 1: Daten sammeln

Um den Image Clas­si­fier zu trai­nie­ren, benut­zen wir die Bing Image Search API. Mit die­ser kön­nen wir auto­ma­ti­siert Bil­der zum Trai­nie­ren unse­res Modells bezie­hen. Dafür wird für unser Bei­spiel ledig­lich ein kos­ten­lo­ser API Key benö­tigt, der sich hier erstel­len lässt.

Mit die­sem Schlüs­sel und einem geeig­ne­ten Such­be­griff kann nun schnell und ein­fach eine aus­rei­chend große Menge an Bild­ma­te­rial für das Trai­ning gewon­nen wer­den. Dafür erstel­len wir mit fol­gen­dem Code und unse­rem API Schlüs­sel eine Liste mit Tie­ren, die wir iden­ti­fi­zie­ren wol­len und dann die rest­li­chen Ord­ner, in die wir die Bil­der her­un­ter­la­den. Dadurch wird für jedes Tier ein eige­ner Ord­ner im Ober­ord­ner “Tiere” ange­legt und die Bil­der wer­den auto­ma­tisch über Bing gesucht und dort hin­ein geladen.

api_key = ‘[Hier den API Schlüssel eintragen]’
tiere = ['cat','dog','rhino']path = Path('tiere')
if not path.exists():
    path.mkdir()
    for o in tiere:
        dest = (path/o)
        dest.mkdir(exist_ok=True)
        params = {'q':o, 'count':150, 'min_height':128, 'min_width':128}
        headers = {"Ocp-Apim-Subscription-Key":api_key}
        search_url = "https://api.bing.microsoft.com/v7.0/images/search"
        response = requests.get(search_url, headers=headers, params=params)
        response.raise_for_status()
        search_results = response.json()
        results = L(search_results['value'])
        download_images(dest, urls=results.attrgot('contentUrl'))

Nach der Aus­füh­rung die­ses Code Blocks soll­ten zu jedem der Tiere 150 Bil­der her­un­ter­ge­la­den wor­den und in dem Ord­ner “Tiere” abge­legt wor­den sein.

Schritt 2: Daten verifizieren

Im nächs­ten Schritt wol­len wir die Daten, die wir her­un­ter­ge­la­den haben, rudi­men­tär auf ihre Kor­rekt­heit prü­fen. Dies ist vor allem bei dem auto­ma­ti­sier­ten Sam­meln von Daten wich­tig, da es hier­bei schnell zu Feh­lern beim Down­load oder der­glei­chen kom­men kann.

Dafür füh­ren wir fol­gen­den Code aus, wel­cher alle Bil­der in dem Ord­ner “Tiere” und des­sen Unter­ord­ner unter­sucht und über­prüft, ob diese geöff­net wer­den können.

failed_images = verify_images(vision.data.get_image_files(path))

Über den fol­gen­den Befehl kön­nen wir nun die nicht ein­zu­le­sen­den Bil­der ent­fer­nen und damit vom wei­te­ren Trai­ning ausschließen.

failed.map(Path.unlink)
Schritt 3: Daten Vorbearbeiten

Im nächs­ten Schritt müs­sen die Bil­der in Trai­nings und Test Grup­pen ein­ge­teilt wer­den. Dazu wer­den sie auf eine für das Trai­ning opti­male Größe ska­liert.
Dies geschieht mit Hilfe eines Data Loa­ders aus der fast.ai Bibliothek.

tiere = DataBlock(blocks=(ImageBlock, CategoryBlock),
        get_items=get_image_files,
        splitter=RandomSplitter(valid_pct=0.2, seed=159),
        get_y=parent_label,item_tfms=Resize(128))

Mit Hilfe des Data­loa­ders las­sen sich über die Pfad­an­ga­ben einige zufäl­lige Bil­der anzeigen.

dls = tiere.dataloaders(path)dls.valid.show_batch(max_n=4, nrows=1)
fast ai Bild2
Abbil­dung 2 Bei­spiele der gela­de­nen Bilder

Zuletzt wer­den mit­tels “Data Aug­men­ta­tion” einige trans­for­mierte Vari­an­ten der Bil­der erzeugt. Somit gene­rie­ren wir zusätz­li­ches Trai­nings­ma­te­rial für das neu­ro­nale Netz und sor­gen dafür, dass das Netz eine mög­lichst gene­relle Struk­tur erlernt, auch wenn die Ein­gabe nicht dem Ideal entspricht.

Dafür bie­tet die fast.ai Biblio­thek auch sehr ein­fa­che Funk­tio­nen. Wir benut­zen hier die vor­ge­fer­tigte Funk­tion Ran­dom­Re­si­zedCrop. Diese wählt zufäl­lig einen Bild­be­reich aus, der aus­ge­schnit­ten wird und ska­liert die­sen dann auf die ange­ge­bene Größe.

tiere = tiere.new(item_tfms=RandomResizedCrop(224, min_scale=0.6),
                  batch_tfms=aug_transforms())dls = tiere.dataloaders(path)
Schritt 4: Modell Trainieren

Im letz­ten Schritt gilt es das Modell zu trai­nie­ren und anschlie­ßend die Per­for­mance anhand der Test Daten zu verifizieren.

Hier­für wird auch ein fer­ti­ger Ler­ner auf Basis von CNNs (Con­vo­lu­tio­nal Neu­ral Net­works) zur Ver­fü­gung gestellt, wel­cher auch bereits vor­trai­nierte Clas­si­fier Modelle, wie etwa resnet18 als Aus­gangs­ba­sis nut­zen kann. Die­ses Modell wird auch gleich auto­ma­tisch her­un­ter­ge­la­den, wenn es nicht schon gela­den wurde.
Mit fol­gen­den Befeh­len wird das Basis­mo­dell gewählt und die­ses dann in 5 Ite­ra­tio­nen auf unsere Tier­bil­der angepasst.

lerner = cnn_learner(dls, resnet18, metrics=error_rate)lerner.fine_tune(5)

Nach kur­zer Zeit ist das Trai­ning been­det und wir kön­nen uns eine Kon­fu­si­ons­ma­trix mit der Tref­fer­ge­nau­ig­keit des trai­nier­ten Modells anschauen.

interpretation = ClassificationInterpretation.from_learner(lerner)interpretation
                 .plot_confusion_matrix()
fast ai Bild3
Abbil­dung 3 Kon­fu­si­ons­ma­trix zur Tref­fer­si­cher­heit nach dem Trai­ning des Modells

An der Matrix lässt sich erken­nen, dass ledig­lich ein ein­zi­ges Bild nicht kor­rekt klas­si­fi­ziert wor­den ist. Unsere Test­klas­sen sind sicher­lich auch ein­fa­cher als andere aus­ein­an­der zu hal­ten, den­noch lässt sich erken­nen mit wie weni­gen Zei­len Code, sich ein funk­ti­ons­fä­hi­ger und treff­si­che­rer Image Class­fier erstel­len lässt.

Fazit

Zusam­men­fas­send lässt sich sagen, dass die exzel­lent doku­men­tierte fast.ai Biblio­thek sich zum einen her­vor­ra­gend für den Ein­stieg in das Thema Deep Lear­ning eig­net und zum ande­ren auch ver­sierte Deep Lear­ning Spe­zia­lis­ten bei ihrer Arbeit unter­stützt. Sie eig­net sich sehr gut für ein schnel­les Pro­to­ty­p­ing und kann selbst in pro­duk­ti­ven Umge­bun­gen ver­wen­det werden.