mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-08 19:42:39 +02:00
[progress] show progress of optimization using optimize(itpython_notebook=True)
This commit is contained in:
parent
b9b6ce91d8
commit
1c6cef44b6
4 changed files with 63 additions and 16 deletions
|
|
@ -256,7 +256,7 @@ class Model(Parameterized):
|
||||||
optimizer = optimization.get_optimizer(optimizer)
|
optimizer = optimization.get_optimizer(optimizer)
|
||||||
opt = optimizer(start, model=self, max_iters=max_iters, **kwargs)
|
opt = optimizer(start, model=self, max_iters=max_iters, **kwargs)
|
||||||
|
|
||||||
with VerboseOptimization(self, maxiters=max_iters, verbose=messages, ipython_notebook=ipython_notebook):
|
with VerboseOptimization(self, opt, maxiters=max_iters, verbose=messages, ipython_notebook=ipython_notebook):
|
||||||
opt.run(f_fp=self._objective_and_grads, f=self._objective, fp=self._objective_grads)
|
opt.run(f_fp=self._objective_and_grads, f=self._objective, fp=self._objective_grads)
|
||||||
|
|
||||||
self.optimization_runs.append(opt)
|
self.optimization_runs.append(opt)
|
||||||
|
|
@ -407,6 +407,8 @@ class Model(Parameterized):
|
||||||
to_print = ["""<style type="text/css">
|
to_print = ["""<style type="text/css">
|
||||||
.pd{
|
.pd{
|
||||||
font-family: "Courier New", Courier, monospace !important;
|
font-family: "Courier New", Courier, monospace !important;
|
||||||
|
width: 100%;
|
||||||
|
padding: 3px;
|
||||||
}
|
}
|
||||||
</style>\n"""] + ["<p class=pd>"] + ["{}: {}".format(name, detail) for name, detail in model_details] + ["</p>"]
|
</style>\n"""] + ["<p class=pd>"] + ["{}: {}".format(name, detail) for name, detail in model_details] + ["</p>"]
|
||||||
to_print.append(super(Model, self)._repr_html_())
|
to_print.append(super(Model, self)._repr_html_())
|
||||||
|
|
|
||||||
|
|
@ -274,7 +274,7 @@ class Param(Parameterizable, ObsAr):
|
||||||
header = header_format.format(x=self.hierarchy_name(), c=__constraints_name__, i=__index_name__, t=__tie_name__, p=__priors_name__) # nice header for printing
|
header = header_format.format(x=self.hierarchy_name(), c=__constraints_name__, i=__index_name__, t=__tie_name__, p=__priors_name__) # nice header for printing
|
||||||
if not ties: ties = itertools.cycle([''])
|
if not ties: ties = itertools.cycle([''])
|
||||||
return "\n".join(["""<style type="text/css">
|
return "\n".join(["""<style type="text/css">
|
||||||
.tg {padding:2px 3px;word-break:normal;border-collapse:collapse;border-spacing:0;border-color:#DCDCDC;margin:0px auto;}
|
.tg {padding:2px 3px;word-break:normal;border-collapse:collapse;border-spacing:0;border-color:#DCDCDC;margin:0px auto;width:100%;}
|
||||||
.tg td{font-family:"Courier New", Courier, monospace !important;font-weight:bold;color:#444;background-color:#F7FDFA;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
.tg td{font-family:"Courier New", Courier, monospace !important;font-weight:bold;color:#444;background-color:#F7FDFA;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
||||||
.tg th{font-family:"Courier New", Courier, monospace !important;font-weight:normal;color:#fff;background-color:#26ADE4;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
.tg th{font-family:"Courier New", Courier, monospace !important;font-weight:normal;color:#fff;background-color:#26ADE4;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
||||||
.tg .tg-left{font-family:"Courier New", Courier, monospace !important;font-weight:normal;text-align:left;}
|
.tg .tg-left{font-family:"Courier New", Courier, monospace !important;font-weight:normal;text-align:left;}
|
||||||
|
|
|
||||||
|
|
@ -393,7 +393,7 @@ class Parameterized(Parameterizable):
|
||||||
</tr>""".format(name=name)
|
</tr>""".format(name=name)
|
||||||
to_print.insert(0, header)
|
to_print.insert(0, header)
|
||||||
style = """<style type="text/css">
|
style = """<style type="text/css">
|
||||||
.tg {font-family:"Courier New", Courier, monospace !important;padding:2px 3px;word-break:normal;border-collapse:collapse;border-spacing:0;border-color:#DCDCDC;margin:0px auto;}
|
.tg {font-family:"Courier New", Courier, monospace !important;padding:2px 3px;word-break:normal;border-collapse:collapse;border-spacing:0;border-color:#DCDCDC;margin:0px auto;width:100%;}
|
||||||
.tg td{font-family:"Courier New", Courier, monospace !important;font-weight:bold;color:#444;background-color:#F7FDFA;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
.tg td{font-family:"Courier New", Courier, monospace !important;font-weight:bold;color:#444;background-color:#F7FDFA;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
||||||
.tg th{font-family:"Courier New", Courier, monospace !important;font-weight:normal;color:#fff;background-color:#26ADE4;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
.tg th{font-family:"Courier New", Courier, monospace !important;font-weight:normal;color:#fff;background-color:#26ADE4;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
||||||
.tg .tg-left{font-family:"Courier New", Courier, monospace !important;font-weight:normal;text-align:left;}
|
.tg .tg-left{font-family:"Courier New", Courier, monospace !important;font-weight:normal;text-align:left;}
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,14 @@
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
def exponents(fnow, current_grad):
|
def exponents(fnow, current_grad):
|
||||||
exps = [np.abs(np.float(fnow)), current_grad]
|
exps = [np.abs(np.float(fnow)), current_grad]
|
||||||
return np.sign(exps) * np.log10(exps).astype(int)
|
return np.sign(exps) * np.log10(exps).astype(int)
|
||||||
|
|
||||||
class VerboseOptimization(object):
|
class VerboseOptimization(object):
|
||||||
def __init__(self, model, maxiters, verbose=True, current_iteration=0, ipython_notebook=False):
|
def __init__(self, model, opt, maxiters, verbose=True, current_iteration=0, ipython_notebook=False):
|
||||||
self.verbose = verbose
|
self.verbose = verbose
|
||||||
if self.verbose:
|
if self.verbose:
|
||||||
self.model = model
|
self.model = model
|
||||||
|
|
@ -19,33 +20,68 @@ class VerboseOptimization(object):
|
||||||
self.p_iter = self.iteration
|
self.p_iter = self.iteration
|
||||||
self.maxiters = maxiters
|
self.maxiters = maxiters
|
||||||
self.len_maxiters = len(str(maxiters))
|
self.len_maxiters = len(str(maxiters))
|
||||||
|
self.opt_name = opt.opt_name
|
||||||
self.model.add_observer(self, self.print_status)
|
self.model.add_observer(self, self.print_status)
|
||||||
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
if self.ipython_notebook:
|
if self.ipython_notebook:
|
||||||
from IPython.display import display
|
from IPython.display import display
|
||||||
from IPython.html.widgets import IntProgressWidget, HTMLWidget
|
from IPython.html.widgets import FloatProgressWidget, HTMLWidget, ContainerWidget
|
||||||
self.text = HTMLWidget()
|
self.text = HTMLWidget()
|
||||||
display(self.text)
|
self.progress = FloatProgressWidget()
|
||||||
self.progress = IntProgressWidget()
|
self.model_show = HTMLWidget()
|
||||||
display(self.progress)
|
|
||||||
|
self.text.set_css('width', '100%')
|
||||||
|
#self.progress.set_css('width', '100%')
|
||||||
|
|
||||||
|
left_col = ContainerWidget(children = [self.progress, self.text])
|
||||||
|
right_col = ContainerWidget(children = [self.model_show])
|
||||||
|
hor_align = ContainerWidget(children = [left_col, right_col])
|
||||||
|
|
||||||
|
display(hor_align)
|
||||||
|
|
||||||
|
left_col.set_css({
|
||||||
|
'padding': '2px',
|
||||||
|
'width': "100%",
|
||||||
|
})
|
||||||
|
|
||||||
|
right_col.set_css({
|
||||||
|
'padding': '2px',
|
||||||
|
})
|
||||||
|
|
||||||
|
hor_align.set_css({
|
||||||
|
'width': "100%",
|
||||||
|
})
|
||||||
|
|
||||||
|
hor_align.remove_class('vbox')
|
||||||
|
hor_align.add_class('hbox')
|
||||||
|
|
||||||
|
left_col.add_class("box-flex1")
|
||||||
|
right_col.add_class('box-flex0')
|
||||||
|
|
||||||
|
#self.text.add_class('box-flex2')
|
||||||
|
#self.progress.add_class('box-flex1')
|
||||||
else:
|
else:
|
||||||
self.exps = exponents(self.fnow, self.current_gradient)
|
self.exps = exponents(self.fnow, self.current_gradient)
|
||||||
print ' {0:{mi}s} {1:11s} {2:11s}'.format("I", "F", "|g|", mi=self.len_maxiters)
|
print 'Running {} Code:'.format(self.opt_name)
|
||||||
|
print ' {3:5s} {0:{mi}s} {1:11s} {2:11s}'.format("i", "f", "|g|", "secs", mi=self.len_maxiters)
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
|
self.start = time.time()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def print_out(self):
|
def print_out(self):
|
||||||
if self.ipython_notebook:
|
if self.ipython_notebook:
|
||||||
names_vals = [['Iteration', "{:>0{l}}".format(self.iteration, l=self.len_maxiters)],
|
names_vals = [['optimizer', "{:s}".format(self.opt_name)],
|
||||||
['f', "{: > 05.3E}".format(self.fnow)],
|
['runtime [s]', "{:> g}".format(time.time()-self.start)],
|
||||||
['||Gradient||', "{: >+05.3E}".format(float(self.current_gradient))],
|
['evaluation', "{:>0{l}}".format(self.iteration, l=self.len_maxiters)],
|
||||||
|
['objective', "{: > 12.3E}".format(self.fnow)],
|
||||||
|
['||gradient||', "{: >+12.3E}".format(float(self.current_gradient))],
|
||||||
]
|
]
|
||||||
#message = "Lik:{:5.3E} Grad:{:5.3E} Lik:{:5.3E} Len:{!s}".format(float(m.log_likelihood()), np.einsum('i,i->', grads, grads), float(m.likelihood.variance), " ".join(["{:3.2E}".format(l) for l in m.kern.lengthscale.values]))
|
#message = "Lik:{:5.3E} Grad:{:5.3E} Lik:{:5.3E} Len:{!s}".format(float(m.log_likelihood()), np.einsum('i,i->', grads, grads), float(m.likelihood.variance), " ".join(["{:3.2E}".format(l) for l in m.kern.lengthscale.values]))
|
||||||
html_begin = """<style type="text/css">
|
html_begin = """<style type="text/css">
|
||||||
.tg-opt {font-family:"Courier New", Courier, monospace !important;padding:2px 3px;word-break:normal;border-collapse:collapse;border-spacing:0;border-color:#DCDCDC;margin:0px auto;}
|
.tg-opt {font-family:"Courier New", Courier, monospace !important;padding:2px 3px;word-break:normal;border-collapse:collapse;border-spacing:0;border-color:#DCDCDC;margin:0px auto;width:100%;}
|
||||||
.tg-opt td{font-family:"Courier New", Courier, monospace !important;font-weight:bold;color:#444;background-color:#F7FDFA;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
.tg-opt td{font-family:"Courier New", Courier, monospace !important;font-weight:bold;color:#444;background-color:#F7FDFA;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
||||||
.tg-opt th{font-family:"Courier New", Courier, monospace !important;font-weight:normal;color:#fff;background-color:#26ADE4;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
.tg-opt th{font-family:"Courier New", Courier, monospace !important;font-weight:normal;color:#fff;background-color:#26ADE4;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#DCDCDC;}
|
||||||
.tg-opt .tg-left{font-family:"Courier New", Courier, monospace !important;font-weight:normal;text-align:left;}
|
.tg-opt .tg-left{font-family:"Courier New", Courier, monospace !important;font-weight:normal;text-align:left;}
|
||||||
|
|
@ -61,6 +97,7 @@ class VerboseOptimization(object):
|
||||||
html_body += "</tr>"
|
html_body += "</tr>"
|
||||||
self.text.value = html_begin + html_body + html_end
|
self.text.value = html_begin + html_body + html_end
|
||||||
self.progress.value = 100*(self.iteration+1)/self.maxiters
|
self.progress.value = 100*(self.iteration+1)/self.maxiters
|
||||||
|
self.model_show.value = self.model._repr_html_()
|
||||||
else:
|
else:
|
||||||
n_exps = exponents(self.fnow, self.current_gradient)
|
n_exps = exponents(self.fnow, self.current_gradient)
|
||||||
if self.iteration - self.p_iter >= 20 * np.random.rand():
|
if self.iteration - self.p_iter >= 20 * np.random.rand():
|
||||||
|
|
@ -72,7 +109,7 @@ class VerboseOptimization(object):
|
||||||
if b:
|
if b:
|
||||||
self.exps = n_exps
|
self.exps = n_exps
|
||||||
print '\r',
|
print '\r',
|
||||||
print '{0:>0{mi}g} {1:> 12e} {2:> 12e}'.format(self.iteration, float(self.fnow), float(self.current_gradient), mi=self.len_maxiters), # print 'Iteration:', iteration, ' Objective:', fnow, ' Scale:', beta, '\r',
|
print '{3:> 6.2g} {0:>0{mi}g} {1:> 12e} {2:> 12e}'.format(self.iteration, float(self.fnow), float(self.current_gradient), time.time()-self.start, mi=self.len_maxiters), # print 'Iteration:', iteration, ' Objective:', fnow, ' Scale:', beta, '\r',
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
def print_status(self, me, which=None):
|
def print_status(self, me, which=None):
|
||||||
|
|
@ -94,3 +131,11 @@ class VerboseOptimization(object):
|
||||||
def __exit__(self, type, value, traceback):
|
def __exit__(self, type, value, traceback):
|
||||||
if self.verbose:
|
if self.verbose:
|
||||||
self.model.remove_observer(self)
|
self.model.remove_observer(self)
|
||||||
|
self.stop = time.time()
|
||||||
|
|
||||||
|
self.print_out()
|
||||||
|
|
||||||
|
if not self.ipython_notebook:
|
||||||
|
print
|
||||||
|
print 'Optimization finished in {0:.5g} Seconds'.format(self.stop-self.start)
|
||||||
|
print
|
||||||
Loading…
Add table
Add a link
Reference in a new issue