Sigmoid |
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