У меня есть алгоритм компьютерного зрения, который я хочу настроить с помощью scipy.optimize.minimize. Прямо сейчас я хочу только настроить два параметра, но количество параметров может в конечном итоге расти, поэтому я хотел бы использовать технику, которая может выполнять поиски градиентов высокого уровня. Реализация Nelder-Mead в SciPy показалась хорошей подгонкой.
Я получил весь код, но кажется, что функция минимизации действительно хочет использовать значения с плавающей запятой с размером шага, который меньше единицы. Текущий набор параметров - это целые числа и один размер шага один а второй имеет размер шага два (то есть значение должно быть нечетным, если это не то, что я пытаюсь оптимизировать, преобразует его в нечетное число). Примерно один параметр - размер окна в пикселях, а другой параметр - порог (значение от 0 до 255).
Для чего я использую новую сборку scipy из репозитория git. Кто-нибудь знает, как сказать scipy использовать определенный размер шага для каждого параметра? Есть ли способ катить мою функцию градиента? Есть ли scipy флаг, который мог бы помочь мне? Я знаю, что это можно сделать с помощью простой развертки параметров, но в конечном итоге я бы хотел применить этот код к гораздо большим наборам параметров.
Сам код мертв просто:
import numpy as np
from scipy.optimize import minimize
from ScannerUtil import straightenImg
import bson
def doSingleIteration(parameters):
# do some machine vision magic
# return the difference between my value and the truth value
parameters = np.array([11,10])
res = minimize( doSingleIteration, parameters, method='Nelder-Mead',options={'xtol': 1e-2, 'disp': True,'ftol':1.0,}) #not sure if these params do anything
print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
print res
Вот как выглядит мой вывод. Как вы можете видеть, мы повторяем много прогонов и не получаем нигде в минимизации.
*+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.] <-- Output from scipy minimize
{'block_size': 11, 'degree': 10} <-- input to my algorithm rounded and made int
+++++++++++++++++++++++++++++++++++++++++
120 <-- output of the function I am trying to minimize
+++++++++++++++++++++++++++++++++++++++++
[ 11.55 10. ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.5]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.55 9.5 ]
{'block_size': 11, 'degree': 9}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.1375 10.25 ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.275 10. ]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.25]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
[ 11.275 9.75 ]
{'block_size': 11, 'degree': 9}
+++++++++++++++++++++++++++++++++++++++++
120
+++++++++++++++++++++++++++++++++++++++++
~~~
SNIP
~~~
+++++++++++++++++++++++++++++++++++++++++
[ 11. 10.0078125]
{'block_size': 11, 'degree': 10}
+++++++++++++++++++++++++++++++++++++++++
120
Optimization terminated successfully.
Current function value: 120.000000
Iterations: 7
Function evaluations: 27
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
status: 0
nfev: 27
success: True
fun: 120.0
x: array([ 11., 10.])
message: 'Optimization terminated successfully.'
nit: 7*