Keras handledning
Vad รคr Keras?
Keras รคr ett Open Source Neural Network-bibliotek skrivet i Python som kรถrs ovanpรฅ Theano eller Tensorflow. Den รคr designad fรถr att vara modulรคr, snabb och enkel att anvรคnda. Det utvecklades av Franรงois Chollet, en Google-ingenjรถr. Keras hanterar inte lรฅgnivรฅberรคkningar. Istรคllet anvรคnder den ett annat bibliotek fรถr att gรถra det, kallat "Backend.
Keras รคr hรถgnivรฅ API-omslag fรถr lรฅgnivรฅ-API, som kan kรถras ovanpรฅ TensorFlow, CNTK eller Theano. Keras High-Level API hanterar hur vi gรถr modeller, definierar lager eller stรคller in flera input-output-modeller. Pรฅ denna nivรฅ sammanstรคller Keras รคven vรฅr modell med fรถrlust- och optimeringsfunktioner, trรคningsprocess med passformsfunktion. Keras in Python hanterar inte Low-Level API som att gรถra berรคkningsgrafen, gรถra tensorer eller andra variabler eftersom det har hanterats av "backend"-motorn.
Vad รคr en backend?
Backend รคr en term i Keras som utfรถr all lรฅgnivรฅberรคkning som tensorprodukter, faltningar och mรฅnga andra saker med hjรคlp av andra bibliotek som Tensorflow eller Theano. Sรฅ "backend-motorn" kommer att utfรถra berรคkningen och utvecklingen av modellerna. Tensorflow รคr standard "backend-motor" men vi kan รคndra det i konfigurationen.
Theano, Tensorflow och CNTK Backend
Theano รคr ett รถppen kรคllkodsprojekt som utvecklats av MILA-gruppen vid University of Montreal, Quebec, Kanada. Det var det fรถrsta allmรคnt anvรคnda ramverket. Det รคr en Python bibliotek som hjรคlper till med flerdimensionella arrayer fรถr matematiska operationer med Numpy eller Scipy. Theano kan anvรคnda GPU:er fรถr snabbare berรคkning, den kan ocksรฅ automatiskt bygga symboliska grafer fรถr berรคkningsgradienter. Pรฅ sin hemsida hรคvdar Theano att den kan kรคnna igen numeriskt instabila uttryck och berรคkna dem med mer stabila algoritmer, detta รคr vรคldigt anvรคndbart fรถr vรฅra instabila uttryck.
ร andra sidan รคr Tensorflow den stigande stjรคrnan inom ramverket fรถr djupinlรคrning. Utvecklat av Googles hjรคrnteam รคr det det mest populรคra verktyget fรถr djupinlรคrning. Med mรฅnga funktioner och forskare bidrar till att utveckla detta ramverk fรถr djupt lรคrande.
En annan backend-motor fรถr Keras รคr The Microsoft Cognitive Toolkit eller CNTK. Det รคr ett ramverk fรถr djupinlรคrning med รถppen kรคllkod som utvecklats av Microsoft Team. Den kan kรถras pรฅ flera GPU:er eller flera maskiner fรถr att trรคna djupinlรคrningsmodeller i massiv skala. I vissa fall rapporterades CNTK snabbare รคn andra ramverk som Tensorflow eller Theano. Nรคsta i denna Keras CNN-handledning kommer vi att jรคmfรถra backends av Theano, TensorFlow och CNTK.
Jรคmfรถr backends
Vi mรฅste gรถra ett riktmรคrke fรถr att kunna jรคmfรถra dessa tvรฅ backends. Som du kan se i Jeong-Yoon Lees riktmรคrke, jรคmfรถrs prestandan fรถr 3 olika backends pรฅ olika hรฅrdvara. Och resultatet รคr att Theano รคr lรฅngsammare รคn den andra backend, rapporteras det 50 gรฅnger lรฅngsammare, men noggrannheten ligger nรคra varandra.
Annan benchmark-tester utfรถrs av Jasmeet Bhatia. Han rapporterade att Theano รคr lรฅngsammare รคn Tensorflow fรถr nรฅgot test. Men den รถvergripande noggrannheten รคr nรคstan densamma fรถr alla nรคtverk som testades.
Sรฅ mellan Theano, Tensorflow och CTK รคr det uppenbart att TensorFlow รคr bรคttre รคn Theano. Med TensorFlow รคr berรคkningstiden mycket kortare och CNN รคr bรคttre รคn de andra.
Nรคsta i denna Keras Python tutorial, vi kommer att lรคra oss om skillnaden mellan Keras och TensorFlow (Keras vs Tensorflow).
Keras vs Tensorflow
| Driftparametrar | Keras | Tensorflรถde |
|---|---|---|
| Typ | API-omslag pรฅ hรถg nivรฅ | Lรฅgnivรฅ API |
| Komplexitet | Lรคtt att anvรคnda om du Python sprรฅk | Du mรฅste lรคra dig syntaxen fรถr att anvรคnda nรฅgra av Tensorflow-funktionerna |
| Syfte | Snabb distribution fรถr att gรถra modell med standardlager | Lรฅter dig gรถra en godtycklig berรคkningsgraf eller modelllager |
| verktyg | Anvรคnder andra API-felsรถkningsverktyg som TFDBG | Du kan anvรคnda Tensorboard visualiseringsverktyg |
| Community | Stora aktiva samhรคllen | Stora aktiva samhรคllen och brett delade resurser |
Fรถrdelar med Keras
Snabb implementering och lรคtt att fรถrstรฅ
Keras รคr vรคldigt snabb att gรถra en nรคtverksmodell. Om du vill gรถra en enkel nรคtverksmodell med nรฅgra rader, Python Keras kan hjรคlpa dig med det. Titta pรฅ Keras-exemplet nedan:
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'))
Pรฅ grund av vรคnlig API kan vi enkelt fรถrstรฅ processen. Att skriva koden med en enkel funktion och inget behov av att stรคlla in flera parametrar.
Stort samhรคllsstรถd
Det finns massor av AI-gemenskaper som anvรคnder Keras fรถr sitt ramverk fรถr Deep Learning. Mรฅnga av dem publicerar sina koder samt tutorials fรถr allmรคnheten.
Har flera backends
Du kan vรคlja Tensorflow, CNTK och Theano som din backend med Keras. Du kan vรคlja en annan backend fรถr olika projekt beroende pรฅ dina behov. Varje backend har sin egen unika fรถrdel.
Plattformsรถverskridande och enkel modellinstallation
Med en mรคngd olika enheter och plattformar som stรถds kan du distribuera Keras pรฅ vilken enhet som helst
- iOS med CoreML
- Android med Tensorflow Android,
- Webblรคsare med .js-stรถd
- Molnmotor
- hallon Pi
Stรถd fรถr flera GPU:er
Du kan trรคna Keras pรฅ en enda GPU eller anvรคnda flera GPU:er samtidigt. Eftersom Keras har ett inbyggt stรถd fรถr dataparallellism sรฅ att den kan bearbeta stora datamรคngder och pรฅskynda tiden som behรถvs fรถr att trรคna den.
Nackdelar med Keras
Kan inte hantera API pรฅ lรฅg nivรฅ
Keras hanterar bara API pรฅ hรถg nivรฅ som kรถrs ovanpรฅ andra ramverk eller backend-motorer som Tensorflow, Theano eller CNTK. Sรฅ det รคr inte sรคrskilt anvรคndbart om du vill gรถra ditt eget abstrakta lager fรถr dina forskningsรคndamรฅl eftersom Keras redan har fรถrkonfigurerade lager.
Installerar Keras
I det hรคr avsnittet kommer vi att undersรถka olika metoder som รคr tillgรคngliga fรถr att installera Keras
Direktinstallation eller virtuell miljรถ
Vilken รคr bรคttre? Direktinstallera till nuvarande python eller anvรคnda en virtuell miljรถ? Jag fรถreslรฅr att du anvรคnder en virtuell miljรถ om du har mรฅnga projekt. Vill du veta varfรถr? Detta beror pรฅ att olika projekt kan anvรคnda en annan version av ett keras-bibliotek.
Jag har till exempel ett projekt som behรถver Python 3.5 anvรคnder OpenCV 3.3 med รคldre Keras-Theano backend men i det andra projektet mรฅste jag anvรคnda Keras med den senaste versionen och en Tensorflow som backend med Python 3.6.6-stรถd
Vi vill vรคl inte att Keras-biblioteket ska stรฅ i konflikt med varandra? Sรฅ vi anvรคnder en virtuell miljรถ fรถr att lokalisera projektet med en specifik typ av bibliotek eller sรฅ kan vi anvรคnda en annan plattform som molntjรคnst fรถr att gรถra vรฅr berรคkning รฅt oss som Amazon Webb-service.
Installerar Keras pรฅ Amazon Webbtjรคnst (AWS)
Amazon Web Service รคr en plattform som erbjuder Cloud Computing-tjรคnster och produkter fรถr forskare eller andra รคndamรฅl. AWS hyr ut sin hรฅrdvara, nรคtverk, Databas etc. sรฅ att vi kan anvรคnda det direkt frรฅn internet. En av de populรคra AWS-tjรคnsterna fรถr djupinlรคrning รคr Amazon Machine Image Deep Learning Service eller DL
Fรถr detaljerade instruktioner om hur du anvรคnder AWS, se detta handledning
Anmรคrkning om AMI: Du kommer att ha fรถljande AMI tillgรคnglig
AWS Deep Learning AMI รคr en virtuell miljรถ i AWS EC2 Service som hjรคlper forskare eller praktiker att arbeta med Deep Learning. DLAMI erbjuder frรฅn smรฅ CPU-motorer upp till kraftfulla multi-GPU-motorer med fรถrkonfigurerad CUDA, cuDNN, och kommer med en mรคngd olika ramverk fรถr djupinlรคrning.
Om du vill anvรคnda det direkt bรถr du vรคlja Deep Learning AMI eftersom det kommer fรถrinstallerat med populรคra ramar fรถr djupinlรคrning.
Men om du vill prova ett anpassat ramverk fรถr djupinlรคrning fรถr forskning, bรถr du installera Deep Learning Base AMI eftersom det kommer med grundlรคggande bibliotek som CUDA, cuDNN, GPU-drivrutiner och andra nรถdvรคndiga bibliotek fรถr att kรถra med din djupinlรคrningsmiljรถ.
Hur man installerar Keras pรฅ Amazon SageMaker
Amazon SageMaker รคr en plattform fรถr djupinlรคrning som hjรคlper dig med utbildning och implementering av nรคtverk fรถr djupinlรคrning med den bรคsta algoritmen.
Som nybรถrjare รคr detta den รถverlรคgset enklaste metoden att anvรคnda Keras. Nedan รคr en process om hur man installerar Keras pรฅ Amazon SageMaker:
Steg 1) รppna Amazon SageMaker
I det fรถrsta steget, รppna Amazon Sagemaker konsolen och klicka pรฅ Skapa anteckningsboksinstans.
Steg 2) Ange detaljerna
- Ange ditt anteckningsblocks namn.
- Skapa en IAM-roll. Det kommer att skapa en AMI-roll Amazon IAM roll i formatet AmazonSageMaker-Executionrole-ร ร ร ร MMDD|HHmmSS.
- Slutligen vรคljer du Skapa anteckningsboksinstans. Efter nรฅgra รถgonblick, Amazon Sagemaker lanserar en anteckningsbok-instans.
Anmรคrkningar: Om du vill komma รฅt resurser frรฅn din VPC, stรคll in den direkta internetรฅtkomsten som aktiverad. Annars kommer den hรคr notebook-instansen inte att ha tillgรฅng till internet, sรฅ det รคr omรถjligt att trรคna eller vara vรคrd fรถr modeller
Steg 3) Starta instansen
Klicka pรฅ รppna fรถr att starta instansen
Steg 4) Bรถrja koda
In Jupyter, Klicka pรฅ Ny> conda_tensorflow_p36 och du รคr redo att koda
Installera Keras i Linux
Fรถr att aktivera Keras med Tensorflow som backend-motor mรฅste vi fรถrst installera Tensorflow. Kรถr det hรคr kommandot fรถr att installera tensorflow med CPU (ingen GPU)
pip install --upgrade tensorflow
om du vill aktivera GPU-stรถdet fรถr tensorflow kan du anvรคnda det hรคr kommandot
pip install --upgrade tensorflow-gpu
lรฅt oss checka in Python fรถr att se om vรฅr installation รคr framgรฅngsrik genom att skriva
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 >>>
om det inte finns nรฅgot felmeddelande รคr installationsprocessen framgรฅngsrik
Installera Keras
Nรคr vi har installerat Tensorflow, lรฅt oss bรถrja installera keras. Skriv detta kommando i terminalen
pip install keras
det kommer att bรถrja installera Keras och รคven alla dess beroenden. Du bรถr se nรฅgot i stil med detta:
Nu har vi Keras installerat i vรฅrt system!
verifiera
Innan vi bรถrjar anvรคnda Keras bรถr vi kontrollera om vรฅra Keras anvรคnder Tensorflow som backend genom att รถppna konfigurationsfilen:
gedit ~/.keras/keras.json
du borde se nรฅgot sรฅnt hรคr
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}
som du kan se anvรคnder "backend" tensorflow. Det betyder att keras anvรคnder Tensorflow som backend som vi fรถrvรคntade oss
och kรถr det nu pรฅ terminalen genom att skriva
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. >>>
Hur man installerar Keras pรฅ Windows
Innan vi installerar Tensorflรถde och Keras, vi borde installera Python, pip och virtualenv. Om du redan har installerat dessa bibliotek bรถr du fortsรคtta till nรคsta steg, annars gรถr du sรฅ hรคr:
installera Python 3 genom att ladda ner frรฅn denna lรคnk
Installera pip genom att kรถra detta
Installera virtualenv med detta kommando
pip3 install โU pip virtualenv
installera Microsoft Visuell C++ 2015 omdistribuerbar uppdatering 3
- Gรฅ till nedladdningssidan fรถr Visual Studio https://www.microsoft.com/en-us/download/details.aspx?id=53587
- Vรคlj Redistributables and Build Tools
- Hรคmta och installera Microsoft Visuell C++ 2015 omdistribuerbar uppdatering 3
Kรถr sedan det hรคr skriptet
pip3 install virtualenv
Stรคll in virtuell miljรถ
Detta anvรคnds fรถr att isolera arbetssystemet med huvudsystemet.
virtualenv โ-system-site-packages โp python3 ./venv
Aktivera miljรถn
.\venv\Scripts\activate
Efter att ha fรถrberett miljรถn fรถrblir installationen av Tensorflow och Keras samma som Linux. Nรคsta i den hรคr sjรคlvstudien fรถr djupinlรคrning med Keras kommer vi att lรคra oss om Keras grunder fรถr djupinlรคrning.
Keras Fundamentals for Deep Learning
Huvudstrukturen i Keras รคr modellen som definierar hela grafen fรถr ett nรคtverk. Du kan lรคgga till fler lager i en befintlig modell fรถr att bygga en anpassad modell som du behรถver fรถr ditt projekt.
Sรฅ hรคr gรถr du en sekventiell modell och nรฅgra vanliga lager inom djupinlรคrning
1. Sekventiell modell
from keras.models import Sequential from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout model = Sequential()
2. Konvolutionellt lager
Det hรคr รคr en Keras Python exempel pรฅ faltningslager som ingรฅngslager med ingรฅngsformen 320x320x3, med 48 filter i storleken 3ร3 och anvรคnd ReLU som en aktiveringsfunktion.
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))
en annan typ รคr
model.add(Conv2D(48, (3, 3), activation='relu'))
3.MaxPooling Lager
Fรถr att nedsampla indatarepresentationen, anvรคnd MaxPool2d och ange kรคrnans storlek
model.add(MaxPooling2D(pool_size=(2, 2)))
4. Tรคt lager
lรคgga till ett helt anslutet lager genom att bara ange utdatastorleken
model.add(Dense(256, activation='relu'))
5. Avhoppslager
Lรคgger till dropout-lager med 50 % sannolikhet
model.add(Dropout(0.5))
Sammanstรคlla, trรคna och utvรคrdera
Nรคr vi har definierat vรฅr modell, lรฅt oss bรถrja trรคna dem. Det krรคvs att fรถrst kompilera nรคtverket med fรถrlustfunktionen och optimeringsfunktionen. Detta kommer att tillรฅta nรคtverket att รคndra vikter och minimera fรถrlusten.
model.compile(loss='mean_squared_error', optimizer='adam')
Fรถr att bรถrja trรคna, anvรคnd passform fรถr att mata trรคnings- och valideringsdata till modellen. Detta gรถr att du kan trรคna nรคtverket i omgรฅngar och stรคlla in epoker.
model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))
Vรฅrt sista steg รคr att utvรคrdera modellen med testdata.
score = model.evaluate(x_test, y_test, batch_size=32)
Lรฅt oss fรถrsรถka anvรคnda enkel linjรคr regression
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()
Efter att ha trรคnat data ska utdata se ut sรฅ hรคr
med den ursprungliga vikten
Linear regression model is initialized with weights w: 0.37, b: 0.00
och slutvikt
Linear regression model is trained to have weight w: 3.70, b: 0.61
Finjustera fรถrtrรคnade modeller i Keras och hur man anvรคnder dem
Varfรถr vi anvรคnder Fine Tune Models och nรคr vi anvรคnder det
Finjustering รคr en uppgift att justera en fรถrtrรคnad modell sรฅ att parametrarna skulle anpassa sig till den nya modellen. Nรคr vi vill trรคna frรฅn grunden pรฅ en ny modell behรถver vi en stor mรคngd data, sรฅ att nรคtverket kan hitta alla parametrar. Men i det hรคr fallet kommer vi att anvรคnda en fรถrtrรคnad modell sรฅ att parametrarna redan รคr inlรคrda och har en vikt.
Om vi โโtill exempel vill trรคna vรฅr egen Keras-modell fรถr att lรถsa ett klassificeringsproblem men vi bara har en liten mรคngd data, kan vi lรถsa detta genom att anvรคnda en รverfรถr lรคrande + Finjusteringsmetod.
Med hjรคlp av ett fรถrtrรคnat nรคtverk och vikter behรถver vi inte trรคna hela nรคtverket. Vi behรถver bara trรคna det sista lagret som anvรคnds fรถr att lรถsa vรฅr uppgift som vi kallar det Fine-Tuning-metoden.
Fรถrberedelse av nรคtverksmodeller
Fรถr den fรถrtrรคnade modellen kan vi ladda en mรคngd olika modeller som Keras redan har i sitt bibliotek som:
- VGG16
- Start V3
- ResNet
- MobileNet
- Xception
- InceptionResNetV2
Men i denna process kommer vi att anvรคnda VGG16 nรคtverksmodell och imageNet som vรฅr vikt fรถr modellen. Vi kommer att finjustera ett nรคtverk fรถr att klassificera 8 olika typer av klasser med hjรคlp av bilder frรฅn Kaggle Natural Images Dataset
VGG16 modellarkitektur
Ladda upp vรฅr data till AWS S3 Bucket
Fรถr vรฅr trรคningsprocess kommer vi att anvรคnda en bild av naturliga bilder frรฅn 8 olika klasser som flygplan, bil, katt, hund, blomma, frukt, motorcykel och person. Fรถrst mรฅste vi ladda upp vรฅr data till Amazon S3 hink.
Amazon S3 hink
Steg 1) Efter att ha loggat in pรฅ ditt S3-konto, lรฅt oss skapa en hink genom att klocka Skapa hink
Steg 2) Vรคlj nu ett Bucket Name och din region enligt ditt konto. Se till att hinkens namn รคr tillgรคngligt. Efter det klicka Skapa.
Steg 3) Som du kan se รคr din hink redo att anvรคndas. Men som du kan se รคr Access inte offentlig, det รคr bra fรถr dig om du vill hรฅlla det privat fรถr dig sjรคlv. Du kan รคndra den hรคr hinken fรถr allmรคn รฅtkomst i Bucket Properties
Steg 4) Nu bรถrjar du ladda upp din trรคningsdata till din Bucket. Hรคr kommer jag att ladda upp filen tar.gz som bestรฅr av bilder fรถr trรคning och testprocess.
Steg 5) Klicka nu pรฅ din fil och kopiera Lรคnk sรฅ att vi kan ladda ner den.
Fรถrberedelse av data
Vi mรฅste generera vรฅra trรคningsdata med hjรคlp av Keras ImageDataGenerator.
Fรถrst mรฅste du ladda ner med wget med lรคnken till din fil frรฅn S3 Bucket.
!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz !tar -xzf images.tar.gz
Nรคr du har laddat ner data, lรฅt oss bรถrja utbildningsprocessen.
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)
BilddataGenerator kommer att gรถra en X_training data frรฅn en katalog. Underkatalogen i den katalogen kommer att anvรคndas som en klass fรถr varje objekt. Bilden kommer att laddas med RGB-fรคrglรคget, med det kategoriska klasslรคget fรถr Y_training-data, med en batchstorlek pรฅ 16. Blanda slutligen data.
Lรฅt oss se vรฅra bilder slumpmรคssigt genom att plotta dem med 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()
Lรฅt oss sedan skapa vรฅr nรคtverksmodell frรฅn VGG16 med imageNet fรถrtrรคnad vikt. Vi kommer att frysa dessa lager sรฅ att lagren inte gรฅr att trรคna fรถr att hjรคlpa oss att minska berรคkningstiden.
Skapar vรฅr modell frรฅn 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())
Som du kan se nedan, sammanfattningen av vรฅr nรคtverksmodell. Frรฅn en ingรฅng frรฅn VGG16 Layers lรคgger vi till 2 Fully Connected Layer som extraherar 1024 funktioner och ett utdatalager som kommer att berรคkna de 8 klasserna med softmax-aktiveringen.
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
Utbildning
# # 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()
Resultat
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
Som du kan se minskar vรฅra fรถrluster avsevรคrt och noggrannheten รคr nรคstan 100%. Fรถr att testa vรฅr modell valde vi slumpmรคssigt bilder รถver internet och la dem i testmappen med en annan klass att testa
Testar vรฅr modell
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()
Och vรฅrt test รคr enligt nedan! Endast 1 bild fรถrutspรฅs fel frรฅn ett test av 14 bilder!
Neuralt nรคtverk fรถr ansiktsigenkรคnning med Keras
Varfรถr vi behรถver erkรคnnande
Vi behรถver igenkรคnning fรถr att gรถra det lรคttare fรถr oss att kรคnna igen eller identifiera en persons ansikte, fรถremรฅlstyp, berรคknade รฅlder pรฅ en person utifrรฅn hans ansikte, eller till och med kรคnna till den personens ansiktsuttryck.
Kanske inser du att varje gรฅng du fรถrsรถker markera din vรคns ansikte i ett foto, har funktionen i Facebook gjort det รฅt dig, det vill sรคga att markera din vรคns ansikte utan att du behรถver markera det fรถrst. Detta รคr ansiktsigenkรคnning som tillรคmpas av Facebook fรถr att gรถra det enklare fรถr oss att tagga vรคnner.
Sรฅ hur fungerar det? Varje gรฅng vi markerar vรฅr vรคns ansikte kommer Facebooks AI att lรคra sig det och fรถrsรถka fรถrutsรคga det tills det fรฅr rรคtt resultat. Samma system kommer vi att anvรคnda fรถr att gรถra vรฅr egen ansiktsigenkรคnning. Lรฅt oss bรถrja gรถra vรฅr egen ansiktsigenkรคnning med hjรคlp av Deep Learning
Nรคtverksmodell
Vi kommer att anvรคnda en VGG16 Network Model men med VGGFace-vikt.
VGG16 modellarkitektur
Vad รคr VGGFace? det รคr Keras implementering av Deep Face Recognition introducerad av Parkhi, Omkar M. et al. "Djup ansiktsigenkรคnning." BMVC (2015). Ramverket anvรคnder VGG16 som nรคtverksarkitektur.
Du kan ladda ner VGGFace frรฅn 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()
Som du kan se nรคtverkssammanfattningen
_________________________________________________________________ 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):
vi kommer att gรถra en รverfรถr lรคrande + Finjustering fรถr att gรถra trรคningen snabbare med smรฅ datamรคngder. Fรถrst ska vi frysa baslagren sรฅ att lagren inte gรฅr att trรคna.
for layer in face_model.layers:
layer.trainable = False
sedan lรคgger vi till vรฅrt eget lager fรถr att kรคnna igen vรฅra testansikten. Vi kommer att lรคgga till 2 helt anslutna lager och ett utdatalager med 5 personer att upptรคcka.
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)
Lรฅt oss se vรฅr nรคtverkssammanfattning
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
Som du kan se ovan, efter pool5-lagret, kommer det att tillplattas till en enda funktionsvektor som kommer att anvรคndas av det tรคta lagret fรถr den slutliga igenkรคnningen.
Fรถrbereder vรฅra ansikten
Lรฅt oss nu fรถrbereda vรฅra ansikten. Jag gjorde en katalog bestรฅende av 5 kรคnda personer
- Jack Ma
- Jason Statham
- Johnny Depp
- Robert Downey Jr
- Rowan Atkinson
Varje mapp innehรฅller 10 bilder, fรถr varje utbildnings- och utvรคrderingsprocess. Det รคr en mycket liten mรคngd data men det รคr utmaningen, eller hur?
Vi kommer att anvรคnda hjรคlpen av Keras verktyg fรถr att hjรคlpa oss att fรถrbereda data. Denna funktion kommer att iterera i datamappen och sedan fรถrbereda den sรฅ att den kan anvรคndas i utbildningen.
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,
)
Utbilda vรฅr modell
Lรฅt oss bรถrja vรฅr trรคningsprocess genom att sammanstรคlla vรฅrt nรคtverk med fรถrlustfunktion och optimerare. Hรคr anvรคnder vi sparse_categorical_crossentropy som vรฅr fรถrlustfunktion, med hjรคlp av SGD som vรฅr inlรคrningsoptimerare.
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
Som du kan se รคr vรฅr valideringsnoggrannhet upp till 64%, detta รคr ett bra resultat fรถr en liten mรคngd trรคningsdata. Vi kan fรถrbรคttra detta genom att lรคgga till fler lager eller lรคgga till fler trรคningsbilder sรฅ att vรฅr modell kan lรคra sig mer om ansiktena och uppnรฅ stรถrre noggrannhet.
Lรฅt oss testa vรฅr modell med en testbild
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']
med Robert Downey Jr.-bild som vรฅr testbild visar det att det fรถrutspรฅdda ansiktet รคr sant!
Fรถrutsรคgelse med Live Cam!
Vad sรคgs om om vi testar vรฅr skicklighet med att implementera det med indata frรฅn en webbkamera? Genom att anvรคnda OpenCV med Haar Face cascade fรถr att hitta vรฅrt ansikte och med hjรคlp av vรฅr nรคtverksmodell kan vi kรคnna igen personen.
Det fรถrsta steget รคr att fรถrbereda dig och din vรคns ansikten. Ju mer data vi har dรฅ desto bรคttre blir resultatet!
Fรถrbered och trรคna ditt nรคtverk som fรถregรฅende steg, efter att trรคningen รคr klar, lรคgg till den hรคr raden fรถr att fรฅ ingรฅngsbilden frรฅn cam
#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()
Vilken รคr bรคttre? Keras eller Tensorflow
Keras erbjuder enkelhet nรคr du skriver manuset. Vi kan bรถrja skriva och fรถrstรฅ direkt med Keras eftersom det inte รคr sรฅ svรฅrt att fรถrstรฅ. Det รคr mer anvรคndarvรคnligt och enkelt att implementera, du behรถver inte gรถra mรฅnga variabler fรถr att kรถra modellen. Sรฅ vi behรถver inte fรถrstรฅ varje detalj i backend-processen.
ร andra sidan รคr Tensorflow operationerna pรฅ lรฅg nivรฅ som erbjuder flexibilitet och avancerade operationer om du vill gรถra en godtycklig berรคkningsgraf eller modell. Tensorflow kan ocksรฅ visualisera processen med hjรคlp av TensorBoard och ett specialiserat felsรถkningsverktyg.
Sรฅ om du vill bรถrja arbeta med djupinlรคrning med inte sรฅ mycket komplexitet, anvรคnd Keras. Eftersom Keras erbjuder enkelhet och anvรคndarvรคnlig att anvรคnda och lรคtt att implementera รคn Tensorflow. Men om du vill skriva din egen algoritm i djupinlรคrningsprojekt eller forskning bรถr du istรคllet anvรคnda Tensorflow.
Sammanfattning
Sรฅ lรฅt oss sammanfatta allt vi har diskuterat och gjort i denna handledning.
- Keras i ett hรถgnivรฅ-API som anvรคnds fรถr att gรถra djupinlรคrningsnรคtverk enklare med hjรคlp av backend-motorn.
- Keras รคr lรคtt att anvรคnda och fรถrstรฅ med python-stรถd sรฅ det kรคnns mer naturligt รคn nรฅgonsin. Det รคr bra fรถr nybรถrjare som vill lรคra sig om djupinlรคrning och fรถr forskare som vill ha lรคttanvรคnd API.
- Installationsprocessen รคr enkel och du kan anvรคnda en virtuell miljรถ eller anvรคnda en extern plattform som t.ex AWS.
- Keras kommer ocksรฅ med olika typer av nรคtverksmodeller sรฅ det gรถr oss lรคttare att anvรคnda den tillgรคngliga modellen fรถr att fรถrtrรคna och finjustera vรฅr egen nรคtverksmodell.
- Det finns ocksรฅ mรฅnga handledningar och artiklar om hur man anvรคnder Keras frรฅn gemenskaper รถver hela vรคrlden fรถr djupinlรคrningsรคndamรฅl.























