2017-08-02 44 views
5

Ben Keras TensorBoard geri arama kullanıyorum için Keras TensorBoard geri arama nasıl kullanılacağı. Bir ızgara araştırması yapmak ve her bir modelin sonuçlarını tensör panosunda görselleştirmek istiyorum. sorun farklı çalışan tüm sonuçlar birleştirilmiş olmasıdır zarar arsa böyle bir karmaşa: Burada enter image description hereızgara arama

: Ben buna benzer bir şey var her koşmak adlandırabilirsiniz nasıl enter image description here

Izgara arama kodu: Ben GridSearchCV bir "başına run" parametresine izin için herhangi bir yolu yoktur sanmıyorum

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()) 

cevap

2

. Belki de en kolay yaklaşım, istediğiniz şeyi yapmak için KerasRegressor'u alt sınıflara koymak olabilir.

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) 

Sen gibi kullanırsınız:

# ... 

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()) 

Güncelleme: GridSearchCV yana

nedeniyle çapraz doğrulama için aynı modeli (parametrelerin yani aynı yapılandırma) defadan fazla çalışır, Önceki kod, her bir işlemde birden fazla iz bırakacaktır. Kaynağa bakarak (here ve here), "geçerli bölünmüş kimlik" almanın bir yolu yok gibi görünüyor. Aynı zamanda, sadece mevcut klasörleri kontrol etmemeli ve gerektiğinde ekleri eklememelisiniz, çünkü işler (potansiyel olarak en azından Keras/TF'de böyle bir durum olup olmadığından emin olmamakla birlikte). Ben Python 2 uyumluluk için os çağrılarını kullanıyorum

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) 

ancak Python 3 kullanıyorsanız, yolu ve dizin işleme için pathlib module güzel düşünebilirsiniz: Böyle bir şey deneyebilirsiniz.

Not: Daha önce söylemeyi unuttum ama her ihtimale karşı, write_graph=True geçen modele bağlı olarak, bir çok bu alanın (göreceli olarak) anlamına gelebilir ki, kaçak başına bir grafik log unutmayın. Aynı özellik gerektiren alanı bilmeme rağmen, write_images için de geçerlidir.

+0

Detaylı öneri için teşekkür ederiz. Daha sonra bugün deneyeceğim ve size bildireceğim. Sadece bir konu: Bu çözüm birkaç klasör oluşturuyor mu? Bu durumda tüm koşuları tek bir turada gösterebiliyorum ya da birkaç örneğini yürütmek zorunda mıyım? – paolof89

+1

@ paolof89 Evet, deneme başına bir dizin oluşturuyor, ancak aslında TensorBoard'da gördüğünüz "Çalışır" gerçekten log bilgisine sahip alt klasörlerdir. Eğer TensorBoard'u logların kökünde açarsanız (örnekte./Graph'), deney başına bir "run", hepsini bir arada görürsünüz veya TensorBoard'u belirli bir koşunun dizinine açabilirsiniz. yakından bakmak. – jdehesa

+0

Test ettim, işe yarıyor ama son bir sorun var. GridSearchCV bir k-kat tekniğini uygular, böylece her klasörde k grafiği bulunur. Minimum k katlama değeri 2, bu yüzden benim problemim henüz çözülmedi. Bunun hakkında bir fikrin var mı? – paolof89