Zephyrnet-logo

Leren overdragen voor beeldherkenning en natuurlijke taalverwerking

Datum:

Als je de kans hebt gehad om deel 1 van dit artikel te lezen, zul je je herinneren dat Transfer Learning een machinale leermethode is waarbij de toepassing van kennis die is verkregen uit een model dat in de ene taak wordt gebruikt, kan worden hergebruikt als basis voor een andere taak.

Als je de kans niet hebt gekregen en geen goed begrip hebt van Transfer Learning, lees het dan eens, het zal je helpen dit artikel veel beter te begrijpen. 

Beeldherkenning

 
Laten we dus eerst doornemen wat beeldherkenning is. Beeldherkenning is de taak die aan computertechnologie is toegewezen om een ​​object of een kenmerk in een afbeelding of video te kunnen detecteren en analyseren. Het is het belangrijkste gebied waar diepe neurale netwerken hun magie uitoefenen, omdat ze zijn ontworpen om patronen te herkennen. 

Als je wilt zien hoe neurale netwerken hun begrip van afbeeldingen analyseren en begrijpen, kijk dan eens hier.. Dit laat zien hoe lagen op een lager niveau zich concentreren op het leren van functies op een laag niveau en hoe de lagen op een hoger niveau zich aanpassen om functies op een hoger niveau te leren.

We spraken vaag over het trainen van het netwerk op katten en honden in deel 1 van dit artikel, laten we daar meer over hebben. Het menselijk brein kan het verschil tussen objecten herkennen en onderscheiden. Beeldherkenning heeft tot doel ook een vergelijkbaar vermogen te hebben als het menselijk brein, ook in staat om het verschil tussen objecten in een afbeelding te identificeren en te detecteren. 

Het algoritme dat door beeldherkenning wordt gebruikt, is een beeldclassificatie die een invoerafbeelding ontvangt en uitvoert wat de afbeelding bevat. Dit algoritme moet worden getraind om de verschillen tussen de gedetecteerde objecten te leren. Om ervoor te zorgen dat de afbeeldingsclassificator katten en honden kan identificeren, moet de afbeeldingsclassificator worden getraind met duizenden afbeeldingen van katten en honden, samen met afbeeldingen die ook geen katten en honden bevatten. Daarom kunnen de gegevens die uit deze beeldclassificator worden verkregen, vervolgens worden geïmplementeerd en gebruikt bij de detectie van katten en honden bij andere taken. 

Dus waar vind je vooraf getrainde beeldmodellen?

 
Er zijn veel vooraf getrainde modellen, dus het vinden van de juiste om uw probleem op te lossen, vereist een beetje onderzoek. Ik ga een beetje van het onderzoek voor je doen. Ik zal beginnen met te praten over Keras. Keras biedt een breed scala aan vooraf getrainde modellen die kunnen worden gebruikt voor transfer learning, feature-extractie, fine-tuning en voorspelling. Je kunt er een lijst van vinden hier..

Een voorbeeld van een Keras-applicatie is de Xception-architectuur, waarover ik verderop kort heb gesproken. Zo kunt u Xception initialiseren op ImageNet.

tf.keras.applications.Xception( include_top=True, weights="imagenet", input_tensor=Geen, input_shape=Geen, pooling=Geen, klassen=1000, classifier_activation="softmax", )

Als we het over Keras hebben, laten we TensorFlow Hub niet vergeten. TensorFlow is een open-source bibliotheek ontwikkeld door Google, die machine learning en deep learning ondersteunt. TensorFlow Hub heeft een verscheidenheid aan vooraf getrainde, kant-en-klare modellen, zoals beeld-, tekst-, video- en audioclassificatie. 

Een sequentieel model is goed te gebruiken voor een eenvoudige stapel lagen, dit houdt in dat elke laag één invoer- en één uitvoertensor heeft. 

Voorbeeld 1:

model = tf.keras.Sequential([ embed, tf.keras.layers.Dense(16, activation="relu"), tf.keras.layers.Dense(1, activation="sigmoid"), ])

Voorbeeld 2:

m = tf.keras.Sequential([ hub.KerasLayer("https://tfhub.dev/google/imagenet/inception_v1/classification/5") ]) m.build([None, 224, 224, 3]) # Batch invoer vorm.

Binnen deep learning kunnen sommige strategieën het mogelijk maken om maximaal te profiteren van vooraf getrainde modellen. 
 
 

Functie extractie

 
De eerste strategie waarover ik zal spreken, is Feature Extraction. U voert het vooraf getrainde model in wezen uit als een extractor met vaste functies, waarbij u de gewenste functies gebruikt om een ​​nieuwe classifier te trainen. Convolutionele lagen die zich dichter bij de invoerlaag van het model bevinden, leren functies op laag niveau, zoals randen en lijnen, in beeldherkenning. Naarmate de lagen verder gaan, beginnen ze complexere kenmerken te leren om vervolgens in staat te zijn om specifieke kenmerken dichter bij de uitvoer te interpreteren, wat de classificatietaak is die voorhanden is. We kunnen de verschillende laagniveaus gebruiken als een afzonderlijke integratie van feature-extractie door delen van het model te gebruiken om onze taak te classificeren. 

Als de taak bijvoorbeeld verschilt van het classificeren van objecten in een afbeelding die het vooraf getrainde model doet, zou het geschikter zijn om de uitvoer te gebruiken nadat het vooraf getrainde model een paar lagen heeft doorlopen. Daarom wordt de nieuwe uitvoer van de gewenste laag ingevoerd omdat de invoer voor een nieuw model essentiële functies heeft gekregen om door te gaan naar de nieuwe classificatie en om de taak te kunnen oplossen. 

Over het algemeen is het idee om het vooraf getrainde model te gebruiken met behulp van functie-extractie om te bepalen welke functies nuttig zijn om uw taak op te lossen, maar u zult de uitvoer van het netwerk niet gebruiken omdat het te taakspecifiek is. U zult dan het laatste deel van het model moeten bouwen om specifiek voor uw taak te zijn. 

Scherpstellen

 
De tweede strategie is Fine-tuning, of wat ik graag netwerkchirurgie noem. We spraken hierboven over Fine-tuning, waar het is gebaseerd op het maken van "fijne" aanpassingen aan een proces om de gewenste output te verkrijgen om de prestaties verder te verbeteren. Fine-tuning wordt ook gezien als een volgende stap naar Feature Extraction. Bij fijnafstemming bevriezen we bepaalde lagen en trainen sommige selectief opnieuw om de nauwkeurigheid te verbeteren, betere prestaties te behalen met een lagere leersnelheid en minder trainingstijd. 

Verfijning is van vitaal belang als u een efficiënte weergave van kenmerken van het basismodel wilt verkrijgen, zodat u beter kunt worden afgestemd op uw taak. 

Voorbeeld: Een vooraf getraind afbeeldingsmodel gebruiken in Keras

 
Dus laten we nu naar een voorbeeld kijken. Omdat we zoveel over katten en honden hebben gesproken, laten we een voorbeeld van beeldherkenning op hen doen. 

Laad de gegevens

 
Laten we er dus eerst voor zorgen dat we de bibliotheken importeren die we nodig hebben en de gegevens laden.

importeer numpy als np importeer tensorflow als tf van tensorflow importeer keras importeer tensorflow_datasets als tfds

Het is altijd goed om uw steekproefomvang voor uw training af te drukken en te testen om te begrijpen met hoeveel gegevens u werkt en een kijkje te nemen met de afbeeldingen, zodat u kunt zien met welke gegevens u werkt. 

Leren overdragen voor beeldherkenning en natuurlijke taalverwerking


 

Omdat afbeeldingen in grootte variëren, is het een goede benadering om te standaardiseren naar een vaste afbeeldingsgrootte, omdat het een goede consistente invoer is voor het neurale netwerk. 

Voorbewerking van gegevens

 
Laten we nu naar Data Augmentation gaan. Wanneer u met een kleinere dataset werkt, is het een goede gewoonte om willekeurige transformatie toe te passen op de trainingsafbeeldingen, zoals horizontaal spiegelen. Flippen betekent het roteren van een afbeelding op een verticale of horizontale as. Dit zal helpen het model bloot te stellen aan verschillende hoeken en aspecten van de trainingsgegevens, waardoor overfitting wordt verminderd. 

van tensorflow importeer keras van tensorflow.keras importeer lagen data_augmentation = keras.Sequential( [layers.RandomFlip("horizontal"), layers.RandomRotation(0.1),] )

Een basismodel maken op basis van gekozen architectuur (Xception)

 
De volgende stap is het maken van het model. We gaan eerst beginnen met het instantiëren van een basismodel, Xceptieen het laden van vooraf getrainde gewichten. In dit voorbeeld gebruiken we ImageNet. Vervolgens gaan we verder met het bevriezen van alle lagen in het basismodel. Bevriezen helpt voorkomen dat de gewichten tijdens de training worden bijgewerkt.

base_model = keras.applications.Xception( weights="imagenet", # Gewichten vooraf getraind op ImageNet. input_shape=(150, 150, 3), include_top=False, ) base_model.trainable = False

Train de bovenste laag

 
De volgende stap is het creëren van een nieuwe laag bovenop de bevroren lagen, die zijn kennis van de oude functies leert en die gebruikt om voorspellingen op de nieuwe dataset te bepalen. Dit is gunstig, zoals verderop in de stappen van transfer learning wordt uitgelegd. De kans dat de huidige output van het vooraf getrainde model en de output die u van uw model wilt, verschillend is, is groot, daarom zal het toevoegen van nieuwe lagen het model in het algemeen verbeteren. 

# Maak een nieuw model op de bovenste invoer = keras.Input(shape=(150, 150, 3)) x = data_augmentation(inputs) # Pas willekeurige gegevensvergroting toe


 

Leren overdragen voor beeldherkenning en natuurlijke taalverwerking


 

Scherpstellen

 
Dus nadat we het model met bevroren lagen hebben uitgevoerd, moeten we het model uitvoeren met de basismodellen niet-bevroren, wat het model in wezen verbetert, met een lagere leersnelheid. U wilt de hoeveelheid overfitting verminderen, dus laten we deze stap langzaam nemen en het basismodel ontdooien.

base_model.trainable = Waar

Nu is het tijd om het model opnieuw te compileren.

model.compile( optimizer=keras.optimizers.Adam(1e-5), # Low learning rate loss=keras.losses.BinaryCrossentropy(from_logits=True), metrics=[keras.metrics.BinaryAccuracy()], ) epochs = 10 model.fit(train_ds, epochs=epochs, validation_data=validation_ds)

Leren overdragen voor beeldherkenning en natuurlijke taalverwerking


 

Als u nog een kijkje wilt nemen, kunt u dit doen door op te klikken hier. om het Colab-notebook te bekijken. 
 
 

Natural Language Processing

 
We hebben al veel gesproken over beeldclassificatie, laten we nu eens kijken naar Natural Language Processing (NLP). Dus wat is NLP? NLP is het vermogen van een computer om menselijke taal te detecteren en te begrijpen, door middel van spraak en tekst, net zoals wij mensen dat kunnen. 

De menselijke taal bevat veel dubbelzinnigheden die het moeilijk maken om software te maken die spraak en tekst nauwkeurig kan detecteren. Bijvoorbeeld, sarcasme, grammatica en homofonen, dit zijn slechts enkele hobbels bij het leren van de menselijke taal. 

Voorbeelden van NLP zijn spraakherkenning en sentimentanalyse. Use cases van NLP zijn zaken als spamdetectie. Ik weet het, je hebt er misschien nooit aan gedacht dat NLP zou worden geïmplementeerd in spamdetectie, maar dat is het wel. De tekstclassificatie van NLP heeft de mogelijkheid om e-mails te scannen en taal te detecteren die aangeeft dat het spam of phishing kan zijn. Het doet dit door het overmatig gebruik van slechte grammatica, bedreigingen, overmatig gebruik van financiële terminologie en meer te analyseren. 

Dus hoe werkt Transfer Learning in NLP? Nou, het werkt in principe hetzelfde met beeldherkenning. Het trainen van een natuurlijk taalmodel kan behoorlijk fors zijn in prijs, het vereist veel data en kost veel trainingstijd op mooie hardware. Maar het goede nieuws is dat u, net als beeldherkenning, deze vooraf getrainde modellen gratis kunt downloaden en ze kunt verfijnen om aan uw specifieke dataset te werken.

Waar kun je deze voorgetrainde modellen vinden, vraag je? 

 
Keras biedt niet alleen voorgetrainde modellen voor beeldherkenning, maar levert ook architecturen voor NLP. Je kunt een kijkje nemen hier.

KnuffelenGezicht

 
Laten we eens kijken naar KnuffelenGezicht. HuggingFace is een open-source provider van natuurlijke taalverwerking (NLP) die geweldig werk heeft verricht om het gebruiksvriendelijk te maken. 

Hun Transformers-bibliotheek is een op Python gebaseerde bibliotheek die architecturen zoals BERT biedt, die NLP-taken uitvoeren, zoals tekstclassificatie en het beantwoorden van vragen. Het enige dat u hoeft te doen, is hun vooraf getrainde modellen laden met slechts een paar regels code en u bent klaar om te beginnen met experimenteren. Om met Transformers aan de slag te gaan, moet u het installeren.

Hieronder ziet u een voorbeeld van het gebruik van sentimentanalyse, de mogelijkheid om een ​​mening in een stuk tekst te herkennen.

! pip install transformers from transformers import pipeline classifier = pipeline('sentiment-analyse') classifier('Ik vind het artikel over Transfer learning erg handig.')

Output:

[{'label': 'POSITIVE', 'score': 0.9968850016593933}]

Je voorgetrainde model verbeteren met fine-tuning is een optie met HuggingFace, met behulp van de Trainer API. Transformers hebben een Trainer-klasse gegeven die helpt bij het verfijnen van je vooraf getrainde model. Deze stap komt na het verwerken van uw gegevens en vereist dat u TrainingArguments importeert

van transformers import TrainingArgumenten

Om meer te weten te komen over HuggingFace, kun je dit volgen link

Woord insluiten

 
Hoe zit het met Word Embedding? Wat is dat? Woordinbedding is een weergave waarin vergelijkbare woorden een vergelijkbare codering hebben. Het kan een woord in een document detecteren en de relatie met andere woorden koppelen. 

Een voorbeeld hiervan is Word2Vec, een tweelaags neuraal netwerk dat teksten verwerkt door vectorcodering. 

Word2Vec gebruikte twee methoden om woordrepresentatie te leren:

  1. Doorlopende woordenlijst – is een modelarchitectuur die het doelwoord (middelste woord) probeert te voorspellen op basis van de bronwoorden (naburige woorden). De volgorde van de woorden in de context is niet per se belangrijk, de reden waarom de architectuur 'bag-of-words' wordt genoemd
  2. Continu Skip-gram – is een modelarchitectuur die in wezen het tegenovergestelde is van Bag-of-Words. Het probeert de bronwoorden (naburige woorden) te voorspellen met een doelwoord (middelste woord)

Functie-extractie is een strategie die wordt gebruikt in Word Embedding, waar het functierepresentaties detecteert en produceert die nuttig zijn voor het type NLP-taak waaraan u probeert te werken. Bij feature-extractie worden delen (zinnen of woorden) geëxtraheerd naar een matrix die een weergave heeft van elk woord dat van elk woord wordt gegeven. De gewichten veranderen niet en alleen de toplaag van het model wordt gebruikt. 

Bij fijnafstemming worden echter de gewichten van het vooraf getrainde model aangepast, wat nadelig kan zijn omdat de methode in de aanpassingsfase woordenverlies kan veroorzaken, omdat de gewichten worden gewijzigd en wat ooit is geleerd, niet meer in het geheugen staat . Dit staat bekend als 'catastrofale interferentie'. 

Voorbeeld: Een vooraf getraind NLP-model gebruiken in Keras

 
We hadden het net over Word Embedding, dus laten we naar een voorbeeld kijken. Om snel samen te vatten wat Word Embedding is: het is een weergave waarin vergelijkbare woorden een vergelijkbare codering hebben. Het kan een woord in een document detecteren en de relatie met andere woorden koppelen. Dus laten we eens kijken hoe dit dan werkt.

Laad de gegevens

 
In dit voorbeeld gaan we kijken naar filmrecensies. Als u zich het voorbeeld herinnert dat we hierboven hebben gemaakt, met behulp van sentimentanalyse, heeft dit ons een output opgeleverd die bepaalt hoe positief het was. Bij deze filmrecensies hebben we positieve en negatieve, daarom is dit binaire classificatie. 

url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz" dataset = tf.keras.utils.get_file("aclImdb_v1.tar.gz", url, untar=True, cache_dir='.', cache_subdir='') dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb') os.listdir(dataset_dir)

U kunt het onderscheid zien in de onderstaande afbeelding, waarbij 0 negatief is en 1 positief.

Leren overdragen voor beeldherkenning en natuurlijke taalverwerking


 

Ik ging toen verder met het gebruik van Embedding Layer van Keras, om positieve gehele getallen om te zetten in dichte vectoren met vaste afmetingen. De gewichten voor de inbedding worden willekeurig geïnitialiseerd en aangepast tijdens de backpropagation. Als de kennis eenmaal is geleerd, coderen de woordinbeddingen overeenkomsten tussen woorden die ze hebben geleerd en woorden die ze eerder hadden geleerd.

# Sluit een woordenschat van 1,000 woorden in 5 dimensies in. embedding_layer = tf.keras.layers.Embedding(1000, 5)

Tekst voorverwerking

 
Tijdens de tekstvoorbewerkingsfase gaan we een TextVectorization-laag initialiseren met de gewenste parameters om filmrecensies te vectoriseren. De tekstvectorisatielaag helpt bij het splitsen en in kaart brengen van tekenreeksen uit de filmrecensies in gehele getallen. 

# tekstvectorisatielaag om te splitsen en tekenreeksen toe te wijzen aan gehele getallen. vectorize_layer = TextVectorization( standardize=custom_standardization, max_tokens=vocab_size, output_mode='int', output_sequence_length=sequence_length)

Maak een model

 
De vectorize_layer van de bovenstaande pre-processing zal worden geïmplementeerd als de eerste laag in het model, omdat het de strings heeft omgezet in vocabulaire-indices. Het zal de getransformeerde strings invoeren in de Embedding-laag. 

De inbeddingslaag neemt vervolgens deze woordenschatindices en scant door de vector voor elke woordindex, waar ze leren terwijl het model traint. 

model = Sequential([ vectorize_layer, Embedding(vocab_size, embedding_dim, name="embedding"), GlobalAveragePooling1D(), Dense (16, activatie='relu'), Dense(1) ])

In dit voorbeeld gaan we gebruiken TensorBoard, een hulpmiddel voor het leveren van visualisaties die de workflow van machine learning laten zien, bijvoorbeeld verlies en nauwkeurigheid. 

Stel het model samen

 
We gaan het model compileren met behulp van de Adam-optimizer en BinaryCrossentropy loss.

model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['nauwkeurigheid'])

Leren overdragen voor beeldherkenning en natuurlijke taalverwerking


 

Ik noemde het TensorBoard, dat de modelstatistieken visualiseert en je kunt dit hieronder zien.

Leren overdragen voor beeldherkenning en natuurlijke taalverwerking


 

Je hebt gezien hoe je een NLP-model kunt trainen en testen met behulp van een vooraf getraind woordinbeddingsmodel. Mocht je het Colab notitieboek nog eens willen bekijken, dan kan dat hier. 
 
 

Wat zijn de best practices met transfer learning?

  1. Voorgetrainde modellen – Profiteer van deze vooraf getrainde open-sourcemodellen die u kunnen helpen bij het oplossen van uw doeltaak, aangezien ze verschillende gebieden bestrijken. Het kan u veel tijd besparen door vanaf het begin een model te bouwen.
  2. Bronmodel – het vinden van een model dat compatibel is met zowel uw brontaak als uw doeltaak is belangrijk. Als uw bronmodel te ver verwijderd is van uw doel en er weinig kennis kan worden overgedragen, kost het meer tijd omdat het doelmodel meer tijd nodig heeft om te bereiken. 
  3. overfitting – Doeltaken met een kleine gegevenssteekproef, waarbij de brontaak en de doeltaak te veel op elkaar lijken, kan leiden tot overfitting. Door lagen te bevriezen en de leersnelheid in het cursusmodel af te stemmen, kunt u overfitting in uw model verminderen. 

Ik hoop dat dit artikel je een beter begrip heeft gegeven van hoe je transfer learning kunt implementeren door middel van soorten machine learning. Probeer het zelf uit!

 
 
Nisha Arja is een datawetenschapper en freelance technisch schrijver. Ze is vooral geïnteresseerd in het geven van loopbaanadvies op het gebied van Data Science of tutorials en op theorie gebaseerde kennis rond Data Science. Ze wil ook de verschillende manieren onderzoeken waarop kunstmatige intelligentie de levensduur van de mens ten goede komt. Een scherpe leerling, die haar technische kennis en schrijfvaardigheid wil verbreden, terwijl ze anderen helpt te begeleiden.

Bron: https://www.kdnuggets.com/2022/01/transfer-learning-image-recognition-natural-language-processing.html

spot_img

Laatste intelligentie

spot_img