2016-08-06 20 views
6

この質問は、GPUメモリに合わせるには大きすぎるKerasの複数の大きなファイルのトレーニングに関する共通の問題に関するものです。 Keras 1.0.5を使用していますが、1.0.6を必要としないソリューションが必要です。これを行うための 一つの方法は、fchollet herehereで説明したKeras:複数の大規模データセットのバッチトレーニング

# Create generator that yields (current features X, current labels y) 
def BatchGenerator(files): 
    for file in files: 
     current_data = pickle.load(open("file", "rb")) 
     X_train = current_data[:,:-1] 
     y_train = current_data[:,-1] 
     yield (X_train, y_train) 

# train model on each dataset 
for epoch in range(n_epochs): 
    for (X_train, y_train) in BatchGenerator(files): 
     model.fit(X_train, y_train, batch_size = 32, nb_epoch = 1) 

しかし、私はモデルの状態は、モデルはエポックの間だけでなく、データセットの間だけでなく、再初期化されるということを、保存されていないことを恐れます。各 "エポック1/1" は、以下の異なるデータセットに関する研修を表し:エポック0 ~~~~~

~~~~~~

エポック1/1 295806分の295806 [===== ======================================================損失:15.7517
エポック1/1 407890/407890 [======= ========================================================================================================損失:15.8036
エポック1/1 383188/383188 [========= =====================] - 19秒 - 損失:15.8130
~~~~~~

エポック1/1 295806/295806 [==============] - 14秒 - 損失:15.7517
エポック1/1 407890/407890 [===============] - 20秒 - 損失:15.8036
エポック1/1 383188/383188 [===============] - 15秒 - 損失:15.8130

私はモデルを使用できることを知っています.fit_generatorですが、上記の方法がバッチトレーニングの方法として繰り返し提案されているので、私が間違っていることを知りたいと思います。私はその問題に直面していましたが、私は、私は、すなわちmodel = Sequential(); model.fit_generator(...)
Kera's functionality to provide data through Python generatorsを使用したことを覚えているので、あなたの助けを

おかげで、

マックス

+0

は、あなたが小さな塊にあなたの大きいファイルを壊すことによって、小さなバッチで、CPU上のあなたの実験を実行しようとしたことがありますか? –

+2

fit_generatorを使用する必要があることは確かです。https://keras.io/models/sequential/ – shell

+0

バンプ、いずれかを参照してください。 fit_generatorを使うことは最短の方法ではないようです。 – kulssaka

答えて

0

それはしばらくしています。

の典型的なコードスニペット(自明でなければなりません)

def generate_batches(files, batch_size): 
    counter = 0 
    while True: 
    fname = files[counter] 
    print(fname) 
    counter = (counter + 1) % len(files) 
    data_bundle = pickle.load(open(fname, "rb")) 
    X_train = data_bundle[0].astype(np.float32) 
    y_train = data_bundle[1].astype(np.float32) 
    y_train = y_train.flatten() 
    for cbatch in range(0, X_train.shape[0], batch_size): 
     yield (X_train[cbatch:(cbatch + batch_size),:,:], y_train[cbatch:(cbatch + batch_size)]) 

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

train_files = [train_bundle_loc + "bundle_" + cb.__str__() for cb in range(nb_train_bundles)] 
gen = generate_batches(files=train_files, batch_size=batch_size) 
history = model.fit_generator(gen, samples_per_epoch=samples_per_epoch, nb_epoch=num_epoch,verbose=1, class_weight=class_weights) 
+0

トレーニングデータが1つのファイル内にある場合、これはどのように処理されますか?私はそれを読み込むことができますが、リソースエラーのために3つのレイヤーを作ることはできません。 – onaclov2000

+0

これを複数のファイルに分割するか、それは不可能ですか? – tenticon

+0

こんにちは@tenticon、私はあなたの最後のコードでクエリを持っています。それは各バッチnum_epochsによって訓練するか、全体的に1エポックのすべてのバッチを訓練し、次に2番目のバグに行くか? –

関連する問題