2016-08-06 29 views
6

câu hỏi này liên quan đến vấn đề chung về đào tạo trên nhiều tệp lớn trong Keras có kích thước quá lớn để vừa với bộ nhớ GPU. Tôi đang sử dụng Keras 1.0.5 và tôi muốn một giải pháp không yêu cầu 1.0.6. Một cách để làm điều này được mô tả bởi fchollet herehere:Máy ảnh: đào tạo hàng loạt cho nhiều bộ dữ liệu lớn

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

Tuy nhiên tôi lo ngại rằng tình trạng của mô hình không được lưu, đúng hơn là mô hình được reinitialized không chỉ giữa thời đại mà còn giữa các tập dữ liệu . Mỗi "Epoch 1/1" đại diện đào tạo trên một tập dữ liệu khác nhau dưới đây:

~~~~~ Epoch 0 ~~~~~~

Epoch 1/1 295806/295806 [===== =========================] - 13s - mất: 15.7517
Epoch 1/1 407890/407890 [======= =======================] - 19 giây - mất: 15.8036
Epoch 1/1 383188/383188 [========= =====================] - 19s - mất: 15.8130
~~~~~ Epoch 1 ~~~~~~

Epoch 1/1 295806/295806 [==============================] - 14 giây - mất: 15.7517
Epoch 1/1 407890/407890 [==============================] - 20 giây - mất: 15.8036
Epoch 1/1 383188/383188 [==============================] - 15 giây - mất: 15.8130

Tôi biết rằng người ta có thể sử dụng mô hình .fit_generator nhưng như các phương pháp trên đã được nhiều lần đề nghị như là một cách đào tạo hàng loạt tôi muốn biết những gì tôi đang làm sai.

Nhờ sự giúp đỡ của bạn,

Max

+0

Các bạn đã cố gắng để chạy thử nghiệm trên CPU theo lô nhỏ bằng cách phá vỡ các file lớn thành những phần nhỏ hơn? –

+2

khá chắc chắn bạn cần phải sử dụng fit_generator, xem https://keras.io/models/sequential/ – shell

+0

vết sưng, bất kỳ một? sử dụng fit_generator dường như không phải là cách ngắn nhất. – kulssaka

Trả lời

0

Nó đã được một thời gian kể từ khi tôi phải đối mặt với vấn đề đó, nhưng tôi nhớ rằng tôi đã sử dụng
Kera's functionality to provide data through Python generators, ví dụ: model = Sequential(); model.fit_generator(...).

Một đoạn mã mẫu mực (nên được tự giải thích)

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

Điều này sẽ được xử lý như thế nào nếu dữ liệu đào tạo nằm trong một tệp? Tôi có thể tải lên nhưng không thể tạo 3 lớp ngay cả do lỗi tài nguyên. – onaclov2000

+0

chỉ cần chia thành nhiều tệp, hoặc là không thể? – tenticon

+0

Hi @tenticon, tôi có một truy vấn với mã cuối cùng của bạn. Liệu nó đào tạo bởi mỗi lô num_epochs hoặc đào tạo tổng thể tất cả các lô trong một thời đại sau đó đi cho một thứ hai? –

Các vấn đề liên quan