मुझे नहीं लगता कि वहाँ GridSearchCV
के लिए एक "प्रति-रन" पैरामीटर पारित करने के लिए किसी भी तरह से है। हो सकता है कि आप जो चाहते हैं उसे करने के लिए शायद सबसे आसान तरीका KerasRegressor
को उपclass करना होगा।
class KerasRegressorTB(KerasRegressor):
def __init__(self, *args, **kwargs):
super(KerasRegressorTB, self).__init__(*args, **kwargs)
def fit(self, x, y, log_dir=None, **kwargs):
cbs = None
if log_dir is not None:
params = self.get_params()
conf = ",".join("{}={}".format(k, params[k])
for k in sorted(params))
conf_dir = os.path.join(log_dir, conf)
cbs = [TensorBoard(log_dir=conf_dir, histogram_freq=0,
write_graph=True, write_images=False)]
super(KerasRegressorTB, self).fit(x, y, callbacks=cbs, **kwargs)
आप इसे पसंद का प्रयोग करेंगे:
# ...
estimator = KerasRegressorTB(build_fn=create_3_layers_model,
input_dim=input_dim, output_dim=output_dim)
#...
grid = GridSearchCV(estimator=estimator, param_grid=param_grid,
n_jobs=1, scoring=bug_fix_score,
cv=2, verbose=0, fit_params={'log_dir': './Graph'})
grid_result = grid.fit(x.as_matrix(), y.as_matrix())
अद्यतन:
GridSearchCV
के बाद से पार सत्यापन की वजह से एक ही मॉडल (यानी मानकों का एक ही विन्यास) एक से अधिक बार चलाता है, पिछले कोड प्रत्येक रन में एकाधिक निशान डाल देगा। स्रोत (here और here) को देखते हुए, "वर्तमान विभाजन आईडी" को पुनर्प्राप्त करने का कोई तरीका प्रतीत नहीं होता है। साथ ही, आपको केवल मौजूदा फ़ोल्डरों की जांच नहीं करनी चाहिए और आवश्यकतानुसार सबफिक्सेस जोड़ना चाहिए, क्योंकि नौकरियां चलती हैं (संभावित रूप से कम से कम, हालांकि मुझे यकीन नहीं है कि यह समानांतर में केरास/टीएफ के मामले में है)।
import itertools
import os
class KerasRegressorTB(KerasRegressor):
def __init__(self, *args, **kwargs):
super(KerasRegressorTB, self).__init__(*args, **kwargs)
def fit(self, x, y, log_dir=None, **kwargs):
cbs = None
if log_dir is not None:
# Make sure the base log directory exists
try:
os.makedirs(log_dir)
except OSError:
pass
params = self.get_params()
conf = ",".join("{}={}".format(k, params[k])
for k in sorted(params))
conf_dir_base = os.path.join(log_dir, conf)
# Find a new directory to place the logs
for i in itertools.count():
try:
conf_dir = "{}_split-{}".format(conf_dir_base, i)
os.makedirs(conf_dir)
break
except OSError:
pass
cbs = [TensorBoard(log_dir=conf_dir, histogram_freq=0,
write_graph=True, write_images=False)]
super(KerasRegressorTB, self).fit(x, y, callbacks=cbs, **kwargs)
मैं अजगर 2 संगतता के लिए os
कॉल उपयोग कर रहा हूँ, लेकिन अगर आप अजगर 3 का उपयोग कर रहे आप पथ और निर्देशिका से निपटने के लिए अच्छे pathlib
module विचार कर सकते हैं: आप कुछ इस तरह की कोशिश कर सकते हैं।
नोट: मैं यह पहले उल्लेख करना भूल गया, लेकिन सिर्फ मामले में, ध्यान दें कि गुजर write_graph=True
रन प्रति एक ग्राफ प्रवेश करेंगे, जो, अपने मॉडल के आधार पर, बहुत कुछ इस स्थान की (अपेक्षाकृत बोल) हो सकता है। यह write_images
पर लागू होगा, हालांकि मुझे उस स्थान की जानकारी नहीं है जो सुविधा की आवश्यकता है।
विस्तृत सुझाव के लिए धन्यवाद। मैं इसे बाद में आजमाउंगा और मैं आपको बता दूंगा। सिर्फ एक विचार: क्या यह समाधान कई फ़ोल्डर्स बनाता है? उस स्थिति में क्या मैं एक ही टेंसरबोर्ड में सभी रन प्रदर्शित करने में सक्षम हूं या मुझे इसके कई उदाहरण चलाना है? – paolof89
@ paolof89 हां, यह प्रति प्रयोग एक निर्देशिका बनाता है, लेकिन, वास्तव में, "रन" जो आप टेंसरबोर्ड में देखते हैं वास्तव में केवल लॉग जानकारी के साथ सबफ़ोल्डर हैं। यदि आप लॉग की जड़ में उदाहरण के लिए टेंसरबोर्ड खोलते हैं (उदाहरण के लिए '।/ग्राफ़') में आप एक प्रयोग को "रन" देखेंगे, उनमें से सभी एक साथ, या आप एक विशिष्ट रन की निर्देशिका में टेंसरबोर्ड खोल सकते हैं करीब से देखो। – jdehesa
मैंने इसका परीक्षण किया, यह काम करता है लेकिन एक आखिरी मुद्दा है। ग्रिडशर्चसीवी एक के-फ़ोल्ड टेक्निकिक लागू करता है, इसलिए प्रत्येक फ़ोल्डर में आपको के ग्राफ मिलते हैं। न्यूनतम के-गुना मान 2 है इसलिए मेरी समस्या अभी तक हल नहीं हुई है। इसके बारे में कोई विचार? – paolof89