📄 demprior.m
字号:
function demprior(action);
%DEMPRIOR Demonstrate sampling from a multi-parameter Gaussian prior.
%
% Description
% This function plots the functions represented by a multi-layer
% perceptron network when the weights are set to values drawn from a
% Gaussian prior distribution. The parameters AW1, AB1 AW2 and AB2
% control the inverse variances of the first-layer weights, the hidden
% unit biases, the second-layer weights and the output unit biases
% respectively. Their values can be adjusted on a logarithmic scale
% using the sliders, or by typing values into the text boxes and
% pressing the return key.
%
% See also
% MLP
%
% Copyright (c) Ian T Nabney (1996-2001)
if nargin<1,
action='initialize';
end;
if strcmp(action,'initialize')
aw1 = 0.01;
ab1 = 0.1;
aw2 = 1.0;
ab2 = 1.0;
% Create FIGURE
fig=figure( ...
'Name','Sampling from a Gaussian prior', ...
'Position', [50 50 480 380], ...
'NumberTitle','off', ...
'Color', [0.8 0.8 0.8], ...
'Visible','on');
% The TITLE BAR frame
uicontrol(fig, ...
'Style','frame', ...
'Units','normalized', ...
'HorizontalAlignment', 'center', ...
'Position', [0.5 0.82 0.45 0.1], ...
'BackgroundColor',[0.60 0.60 0.60]);
% The TITLE BAR text
uicontrol(fig, ...
'Style', 'text', ...
'Units', 'normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.54 0.85 0.40 0.05], ...
'HorizontalAlignment', 'left', ...
'String', 'Sampling from a Gaussian prior');
% Frames to enclose sliders
uicontrol(fig, ...
'Style', 'frame', ...
'Units', 'normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.05 0.08 0.35 0.18]);
uicontrol(fig, ...
'Style', 'frame', ...
'Units', 'normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.05 0.3 0.35 0.18]);
uicontrol(fig, ...
'Style', 'frame', ...
'Units', 'normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.05 0.52 0.35 0.18]);
uicontrol(fig, ...
'Style', 'frame', ...
'Units', 'normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.05 0.74 0.35 0.18]);
% Frame text
uicontrol(fig, ...
'Style', 'text', ...
'Units', 'normalized', ...
'HorizontalAlignment', 'left', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.07 0.17 0.06 0.07], ...
'String', 'aw1');
% Frame text
uicontrol(fig, ...
'Style', 'text', ...
'Units', 'normalized', ...
'HorizontalAlignment', 'left', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.07 0.39 0.06 0.07], ...
'String', 'ab1');
% Frame text
uicontrol(fig, ...
'Style', 'text', ...
'Units', 'normalized', ...
'HorizontalAlignment', 'left', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.07 0.61 0.06 0.07], ...
'String', 'aw2');
% Frame text
uicontrol(fig, ...
'Style', 'text', ...
'Units', 'normalized', ...
'HorizontalAlignment', 'left', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.07 0.83 0.06 0.07], ...
'String', 'ab2');
% Slider
minval = -5; maxval = 5;
aw1slide = uicontrol(fig, ...
'Style', 'slider', ...
'Units', 'normalized', ...
'Value', log10(aw1), ...
'BackgroundColor', [0.8 0.8 0.8], ...
'Position', [0.07 0.1 0.31 0.05], ...
'Min', minval, 'Max', maxval, ...
'Callback', 'demprior update');
% Slider
ab1slide = uicontrol(fig, ...
'Style', 'slider', ...
'Units', 'normalized', ...
'Value', log10(ab1), ...
'BackgroundColor', [0.8 0.8 0.8], ...
'Position', [0.07 0.32 0.31 0.05], ...
'Min', minval, 'Max', maxval, ...
'Callback', 'demprior update');
% Slider
aw2slide = uicontrol(fig, ...
'Style', 'slider', ...
'Units', 'normalized', ...
'Value', log10(aw2), ...
'BackgroundColor', [0.8 0.8 0.8], ...
'Position', [0.07 0.54 0.31 0.05], ...
'Min', minval, 'Max', maxval, ...
'Callback', 'demprior update');
% Slider
ab2slide = uicontrol(fig, ...
'Style', 'slider', ...
'Units', 'normalized', ...
'Value', log10(ab2), ...
'BackgroundColor', [0.8 0.8 0.8], ...
'Position', [0.07 0.76 0.31 0.05], ...
'Min', minval, 'Max', maxval, ...
'Callback', 'demprior update');
% The graph box
haxes = axes('Position', [0.5 0.28 0.45 0.45], ...
'Units', 'normalized', ...
'Visible', 'on');
% Text display of hyper-parameter values
format = '%8f';
aw1val = uicontrol(fig, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'Position', [0.15 0.17 0.23 0.07], ...
'String', sprintf(format, aw1), ...
'Callback', 'demprior newval');
ab1val = uicontrol(fig, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'Position', [0.15 0.39 0.23 0.07], ...
'String', sprintf(format, ab1), ...
'Callback', 'demprior newval');
aw2val = uicontrol(fig, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'Position', [0.15 0.61 0.23 0.07], ...
'String', sprintf(format, aw2), ...
'Callback', 'demprior newval');
ab2val = uicontrol(fig, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'Position', [0.15 0.83 0.23 0.07], ...
'String', sprintf(format, ab2), ...
'Callback', 'demprior newval');
% The SAMPLE button
uicontrol(fig, ...
'Style','push', ...
'Units','normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position',[0.5 0.08 0.13 0.1], ...
'String','Sample', ...
'Callback','demprior replot');
% The CLOSE button
uicontrol(fig, ...
'Style','push', ...
'Units','normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position',[0.82 0.08 0.13 0.1], ...
'String','Close', ...
'Callback','close(gcf)');
% The HELP button
uicontrol(fig, ...
'Style','push', ...
'Units','normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position',[0.66 0.08 0.13 0.1], ...
'String','Help', ...
'Callback','demprior help');
% Save handles to objects
hndlList=[fig aw1slide ab1slide aw2slide ab2slide aw1val ab1val aw2val ...
ab2val haxes];
set(fig, 'UserData', hndlList);
demprior('replot')
elseif strcmp(action, 'update'),
% Update when a slider is moved.
hndlList = get(gcf, 'UserData');
aw1slide = hndlList(2);
ab1slide = hndlList(3);
aw2slide = hndlList(4);
ab2slide = hndlList(5);
aw1val = hndlList(6);
ab1val = hndlList(7);
aw2val = hndlList(8);
ab2val = hndlList(9);
haxes = hndlList(10);
aw1 = 10^get(aw1slide, 'Value');
ab1 = 10^get(ab1slide, 'Value');
aw2 = 10^get(aw2slide, 'Value');
ab2 = 10^get(ab2slide, 'Value');
format = '%8f';
set(aw1val, 'String', sprintf(format, aw1));
set(ab1val, 'String', sprintf(format, ab1));
set(aw2val, 'String', sprintf(format, aw2));
set(ab2val, 'String', sprintf(format, ab2));
demprior('replot');
elseif strcmp(action, 'newval'),
% Update when text is changed.
hndlList = get(gcf, 'UserData');
aw1slide = hndlList(2);
ab1slide = hndlList(3);
aw2slide = hndlList(4);
ab2slide = hndlList(5);
aw1val = hndlList(6);
ab1val = hndlList(7);
aw2val = hndlList(8);
ab2val = hndlList(9);
haxes = hndlList(10);
aw1 = sscanf(get(aw1val, 'String'), '%f');
ab1 = sscanf(get(ab1val, 'String'), '%f');
aw2 = sscanf(get(aw2val, 'String'), '%f');
ab2 = sscanf(get(ab2val, 'String'), '%f');
set(aw1slide, 'Value', log10(aw1));
set(ab1slide, 'Value', log10(ab1));
set(aw2slide, 'Value', log10(aw2));
set(ab2slide, 'Value', log10(ab2));
demprior('replot');
elseif strcmp(action, 'replot'),
% Re-sample from the prior and plot graphs.
oldFigNumber=watchon;
hndlList = get(gcf, 'UserData');
aw1slide = hndlList(2);
ab1slide = hndlList(3);
aw2slide = hndlList(4);
ab2slide = hndlList(5);
haxes = hndlList(10);
aw1 = 10^get(aw1slide, 'Value');
ab1 = 10^get(ab1slide, 'Value');
aw2 = 10^get(aw2slide, 'Value');
ab2 = 10^get(ab2slide, 'Value');
axes(haxes);
cla
set(gca, ...
'Box', 'on', ...
'Color', [0 0 0], ...
'XColor', [0 0 0], ...
'YColor', [0 0 0], ...
'FontSize', 14);
axis([-1 1 -10 10]);
set(gca,'DefaultLineLineWidth', 2);
nhidden = 12;
prior = mlpprior(1, nhidden, 1, aw1, ab1, aw2, ab2);
xvals = -1:0.005:1;
nsample = 10; % Number of samples from prior.
hold on
plot([-1 0; 1 0], [0 -10; 0 10], 'b--');
net = mlp(1, nhidden, 1, 'linear', prior);
for i = 1:nsample
net = mlpinit(net, prior);
yvals = mlpfwd(net, xvals');
plot(xvals', yvals, 'y');
end
watchoff(oldFigNumber);
elseif strcmp(action, 'help'),
% Provide help to user.
oldFigNumber=watchon;
helpfig = figure('Position', [100 100 480 400], ...
'Name', 'Help', ...
'NumberTitle', 'off', ...
'Color', [0.8 0.8 0.8], ...
'Visible','on');
% The HELP TITLE BAR frame
uicontrol(helpfig, ...
'Style','frame', ...
'Units','normalized', ...
'HorizontalAlignment', 'center', ...
'Position', [0.05 0.82 0.9 0.1], ...
'BackgroundColor',[0.60 0.60 0.60]);
% The HELP TITLE BAR text
uicontrol(helpfig, ...
'Style', 'text', ...
'Units', 'normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position', [0.26 0.85 0.6 0.05], ...
'HorizontalAlignment', 'left', ...
'String', 'Help: Sampling from a Gaussian Prior');
helpstr1 = strcat( ...
'This demonstration shows the effects of sampling from a Gaussian', ...
' prior over weights for a two-layer feed-forward network. The', ...
' parameters aw1, ab1, aw2 and ab2 control the inverse variances of', ...
' the first-layer weights, the hidden unit biases, the second-layer', ...
' weights and the output unit biases respectively. Their values can', ...
' be adjusted on a logarithmic scale using the sliders, or by', ...
' typing values into the text boxes and pressing the return key.', ...
' After setting these values, press the ''Sample'' button to see a', ...
' new sample from the prior. ');
helpstr2 = strcat( ...
'Observe how aw1 controls the horizontal length-scale of the', ...
' variation in the functions, ab1 controls the input range over', ...
' such variations occur, aw2 sets the vertical scale of the output', ...
' and ab2 sets the vertical off-set of the output. The network has', ...
' 12 hidden units. ');
hstr(1) = {helpstr1};
hstr(2) = {''};
hstr(3) = {helpstr2};
% The HELP text
helpui = uicontrol(helpfig, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'ForegroundColor', [0 0 0], ...
'HorizontalAlignment', 'left', ...
'BackgroundColor', [1 1 1], ...
'Min', 0, ...
'Max', 2, ...
'Position', [0.05 0.2 0.9 0.8]);
[hstrw , newpos] = textwrap(helpui, hstr, 70);
set(helpui, 'String', hstrw, 'Position', [0.05, 0.2, 0.9, newpos(4)]);
% The CLOSE button
uicontrol(helpfig, ...
'Style','push', ...
'Units','normalized', ...
'BackgroundColor', [0.6 0.6 0.6], ...
'Position',[0.4 0.05 0.2 0.1], ...
'String','Close', ...
'Callback','close(gcf)');
watchoff(oldFigNumber);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -