Title: Multilayer Convolutional Neural Network Author: Thomas Breuel Institution: UniKL
from pylab import *
from scipy.ndimage import filters
def F(a): return array(a,'f')
figsize(12,6)
temp = F(mean(imread("page.png"),2))
roi = (slice(500,1000),slice(500,1000))
target = F(1-(temp[roi]>0.5))
gray()
subplot(121); imshow(target)
image = maximum(filters.gaussian_filter(target+0.2*randn(*target.shape),3.0),(rand(*image.shape)>0.95))
image -= amin(image); image /= amax(image)
subplot(122); imshow(image)
h,w = image.shape
def sigmoid(x): return 1/(1+exp(-x))
N = 8
l = arange(2*r+1)
r = 3
fs = array([0.01*ones((2*r+1,2*r+1)) for i in range(8)])
fs[0,:,r] = .1
fs[1,r,:] = .1
fs[2,r-1:r+2,r-1:r+2] = .1
fs[3,:2,:2] = .1; fs[3,:2,-2:] = .1; fs[3,-2:,:2] = .1; fs[3,-2:,-2:] = .1
fs[4,l,l] = .1
fs[5,l,l[::-1]] = .1
fs[6,r-1:r+2,r] = .1
fs[7,r,r-1:r+2] = .1
for i in range(N):
fs -= mean(fs)
fs[i] /= sum(fs**2)**.5
thetas = zeros(N)
ws = sin(1.7*arange(N))
theta2 = 0.0
figsize(12,6)
for i in range(N):
subplot(2,4,i+1); imshow(fs[i])
hs = array([sigmoid(filters.convolve(image,f)+thetas[i]) for i,f in enumerate(fs)])
for i in range(N):
subplot(2,4,i+1); imshow(hs[i])
hs.shape
(8, 500, 500)
pred = sigmoid(dot(ws,hs.reshape(N,h*w)).reshape(h,w)+theta2)
imshow(pred)
<matplotlib.image.AxesImage at 0x96af910>
def train(niter,eta=0.1):
global N,r,fs,thetas,ws,theta2
for iter in range(niter):
hs = array([sigmoid(filters.convolve(image,f)+thetas[i]) for i,f in enumerate(fs)])
pred = sigmoid(dot(ws,hs.reshape(N,h*w)).reshape(h,w)+theta2)
err = sum((pred-target)**2)/(w*h)
if iter%10==0: sys.stderr.write("\n")
sys.stderr.write("%d:%.3f "%(iter,err))
delta = (pred-target)*pred*(1-pred)
delta /= h*w
dw = array([sum(delta*hs[i]) for i,f in enumerate(fs)])
for k,f in enumerate(fs):
delta1 = delta*ws[k]*hs[k]*(1-hs[k])
df = array([[sum(delta1*roll(roll(image,i,0),j,1)) for j in range(-r,r+1)] for i in range(-r,r+1)])
fs[k] -= eta*df
thetas[k] -= eta*sum(delta1)
ws -= eta*dw
theta2 -= eta*sum(delta)
def forward(image):
hs = array([sigmoid(filters.convolve(image,f)+thetas[i]) for i,f in enumerate(fs)])
pred = sigmoid(dot(ws,hs.reshape(N,h*w)).reshape(h,w)+theta2)
return pred
fs.shape
(8, 7, 7)
train(500,eta=5.0)
pred = forward(image)
imshow(pred)
0:0.085 1:0.085 2:0.085 3:0.085 4:0.084 5:0.084 6:0.084 7:0.084 8:0.084 9:0.084 10:0.084 11:0.083 12:0.083 13:0.083 14:0.083 15:0.083 16:0.083 17:0.083 18:0.083 19:0.082 20:0.082 21:0.082 22:0.082 23:0.082 24:0.082 25:0.082 26:0.082 27:0.081 28:0.081 29:0.081 30:0.081 31:0.081 32:0.081 33:0.081 34:0.081 35:0.080 36:0.080 37:0.080 38:0.080 39:0.080 40:0.080 41:0.080 42:0.080 43:0.080 44:0.080 45:0.079 46:0.079 47:0.079 48:0.079 49:0.079 50:0.079 51:0.079 52:0.079 53:0.079 54:0.079 55:0.078 56:0.078 57:0.078 58:0.078 59:0.078 60:0.078 61:0.078 62:0.078 63:0.078 64:0.078 65:0.078 66:0.078 67:0.077 68:0.077 69:0.077 70:0.077 71:0.077 72:0.077 73:0.077 74:0.077 75:0.077 76:0.077 77:0.077 78:0.077 79:0.077 80:0.076 81:0.076 82:0.076 83:0.076 84:0.076 85:0.076 86:0.076 87:0.076 88:0.076 89:0.076 90:0.076 91:0.076 92:0.076 93:0.076 94:0.076 95:0.075 96:0.075 97:0.075 98:0.075 99:0.075 100:0.075 101:0.075 102:0.075 103:0.075 104:0.075 105:0.075 106:0.075 107:0.075 108:0.075 109:0.075 110:0.075 111:0.075 112:0.075 113:0.074 114:0.074 115:0.074 116:0.074 117:0.074 118:0.074 119:0.074 120:0.074 121:0.074 122:0.074 123:0.074 124:0.074 125:0.074 126:0.074 127:0.074 128:0.074 129:0.074 130:0.074 131:0.074 132:0.074 133:0.074 134:0.074 135:0.073 136:0.073 137:0.073 138:0.073 139:0.073 140:0.073 141:0.073 142:0.073 143:0.073 144:0.073 145:0.073 146:0.073 147:0.073 148:0.073 149:0.073 150:0.073 151:0.073 152:0.073 153:0.073 154:0.073 155:0.073 156:0.073 157:0.073 158:0.073 159:0.073 160:0.073 161:0.073 162:0.073 163:0.073 164:0.072 165:0.072 166:0.072 167:0.072 168:0.072 169:0.072 170:0.072 171:0.072 172:0.072 173:0.072 174:0.072 175:0.072 176:0.072 177:0.072 178:0.072 179:0.072 180:0.072 181:0.072 182:0.072 183:0.072 184:0.072 185:0.072 186:0.072 187:0.072 188:0.072 189:0.072 190:0.072 191:0.072 192:0.072 193:0.072 194:0.072 195:0.072 196:0.072 197:0.072 198:0.072 199:0.072 200:0.072 201:0.072 202:0.072 203:0.072 204:0.072 205:0.072 206:0.071 207:0.071 208:0.071 209:0.071 210:0.071 211:0.071 212:0.071 213:0.071 214:0.071 215:0.071 216:0.071 217:0.071 218:0.071 219:0.071 220:0.071 221:0.071 222:0.071 223:0.071 224:0.071 225:0.071 226:0.071 227:0.071 228:0.071 229:0.071 230:0.071 231:0.071 232:0.071 233:0.071 234:0.071 235:0.071 236:0.071 237:0.071 238:0.071 239:0.071 240:0.071 241:0.071 242:0.071 243:0.071 244:0.071 245:0.071 246:0.071 247:0.071 248:0.071 249:0.071 250:0.071 251:0.071 252:0.071 253:0.071 254:0.071 255:0.071 256:0.071 257:0.071 258:0.071 259:0.071 260:0.071 261:0.071 262:0.071 263:0.071 264:0.071 265:0.071 266:0.071 267:0.071 268:0.071 269:0.071 270:0.071 271:0.071 272:0.071 273:0.071 274:0.071 275:0.071 276:0.071 277:0.070 278:0.070 279:0.070 280:0.070 281:0.070 282:0.070 283:0.070 284:0.070 285:0.070 286:0.070 287:0.070 288:0.070 289:0.070 290:0.070 291:0.070 292:0.070 293:0.070 294:0.070 295:0.070 296:0.070 297:0.070 298:0.070 299:0.070 300:0.070 301:0.070 302:0.070 303:0.070 304:0.070 305:0.070 306:0.070 307:0.070 308:0.070 309:0.070 310:0.070 311:0.070 312:0.070 313:0.070 314:0.070 315:0.070 316:0.070 317:0.070 318:0.070 319:0.070 320:0.070 321:0.070 322:0.070 323:0.070 324:0.070 325:0.070 326:0.070 327:0.070 328:0.070 329:0.070 330:0.070 331:0.070 332:0.070 333:0.070 334:0.070 335:0.070 336:0.070 337:0.070 338:0.070 339:0.070 340:0.070 341:0.070 342:0.070 343:0.070 344:0.070 345:0.070 346:0.070 347:0.070 348:0.070 349:0.070 350:0.070 351:0.070 352:0.070 353:0.070 354:0.070 355:0.070 356:0.070 357:0.070 358:0.070 359:0.070 360:0.070 361:0.070 362:0.070 363:0.070 364:0.070 365:0.070 366:0.070 367:0.070 368:0.070 369:0.070 370:0.070 371:0.070 372:0.070 373:0.070 374:0.070 375:0.070 376:0.070 377:0.070 378:0.070 379:0.070 380:0.070 381:0.070 382:0.070 383:0.070 384:0.070 385:0.070 386:0.070 387:0.070 388:0.070 389:0.070 390:0.070 391:0.070 392:0.070 393:0.070 394:0.070 395:0.070 396:0.070 397:0.070 398:0.070 399:0.070 400:0.070 401:0.070 402:0.070 403:0.070 404:0.070 405:0.070 406:0.070 407:0.070 408:0.070 409:0.070 410:0.070 411:0.070 412:0.070 413:0.070 414:0.070 415:0.070 416:0.070 417:0.070 418:0.070 419:0.070 420:0.070 421:0.070 422:0.070 423:0.070 424:0.070 425:0.070 426:0.070 427:0.070 428:0.070 429:0.070 430:0.070 431:0.070 432:0.070 433:0.070 434:0.070 435:0.070 436:0.069 437:0.069 438:0.069 439:0.069 440:0.069 441:0.069 442:0.069 443:0.069 444:0.069 445:0.069 446:0.069 447:0.069 448:0.069 449:0.069 450:0.069 451:0.069 452:0.069 453:0.069 454:0.069 455:0.069 456:0.069 457:0.069 458:0.069 459:0.069 460:0.069 461:0.069 462:0.069 463:0.069 464:0.069 465:0.069 466:0.069 467:0.069 468:0.069 469:0.069 470:0.069 471:0.069 472:0.069 473:0.069 474:0.069 475:0.069 476:0.069 477:0.069 478:0.069 479:0.069 480:0.069 481:0.069 482:0.069 483:0.069 484:0.069 485:0.069 486:0.069 487:0.069 488:0.069 489:0.069 490:0.069 491:0.069 492:0.069 493:0.069 494:0.069 495:0.069 496:0.069 497:0.069 498:0.069 499:0.069
<matplotlib.image.AxesImage at 0xc2fea90>
figsize(12,12)
subplot(131); imshow(target)
subplot(132); imshow(image)
subplot(133); imshow(pred)
<matplotlib.image.AxesImage at 0x16d107d0>
hs = array([sigmoid(filters.convolve(image,f)+thetas[i]) for i,f in enumerate(fs)])
for i in range(N):
subplot(2,4,i+1); imshow(hs[i])
hs.shape
(8, 500, 500)
for i in range(N):
subplot(2,4,i+1); imshow(fs[i])
print thetas
print ws
print theta2
[ 0.21134476 -0.84214145 0.47465556 1.15101984 -0.25504015 -0.62009864 1.03987463 0.96926459] [-1.0440527 2.4542143 -1.50268043 -3.5040394 1.29853975 1.94842908 -2.61495456 -2.44724263] -0.345268163126