diff --git a/examples/meetup/nnet.ipynb b/examples/meetup/nnet.ipynb index 4e813d8f..357db0fa 100644 --- a/examples/meetup/nnet.ipynb +++ b/examples/meetup/nnet.ipynb @@ -2,13 +2,24 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "gridxy (generic function with 1 method)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "using Plots; immerse()\n", + "using Plots; qwt()\n", "default(size=(500,300), leg=false)\n", "\n", "# creates x/y vectors which can define a grid in a zig-zag pattern\n", @@ -28,14 +39,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "target (generic function with 1 method)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# these are the functions we want to classify\n", - "scalar = 5 # larger is harder... start with 3\n", + "scalar = 8 # larger is harder... start with 3\n", "f1(x) = 0.6sin(scalar * x) + 0.1\n", "f2(x) = f1(x) - 0.2\n", "\n", @@ -52,11 +74,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Plots.jl] Initializing backend: qwt" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "Plot{Plots.QwtPackage() n=4}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ "# pick the plotting limits\n", "lim = (-1,1)\n", @@ -67,7 +115,7 @@ "\n", "function initialize_plot(funcs, lim, gridx, gridy; kw...)\n", " # show the grid\n", - " plot([gridx gridy], [gridy gridx], c=:black, kw...)\n", + " plot([gridx gridy], [gridy gridx], c=:black; kw...)\n", "\n", " # show the funcs\n", " plot!(funcs, lim..., l=(4,[:blue :red]))\n", @@ -93,36 +141,47 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "NeuralNet{\n", + " params: NetParams{OnlineAI.AdadeltaModel(1.0e-6,0.3,0.96,1.0e-5) NoDropout OnlineAI.L2CostModel()}\n", + " solverParams: OnlineAI.SolverParams(1000,1000,10000,-1,[:x,:xhat,:y,:Σ,:a],100,1.0e-5,OnlineAI.donothing)\n", + " layers:\n", + " NormalizedLayer{2=>2 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n", + " NormalizedLayer{2=>2 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n", + " NormalizedLayer{2=>5 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n", + " NormalizedLayer{5=>100 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n", + " NormalizedLayer{100=>5 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n", + " NormalizedLayer{5=>2 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n", + " NormalizedLayer{2=>2 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n", + " NormalizedLayer{2=>1 OnlineAI.TanhActivation() p=1.0 ‖δΣ‖₁=0.0 ‖δy‖₁=0.0 }\n", + "}\n" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "using OnlineAI\n", + "\n", + "# gradientModel = SGDModel(η=1e-4, μ=0.5)\n", + "# gradientModel = AdagradModel(η=1e-2)\n", + "gradientModel = AdadeltaModel(η=3e-1, ρ=0.96)\n", + "\n", "net = buildTanhClassificationNet(\n", " 2, # number of inputs\n", " 1, # number of outputs\n", - " [2], # hidden layers structure\n", - "# params = NetParams(gradientModel = SGDModel(η=1e-5))\n", - "params = NetParams(gradientModel = AdadeltaModel(η=1e-3, ρ=0.98))\n", - "# params = NetParams(gradientModel = AdagradModel(η=1e-1))\n", - ")\n", - "\n", - "# take x matrix and convert to the first layer's activation\n", - "function activateHidden(net, x)\n", - " @assert net.layers[end].nin == 2\n", - " proj = zeros(nrows(x), 2)\n", - " for i in 1:nrows(x)\n", - " data = row(x,i)\n", - " for layer in net.layers[1:end-1]\n", - " OnlineAI.forward!(layer, data, false)\n", - " data = layer.a\n", - " end\n", - " row!(proj, i, data)\n", - " end\n", - " vec(proj[:,1]), vec(proj[:,2])\n", - "end " + " [2,2,5,100,5,2,2], # hidden layers structure\n", + " params = NetParams(gradientModel = gradientModel)\n", + ")" ] }, { @@ -134,17 +193,68 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "p = initialize_plot(funcs, lim, gridx, gridy)\n", + "# set up a visualization of the projections\n", + "layers = filter(l -> l.nout == 2, net.layers[1:end-1])\n", + "num_hidden_layers = length(layers)\n", + "plts = [initialize_plot(funcs, lim, gridx, gridy, title=\"Hidden Layer $i\") for i in 1:num_hidden_layers]\n", + "sz = round(Int, sqrt(num_hidden_layers) * 600)\n", + "projectionviz = subplot(plts..., n=num_hidden_layers, size=(sz,sz))\n", + "\n", + "# setup animation, then show the plots in a window\n", "anim = initialize_animation()\n", "gui()\n", "\n", - "progressviz = track_progress(net, fields=[:x,:Σ,:a], size=(800,800), m=2, w=0);" + "# create another visualization to track the internal progress of the neural net\n", + "progressviz = track_progress(net, fields=[:w,:b,:Σ,:a], size=(num_hidden_layers*300,800), m=2, w=0);" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "activateHidden (generic function with 1 method)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dist = Distributions.Uniform(lim...)\n", + "progressgui = false\n", + "\n", + "function activateHidden(net, layers, x, y, seriesidx, plts)\n", + " n = length(x)\n", + " p = length(plts)\n", + " projx, projy = zeros(n,p), zeros(n,p)\n", + " for i in 1:n\n", + " # feed the data through the neural net\n", + " OnlineAI.forward!(net, [x[i], y[i]])\n", + " \n", + " # grab the net's activations at each layer\n", + " for j in 1:p\n", + " projx[i,j], projy[i,j] = layers[j].a\n", + " end\n", + " end\n", + " \n", + " # now we can update the plots\n", + " for j in 1:p\n", + " plts[j][seriesidx] = (vec(projx[:,j]), vec(projy[:,j]))\n", + " end\n", + "end" ] }, { @@ -155,13 +265,11 @@ }, "outputs": [], "source": [ - "iterations_per_frame = 1000\n", - "total_frames = 200\n", - "dist = Distributions.Uniform(lim...)\n", - "\n", + "iterations_per_frame = 10000\n", + "total_frames = 100\n", "for frm in 1:total_frames\n", " # pick one of the functions at random, sample from the x line, then update the\n", - " # neural net with [x, f(x)] as the inputsn = 1000\n", + " # neural net with [x, f(x)] as the inputs\n", " for i in 1:iterations_per_frame\n", " f = sample(funcs)\n", " x = rand(dist)\n", @@ -170,64 +278,81 @@ " end\n", " \n", " # update the progress visualization\n", - " update!(progressviz, true, show=false)\n", - "\n", - " # update the plot... project each series to the first hidden layer and reset the data\n", - " # NOTE: this works because `getindex` and `setindex` are overloaded to get/set the underlying plot series data\n", - " x = linspace(lim..., 50)\n", - " p[1] = activateHidden(net, hcat(gridx, gridy))\n", - " p[2] = activateHidden(net, hcat(gridy, gridx))\n", - " p[3] = activateHidden(net, hcat(x, map(f1,x)))\n", - " p[4] = activateHidden(net, hcat(x, map(f2,x)))\n", + " update!(progressviz, true, show=progressgui)\n", "\n", + " # update the projections\n", + " x = linspace(lim..., 100)\n", + " for (seriesidx, (x,y)) in enumerate([(gridx,gridy), (gridy,gridx), (x,map(f1,x)), (x,map(f2,x))])\n", + " activateHidden(net, layers, x, y, seriesidx, projectionviz.plts)\n", + " end\n", + " \n", " # show/update the plot\n", - " gui(p)\n", + " gui(projectionviz)\n", " frame(anim)\n", + " sleep(0.001)\n", "end\n", "\n", - "# displays the progress\n", - "progressviz.subplt" + "# displays the progress if there's no gui\n", + "progressgui || progressviz.subplt" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: handleLinkInner isn't implemented for qwt\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "Subplot{Plots.QwtPackage() p=2 n=2}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# show stacked and linked histograms of the preditions for each class\n", "testn = 100\n", "xs = linspace(lim..., testn)\n", "x1, x2 = [hcat(xs,map(f,xs)) for f in funcs]\n", - "# testx = vcat(hcat(xs,map(f1,xs)), hcat(xs,map(f2,xs)))\n", - "# testy = vcat(ones(testn), -ones(testn))\n", "y1, y2 = ones(testn), -ones(testn)\n", "yhat1, yhat2 = [vec(predict(net, x)) for x in (x1,x2)]\n", - "subplot(histogram(yhat1), histogram(yhat2), nc=1, linkx=true, title=[\"f1 prediction\", \"f2 prediction\"], xlim=lim)" + "subplot(histogram(yhat1), histogram(yhat2), nc=1, linkx=true, title=[\"f1 prediction\", \"f2 prediction\"])" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "plot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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Tz6Z7RYriWQQlCnrL3/5S7YReRcay/rvf//7i1/84ktf+pLWsp555pkf/vCHn/zkJ7uXAhwCwR3Y58EHHxweHk4Hnv/4xz/Onj37xBNP2Crrb3/72/e+971XX31Vd1m9Xm9sbOxnP/vZCy+8oK+st99+++OPP37kkUe6FwHcAsEdaGRp6VbVv8KZ6cBzeXn5ueee+/73v/+pT31KtazKkkop+5qy3nnnnW984xu///3vP//5z7e43zI1ZS0tLV29evXAgQN79+7VV9bBgwd//OMfx3FMUgRwCGwcBliQJMn999//1a9+9Y9//OP8/PwnPvGJ/Ke9Xo/QUKvK+sMf/nDw4ME//elP999/f83lhZxSgUK/VX9fURT95z//2bhx47Vr14TfNli7vqXQbwnLKq+QgcsHAq8tf0GwxHF86NChb33rWydPnixHQANlvfjiiy+99NJbb71177331l9ennaolrV79+4f/OAHmzdv/te//vWTn/zkgQceqLq8PO1QLSsfymn7SMAcpGUAF9atW/e5z32usC4wW+ROu9q9XNbBgwevXLnyhS98IVtZv7i4qKmsr3/9648++ujY2NgDDzywtLT061//mqQgYVkgWJCWAVx46KGHduzYYebRH8oC3oO0DLDPysrK6dOnFxYWtm/fjrL4lwWcAMEd2GdoaOizn/3s66+/PjCgPU+IskAgIC0DAAAegk4eAAA8BMEdAAA8BMEdAAA85P8BGAPfsl+PRZwAAAAASUVORK5CYII=", + "text/plain": [ + "Plot{Plots.QwtPackage() n=4}" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "plot(xs, hcat(map(f1,xs), map(f2,xs), reshape(yhat,testn,2)), leg=true, w=[2 2 5 5])" + "plot(xs, hcat(map(f1,xs), map(f2,xs), yhat1, yhat2), leg=true, line=([2 2 5 5], [:blue :red], [:solid :solid :dot :dot]))" ] }, { @@ -400,10 +525,12 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], - "source": [] + "source": [ + "histogram(yhat1)" + ] }, { "cell_type": "code", diff --git a/src/backends/qwt.jl b/src/backends/qwt.jl index a167eca2..9404beba 100644 --- a/src/backends/qwt.jl +++ b/src/backends/qwt.jl @@ -1,63 +1,6 @@ # https://github.com/tbreloff/Qwt.jl -# immutable QwtPackage <: PlottingPackage end - -# export qwt -# qwt() = backend(:qwt) - -# # supportedArgs(::QwtPackage) = setdiff(_allArgs, [:xlims, :ylims, :xticks, :yticks]) -# supportedArgs(::QwtPackage) = [ -# :annotation, -# # :args, -# :axis, -# :background_color, -# :color, -# :color_palette, -# :fillrange, -# :fillcolor, -# :foreground_color, -# :group, -# # :heatmap_c, -# # :kwargs, -# :label, -# :layout, -# :legend, -# :linestyle, -# :linetype, -# :linewidth, -# :markershape, -# :markercolor, -# :markersize, -# :n, -# :nbins, -# :nc, -# :nr, -# :pos, -# :smooth, -# # :ribbon, -# :show, -# :size, -# :title, -# :windowtitle, -# :x, -# :xlabel, -# :xlims, -# :xticks, -# :y, -# :ylabel, -# :ylims, -# :yrightlabel, -# :yticks, -# :xscale, -# :yscale, -# # :xflip, -# # :yflip, -# # :z, -# ] -# supportedTypes(::QwtPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, :scatter, :heatmap, :hexbin, :hist, :bar, :hline, :vline] -# supportedMarkers(::QwtPackage) = [:none, :auto, :rect, :ellipse, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :star8, :hexagon] -# supportedScales(::QwtPackage) = [:identity, :log10] # ------------------------------- @@ -297,11 +240,19 @@ end # ---------------------------------------------------------------- -function Base.writemime(io::IO, ::MIME"image/png", plt::PlottingObject{QwtPackage}) +function Base.writemime(io::IO, ::MIME"image/png", plt::Plot{QwtPackage}) Qwt.savepng(plt.o, "/tmp/dfskjdhfkh.png") write(io, readall("/tmp/dfskjdhfkh.png")) end +function Base.writemime(io::IO, ::MIME"image/png", subplt::Subplot{QwtPackage}) + for plt in subplt.plts + Qwt.refresh(plt.o) + end + Qwt.savepng(subplt.o, "/tmp/dfskjdhfkh.png") + write(io, readall("/tmp/dfskjdhfkh.png")) +end + function Base.display(::PlotsDisplay, plt::Plot{QwtPackage}) Qwt.refresh(plt.o)