This is awesome! Can you describe how you implemented the WebGL ops a bit more? Did you have to write your own convolution kernel with GLSL for example?
Thanks! For WebGL, credit goes to https://github.com/waylonflinn/weblas. I only really use GEMM, but it works quite well. In keras.js, convolution is implemented with the oft-used im2col transformation to turn it into a matrix multiply followed by reshape. Convolution kernels directly GLSL could potentially provide speed gains I'm sure, but I can't even imagine writing it for tensors of arbitrary shape.
What sort of performance can be expected compared to running in the terminal? How large NNs will this scale to in practice? I see a 50-layer resnet is mentioned; but not 1000-layers?
On these demos, I'm getting several seconds on the imagenet inception v3 recognition on an i7 macbook pro (nvidia gpu), on both gpu and cpu modes.
I've built tensorflow for android, running inceptionv3 trained on imagenet and it's much faster, running just on mobile CPU pretty much realtime, around 5fps. On a desktop CPU/GPU it's obviously even faster
You mean with tensorflow or theano as the backend? They have all kinds of optimizations that isn't possible to replicate here yet. There is certainly room for optimization! Also, 1000-layer resnets should theoretically be possible, but probably isn't that practical. Lots of exciting work happening in searching for more efficient architectures.
Wonderful! And because all praise comes with work in OSS: I wish the network diagram would show intermediate states where possible. I've seen some examples where – with the right presentations – they gave fantastic insights into the network's "thinking".
Very cool. Didn't work on Android (Chrome) either in GPU or CPU mode.
Usual tricks like pruning the model and quantising to 8bit should get the model sizes down significantly from 100mb. Or using an architecture like squeezenet
Thanks. Nothing fancy with the network architecture diagrams. The layers are just div elements with the layer name as the id. There's a definition of inbound/outbound connections by layer names, extracted from the keras json config, which is used to draw SVG paths.