vrijdag 19 juni 2015

Hij kan tellen!

Niet laten hinderen door een instabiele videokaart. Toch maar even het voornemen om even slim te zijn als de kraaien uit te proberen. Ik meen toch zeker dat ik daarover heb geschreven maar ik kan nu het bericht zo snel niet terugvinden. Enfin, ze hebben ontdekt dat kraaien kunnen tellen.
(http://www.nu.nl/wetenschap/4064944/kraaien-hebben-vermogen-tellen.html)


Als machine learning enig respect wil houden zal het dat toch minsten moeten kunnen evenaren!
De handschoen opgepakt! Ook hier gaat het weer vooral om 'datamanipulatie'. Hoe maak je een dataset met veel afbeeldingen van 'graantjes'? Dat lijkt nu gelukt! Ongetwijfeld niet op de mooiste manier (in numpy / python moet je for-loopjes kunnen vermijden) maar toch: Tellen (tot 3) lijkt alvast te lukken:





Of met 6 graan varianten: (0 .. 5):



Hierbij weer de code:

import matplotlib.pyplot as plt
from sklearn import svm
import numpy as np

# Kraaien kunnen tellen. Dat blijkt uit een experiment http://www.nu.nl/wetenschap/4064944/kraaien-hebben-vermogen-tellen.html
# Toch eens kijken of dat een DL programma dat ook kan.

si = 1000
h = 28
b = 28
r = 4
ima = np.zeros((si, h * b))
ima.shape = si, h , b
grains = np.floor(np.random.rand(si) * 4)

for i in range(0,si):
    for j in range(0,int(grains[i])):
        ho = np.floor(np.random.rand() * (h-r))
        br = np.floor(np.random.rand() * (b-r))
        for x in range(int(ho),int(ho+r)):
            for y in range(int(br),int(br+r)):
                ima[i,x,y] = 1

clf = svm.SVC(gamma=0.0001, C=100)
ima.shape = si, h * b
x,y = ima, grains

clf.fit(x[:-10],y[:-10])

#print ('Prediction:', clf.predict(im[t]))

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid

def fillim(c):
    im = ima[c]
    im.shape = h,b
    return im

fig = plt.figure(1, (10., 10.))
grid = ImageGrid(fig, 111, # similar to subplot(111)
                 nrows_ncols = (2, 5), # creates 2x2 grid of axes
                 axes_pad=0.5, # pad between axes in inch.
                 )

for c in range(10):
    grid[c].imshow(fillim((si - 10) + c),cmap=plt.cm.gray)
    title = 'Predict: ' +  str(clf.predict(ima[(si - 10) + c]))
    grid[c].set_title(title, weight='light', size='small', position=(0.5, 1.1),
         horizontalalignment='center', verticalalignment='center')


plt.show()

Geen opmerkingen:

Een reactie posten