function [wh,wo,es] = nntrnviz(dat,nrm,tgt,lr,its,hus)% [wh,wo,es] = nntrnviz(dat,nrm,tgt,lr,its,hus)%    Visualize training of neural net by plotting surfaces after %    each iteration.%    It's special-cased for 3 outputs and 50 pts per output.% 2002-02-11 dpwe@ee.columbia.edu% First iteration is different to intialize net[wh,wo,es] = nntrain(dat,nrm,tgt,lr,1,hus);ptsperop=50;uu=1:ptsperop;oo=ptsperop+[1:ptsperop];aa=(2*ptsperop)+[1:ptsperop];% Limits for gridsamplinglimits = [200 1100 600 1600];gridpts = 60;% 3D viewpointaz = 18;el = 44;for e = 1:its	    plot(dat(uu,1),dat(uu,2),'or',dat(oo,1),dat(oo,2),'ob',dat(aa,1),dat(aa,2),'og');    % Sample entire 2D surface of NN outputs    [nnO,xx,yy] = nngridsamp(wh,wo,nrm,limits,gridpts,1);    [nnU,xx,yy] = nngridsamp(wh,wo,nrm,limits,gridpts,2);    [nnA,xx,yy] = nngridsamp(wh,wo,nrm,limits,gridpts,3);    % Use contour to plot where their difference crosses zero    hold on    contour(xx,yy,nnO-max(nnU,nnA),[0 0])    contour(xx,yy,nnA-max(nnU,nnO),[0 0])    % Pretty good decision boundary.  You can see the 'wrong' points    % Add the actual surfaces defined by the outputs    % (shifted down by -1 so 2D plane is at the top)    surf(xx,yy,nnO-1)    surf(xx,yy,nnU-1)    surf(xx,yy,nnA-1)    view(az,el);    hold off    pause;        % Do the next iteration    [wh,wo,esb] = nntrain(dat,nrm,tgt,lr,1,wh,wo);    es = [es,esb];end