2017-08-02 20 views
5

के लिए केरास टेंसरबोर्ड कॉलबैक का उपयोग कैसे करें मैं केरास टेंसरबोर्ड कॉलबैक का उपयोग कर रहा हूं। मैं एक ग्रिड खोज चलाने और टेंसर बोर्ड में प्रत्येक एकल मॉडल के परिणामों को देखने के लिए चाहता हूं। समस्या यह है कि अलग रन के सभी परिणाम एक साथ विलय कर रहे हैं और नुकसान साजिश इस तरह एक गड़बड़ है: enter image description hereग्रिड खोज

मैं प्रत्येक रन का नामकरण करूं इस के समान कुछ है रहे हैं: enter image description here

यहाँ ग्रिड खोज की कोड:

df = pd.read_csv('data/prepared_example.csv') 

df = time_series.create_index(df, datetime_index='DATE', other_index_list=['ITEM', 'AREA']) 

target = ['D'] 
attributes = ['S', 'C', 'D-10','D-9', 'D-8', 'D-7', 'D-6', 'D-5', 'D-4', 
     'D-3', 'D-2', 'D-1'] 

input_dim = len(attributes) 
output_dim = len(target) 

x = df[attributes] 
y = df[target] 

param_grid = {'epochs': [10, 20, 50], 
       'batch_size': [10], 
       'neurons': [[10, 10, 10]], 
       'dropout': [[0.0, 0.0], [0.2, 0.2]], 
       'lr': [0.1]} 

estimator = KerasRegressor(build_fn=create_3_layers_model, 
          input_dim=input_dim, output_dim=output_dim) 


tbCallBack = TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=False) 

grid = GridSearchCV(estimator=estimator, param_grid=param_grid, n_jobs=-1, scoring=bug_fix_score, 
          cv=3, verbose=0, fit_params={'callbacks': [tbCallBack]}) 

grid_result = grid.fit(x.as_matrix(), y.as_matrix()) 

उत्तर

2

मुझे नहीं लगता कि वहाँ 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 पर लागू होगा, हालांकि मुझे उस स्थान की जानकारी नहीं है जो सुविधा की आवश्यकता है।

+0

विस्तृत सुझाव के लिए धन्यवाद। मैं इसे बाद में आजमाउंगा और मैं आपको बता दूंगा। सिर्फ एक विचार: क्या यह समाधान कई फ़ोल्डर्स बनाता है? उस स्थिति में क्या मैं एक ही टेंसरबोर्ड में सभी रन प्रदर्शित करने में सक्षम हूं या मुझे इसके कई उदाहरण चलाना है? – paolof89

+1

@ paolof89 हां, यह प्रति प्रयोग एक निर्देशिका बनाता है, लेकिन, वास्तव में, "रन" जो आप टेंसरबोर्ड में देखते हैं वास्तव में केवल लॉग जानकारी के साथ सबफ़ोल्डर हैं। यदि आप लॉग की जड़ में उदाहरण के लिए टेंसरबोर्ड खोलते हैं (उदाहरण के लिए '।/ग्राफ़') में आप एक प्रयोग को "रन" देखेंगे, उनमें से सभी एक साथ, या आप एक विशिष्ट रन की निर्देशिका में टेंसरबोर्ड खोल सकते हैं करीब से देखो। – jdehesa

+0

मैंने इसका परीक्षण किया, यह काम करता है लेकिन एक आखिरी मुद्दा है। ग्रिडशर्चसीवी एक के-फ़ोल्ड टेक्निकिक लागू करता है, इसलिए प्रत्येक फ़ोल्डर में आपको के ग्राफ मिलते हैं। न्यूनतम के-गुना मान 2 है इसलिए मेरी समस्या अभी तक हल नहीं हुई है। इसके बारे में कोई विचार? – paolof89