2017-10-09 3 views
1

私は一度にメモリに読み込むには大きすぎるcsvを持っていますので、それをまとめてケラスモデルに合わせたいと思います。私はfit_generator関数がどのように機能するのか誤解していると思いますが、StopIterationエラーが発生しても、エラーが発生します。chunksize & steps_per_epoch私のcsvに含まれる行の数が正しく記述されています。ケラスfit_generator with pandas iteratorオブジェクト

コード:

import pandas as pd 
import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, Dropout 

np.random.seed(26) 
x_train_generator = pd.read_csv('X_train.csv', header=None, chunksize=150000) 
y_train_generator = pd.read_csv('Y_train.csv', header=None, chunksize=150000) 
x_test_generator = pd.read_csv('X_test.csv', header=None, chunksize=50000) 
y_test_generator = pd.read_csv('Y_test.csv', header=None, chunksize=50000) 

model = Sequential() 
model.add(Dense(500, input_dim=1132, activation='tanh')) 
model.add(Dense(1, activation='sigmoid')) 

model.compile(loss='binary_crossentropy', metrics=['accuracy'], 
       optimizer='adam') 

model.fit_generator((x_train_generator.get_chunk().as_matrix(), 
        y_train_generator.get_chunk().as_matrix()), 
      steps_per_epoch=37, 
      epochs=1, 
      verbose=2, 
      validation_data=(x_test_generator.get_chunk().as_matrix(), 
          y_test_generator.get_chunk().as_matrix()), 
      validation_steps=37 
      ) 

エラー出力:

変なふう
Exception in thread Thread-107:                                            
Traceback (most recent call last):                                           
    File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner                                  
    self.run()                                                
    File "/usr/lib/python2.7/threading.py", line 754, in run                                     
    self.__target(*self.__args, **self.__kwargs) 
    File "/home/user/myenv/local/lib/python2.7/site-packages/keras/utils/data_utils.py", line 568, in data_generator_task 
    generator_output = next(self._generator) 
TypeError: tuple object is not an iterator 

--------------------------------------------------------------------------- 
StopIteration        Traceback (most recent call last) 
/home/user/tmp_keras.py in <module>() 
    22   verbose=2, 
    23   validation_data=(x_test_generator.get_chunk().as_matrix(), y_test_generator.get_chunk().as_matrix()), 
---> 24   validation_steps=37 
    25    ) 
    26 

/home/user/myenv/local/lib/python2.7/site-packages/keras/legacy/interfaces.pyc in wrapper(*args, **kwargs) 
    85     warnings.warn('Update your `' + object_name + 
    86        '` call to the Keras 2 API: ' + signature, stacklevel=2) 
---> 87    return func(*args, **kwargs) 
    88   wrapper._original_function = func 
    89   return wrapper 

/home/user/myenv/local/lib/python2.7/site-packages/keras/models.pyc in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_$ueue_size, workers, use_multiprocessing, initial_epoch) 
    1119           workers=workers, 
    1120           use_multiprocessing=use_multiprocessing, 
-> 1121           initial_epoch=initial_epoch) 
    1122 
    1123  @interfaces.legacy_generator_methods_support 

/home/user/myenv/local/lib/python2.7/site-packages/keras/legacy/interfaces.pyc in wrapper(*args, **kwargs) 
    85     warnings.warn('Update your `' + object_name + 
    86        '` call to the Keras 2 API: ' + signature, stacklevel=2) 
---> 87    return func(*args, **kwargs) 
    88   wrapper._original_function = func 
    89   return wrapper 

/home/user/myenv/local/lib/python2.7/site-packages/keras/engine/training.pyc in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weig 
ht, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch) 
    2009     batch_index = 0 
    2010     while steps_done < steps_per_epoch: 
-> 2011      generator_output = next(output_generator) 
    2012 
    2013      if not hasattr(generator_output, '__len__'): 

StopIteration: 

、私はそれを実行するために管理してwhile 1: try: ... except StopIteration:でfit_generator()をラップしている場合。

get_chunk().as_matrix()関数を使わないでfit_generator引数にx/y_train_generatorを使用しようとしましたが、kerasにnumpyの配列を渡していないので失敗します。

+0

「chunksize = 150000」は何をしていますか?あなたがそれを必要とするかどうかも知っていますか?あなたがそれを必要としているかどうかわからないなら、あなたはおそらくそうしないでしょう。 –

+0

データフレームの次の150000行を取得します。 csvは500万行以上で20 GBを超えるので、私が知る唯一の方法はチャンク化するか、 'iterator = True'を指定することです。 – user3555455

+0

イテレータオブジェクトを返しますが、それでもイテレータオブジェクトを反復処理する必要があります。 –

答えて

1

コメントで述べたように、あなたの問題は.as_matrix()方法は、あなたが起こるしたいものに呼び出され(とされていないものですイテレータを返す.get_chunk()パンダがいることである - あなたは.get_chunk()によって返されたイテレータはに変換したいですDataFrame 最初に、次に.as_matrix()と呼びます)。

コードを再構成するには、ループが必要です。ループ内でモデルを更新する必要があります。

  1. 簡単な)の再構造上のプログラム:あなたはそれを.as_matrix()を呼び出す前に、データフレームとしてパンダから各チャンクをループを持っている私はあなたのための2つの提案を持っています。この方法では、IOイテレータではなく、X_trainy_trainX_testy_testデータの具体的なDataFrameを実際に取得しています。新しいデータのチャンクを使用して、訓練されたモデルを更新することができます。 (既に訓練されたモデルを持っている、とあなたがもう一度.fit()を呼び出した場合、それは既存のモデルを更新します。)

  2. 代わりにパンダの機能のKeras機能を使用)内蔵の利用Kerasユーティリティ大規模なデータセットを読み取るため具体的にはHDF5Matrix (link to Keras documentation)というKerasユーティリティを使用して、HDF5ファイルからデータを読み込み、Numpyアレイとして透過的に扱います。このような何か:溶液#1と同様

    def load_data(path_todata, start_ix, n_samples): 
        """ 
        This works for loading testing or training data. 
        This assumes input data have been named "inputs", 
        output data have been named "outputs" in HDF5 file, 
        and that you are grabbing n_samples from the file. 
        """ 
        X = HDF5Matrix(path_to_training_data, 'inputs', start_ix, start_ix + n_samples) 
        y = HDF5Matrix(path_to_training_data, 'outputs', start_ix, start_ix + n_samples) 
        return (X,y) 
    
    X_train, y_train = load_data(path_to_training_h5, train_start_ix, n_training_samples) 
    X_test, y_test = load_data(path_to_testing_h5, testing_start_ix, n_testing_samples) 
    

が、これは(再フィッティング)各内モデルを更新することに加えて、各反復内start_ixn_samplesを更新forループ包括的な内に構成されることになります繰り返し。 HDF5Matrixを使用する方法の別の例は、Githubのユーザー@jfsantosのthis exampleを参照してください。

+0

ありがとう!両方の提案は、私に多くの仕事を提供します。 – user3555455