WMR 25 - Lab IV


1 Keras

Keras offre delle high-level API che utilizzano a loro volta la libreria TensorFlow per la costruzione di reti neurali.

Per definire una rete neurale queste librerie chiedono di definire le seguenti cose:

  • La funzione che trasforma l'input in vettori utili per la rete.

  • La funzione che dato l'output della rete calcola la loss del modello.

  • Il grafo di flusso del modello, ovvero il grafo che che specifica la struttura interna della rete e che permette di definire come l'output è calcolato a partire dell'input.


1.1 Batch, Steps and Epochs

Durante il processo di training, al posto di calcolare la loss su un elemento alla volta, che potrebbe portare a situazioni di overfitting, si è subito preferito calcolare la loss su un batch di elementi alla volta.

L'idea è quindi quella di prendere un tot. di elementi (chiamato batch), e di utilizza la rete neurale su questi elementi per ottenere un risultato. Durante questo calcolo i pesi della rete sono tutti fissati (singolo step), e alla fine si calcola la loss su tutti gli elementi calcolati.

Per rendere più efficiente il calcolo della rete su un determinato batch al posto di considerare i singoli input come singoli vettori, si raggruppano questi vettori in matrici \(n \times b\), dove \(b\) è l'iperparametro che specifica il batch utilizzzato. Così facendo l'input (e anche l'output) diventa una matrice, che contiene tutti i "vettori" di input.

Il numero di epoche (epochs) invece specifica quante volte la rete andrà a vedere i vari esempi del training set set.

L'idea è quindi quella di prendere il dataset di training, dividerlo in batch di \(b\) elementi, dove tendenzialmente \(b \approx 50\), e ripetere questo procedimento un numero \(e\) di volte.


1.2 API Examples


1.2.1 The Sequential API

import keras
from keras import layers

model = keras.Sequential()
model.add(layers.Dense(20, activation='relu', input_shape=(10,)))
model.add(layers.Dense(20, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

model.fit(x, y, epochs=10, batch_size=32)


1.2.2 The functional API

import keras
from keras import layers

input = keras.Input(shape=(10,))
x = layers.Dense(20, activation='relu')(x)
x = layers.Dense(20, activation='relu')(x)
outputs = layers.Dense(10, activation='softmax')(x)

model = keras.Model(inputs, outputs)
model.fit(x, y, epochs=10, batch_size=32)

1.2.3 Sequential NN examples

Il seguente codice mostra come costruire una semplice rete neurale sequenziale utilizzando keras.

# Model initialization:
model = Sequential()

# A simple model:
model.add(Dense(units=20, input_dim=28*28))
model.add(Activation('relu'))
#why don't I have the dropout here?

# A bit more complex model:
#model.add(Dense(units=50, input_dim=28*28))
#model.add(Activation('relu'))
#model.add(Dropout(0.2))

model.add(Dense(units=20))
model.add(Activation('relu'))
model.add(Dropout(0.2))

# The last layer needs to be like this:
model.add(Dense(units=10, activation='softmax'))

model.compile(loss='categorical_crossentropy', 
              optimizer='adam', 
              metrics=['accuracy'])

print(model.summary())

2 Example 1

from keras.models import Sequential
import numpy as np

np.random.seed(100)

model = Sequential()
dim_input = 2
dim_hidden = 2
model.add(Dense(dim_hidden, input_dim = dim_input, init='uniform'))
model.add(Activation('sigmoid'))
dim_output = 1
model.add(Dense(dim_output, input_dim = dim_hidden))
model.add(Activation('sigmoid'))

3 Example 2: MNIST Dataset

nil