woensdag 20 mei 2015

Derde deel in "Deep Learning met Python" cursus

Sigmoid
De tien 28x28 weight matrixes, uit deel 2, blijken niet echt voldoende om tien getallen betrouwbaar 'te leren'. Dat lijkt ook logisch omdat er vele manieren zijn om getallen te schijven en dus het bijhouden van een gemiddelde verdeling per definitie de nodige fouten met zich mee zal brengen. De behaalde betrouwbaarheid was zo'n 92,5 %. Dat moet beter kunnen! Het derde deel gaat dan ook over een 'netwerk opzet' met ondermeer een 'verborgen' tussenlaag.

Hier is de betreffende code. Na 100 leer-loops wordt er een betrouwbaarheid mee bereikt van 98,4%
Nog lang niet genoeg voor een 'commerciƫle toepassing' volgens de spreker. Dat zou pas gaan meetellen vanaf 99,5%. Gelukkig gaan we daar later, via een modern net, met 'convolutional networks' in de buurt komen!

Er blijken 2 regels code in te zitten die niet werken maar gelukkig ook hier geen functie hebben. "foxhound utils" en "scipy". Deze #-en we dus maar even. Waarschijnlijk zijn ze oorspronkelijk gebruikt om grafieken te maken en om de gevonden leergegevens te kunnen opslaan.

De gradient funktie is aangepast (sgd) zodat die op beide weights (w_h en w_o) kan worden uitgevoerd.
Het model rekent met een sigmoid functie op de verborgen laag w_h, en met een softmax functie op w_o (output laag).
De keuze van de formaten van de weights matrixes is mij niet geheel duidelijk 748 is weer 28*28 (even groot als de invoer 'plaatjes') De output geeft weer de 10 getallen. De 625 daartussen blijft nog een beetje vaag.
Het netwerk haalt 95,66%. Een mindere score dan het eenvoudiger log_reg model uit het 2e deel.

import theano from theano import tensor as T
import numpy as np
from load import mnist
# from foxhound.utils.vis import grayscale_grid_vis, unit_scale
# from scipy.misc import imsave
def floatX(X):
return np.asarray(X, dtype=theano.config.floatX)
def init_weights(shape):
return theano.shared(floatX(np.random.randn(*shape) * 0.01))
def sgd(cost, params, lr=0.05):
grads = T.grad(cost=cost, wrt=params)
updates = []
for p, g in zip(params, grads):
updates.append([p, p - g * lr])
return updates
def model(X, w_h, w_o):
h = T.nnet.sigmoid(T.dot(X, w_h))
pyx = T.nnet.softmax(T.dot(h, w_o))
return pyx
trX, teX, trY, teY = mnist(onehot=True)
X = T.fmatrix()
Y = T.fmatrix()
w_h = init_weights((784, 625))
w_o = init_weights((625, 10))
py_x = model(X, w_h, w_o)
y_x = T.argmax(py_x, axis=1)
cost = T.mean(T.nnet.categorical_crossentropy(py_x, Y))
params = [w_h, w_o]
updates = sgd(cost, params)
train = theano.function(inputs=[X, Y], outputs=cost, updates=updates, allow_input_downcast=True)
predict = theano.function(inputs=[X], outputs=y_x, allow_input_downcast=True)
for i in range(100):
for start, end in zip(range(0, len(trX), 128), range(128, len(trX), 128)):
cost = train(trX[start:end], trY[start:end])
print np.mean(np.argmax(teY, axis=1) == predict(teX))

Geen opmerkingen:

Een reactie posten