कम करें मेरे पास एक कंप्यूटर दृष्टि एल्गोरिदम है जिसे मैं scipy.optimize.minimize का उपयोग करके ट्यून करना चाहता हूं। अभी मैं केवल दो मानकों को ट्यून करना चाहता हूं लेकिन पैरामीटर की संख्या अंततः बढ़ सकती है इसलिए मैं ऐसी तकनीक का उपयोग करना चाहूंगा जो उच्च-आयामी ढाल खोजों को कर सके। SciPy में नेल्डर-मीड कार्यान्वयन एक अच्छा फिट लग रहा था।scipy अनुकूलन में पूर्ण चरण आकार
मुझे कोड सेट अप मिला है लेकिन ऐसा लगता है कि न्यूनतम कार्य वास्तव में एक चरण आकार के साथ फ़्लोटिंग पॉइंट मानों का उपयोग करना चाहता है जो कि एक से कम है। पैरामीटर का वर्तमान सेट दोनों पूर्णांक हैं और उनमें से एक का एक चरण आकार है एक और दूसरे के पास दो का एक चरण आकार होता है (यानी मान अजीब होना चाहिए, अगर यह वह चीज़ नहीं है जिसे मैं अनुकूलित करने की कोशिश कर रहा हूं तो इसे एक विषम संख्या में परिवर्तित कर देगा)। लगभग एक पैरामीटर एक विंडो आकार पिक्सेल में है और दूसरा पैरामीटर एक थ्रेसहोल्ड (0-255 से एक मान है)।
इसके लायक होने के लिए मैं गिट रेपो से एक नए निर्माण का उपयोग कर रहा हूं। क्या किसी को पता है कि प्रत्येक पैरामीटर के लिए एक विशिष्ट चरण आकार का उपयोग करने के लिए कैसे कहा जाए? क्या कोई तरीका है कि मैं अपना खुद का ढाल कार्य कर सकता हूं? क्या कोई झुका हुआ ध्वज है जो मेरी मदद कर सकता है? मुझे पता है कि यह एक साधारण पैरामीटर स्वीप के साथ किया जा सकता है, लेकिन अंततः मैं इस कोड को पैरामीटर के बहुत बड़े सेट पर लागू करना चाहता हूं।
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*
चला जाता है, वह SciPy के Nelder-मीड विधि सिंप्लेक्स रैखिक प्रोग्रामिंग एल्गोरिथ्म का उपयोग करता। यह फ़ंक्शन को अनुकूलित करने के लिए गैर-अभिन्न बिंदु/चरण आकारों का उपयोग करने पर निर्भर करता है।मैं सामान्य रूप से SciPy से परिचित नहीं हूं, इसलिए ऐसा करने के लिए कॉन्फ़िगरेशन विकल्प हो सकता है जो आप चाहते हैं। आप पूर्णांक प्रोग्रामिंग (http://en.wikipedia.org/wiki/Integer_programming) में भी देखना चाहते हैं, जैसा कि आप पूरा करने की कोशिश कर रहे हैं। –
@EricG वास्तव में मुझे लगता है कि सिर्फ एक नाम मिश्रण है, Nelder-Mead "Simplex" एक Simplex की ज्यामितीय संरचना के साथ काम करता है। रैखिक प्रोग्रामिंग से सिंपलक्स एल्गोरिदम के साथ इसका कोई लेना-देना नहीं है, और यह वैसे भी nonlinear अनुकूलन है। – seberg
इस तरह के मुद्दों के कारण, एमएल एल्गोरिदम के लिए पैरामीटर ट्यूनिंग आमतौर पर केवल एक ग्रिड खोज (आमतौर पर लॉगरिदमिक ग्रिड पर, लेकिन आपके पैरामीटर के लिए आवश्यक नहीं है) के साथ किया जाता है। आप पहले एक अच्छे क्षेत्र को खोजने के लिए एक मोटे ग्रिड खोज कर सकते हैं और फिर उस क्षेत्र में एक बेहतर अनाज वाली ग्रिड खोज कर सकते हैं। – Dougal