2016-06-03 16 views
8

मैं केरास मॉडल के लिए एक विशाल स्पैर मैट्रिक्स को खिलाने की कोशिश कर रहा हूं। चूंकि डेटासेट रैम में फिट नहीं होता है, इसलिए जेनरेटर द्वारा बैच-बाय-बैच उत्पन्न डेटा पर मॉडल को प्रशिक्षित करना है।केरास, स्पैस मैट्रिक्स समस्या

इस दृष्टिकोण का परीक्षण करने और सुनिश्चित करने के लिए कि मेरा समाधान ठीक काम करता है, मैंने थोड़ा Kera`s simple MLP on the Reuters newswire topic classification task संशोधित किया। तो, विचार मूल और संपादित मॉडल की तुलना करना है। मैं सिर्फ numpy.ndarray को scipy.sparse.csr.csr_matrix में परिवर्तित करता हूं और इसे मॉडल में खिलाता हूं।

लेकिन मेरा मॉडल किसी बिंदु पर दुर्घटनाग्रस्त हो जाता है और मुझे एक कारण जानने के लिए हाथ की आवश्यकता होती है।

यहाँ मूल मॉडल और नीचे

from __future__ import print_function 
import numpy as np 
np.random.seed(1337) # for reproducibility 

from keras.datasets import reuters 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.utils import np_utils 
from keras.preprocessing.text import Tokenizer 

max_words = 1000 
batch_size = 32 
nb_epoch = 5 

print('Loading data...') 
(X_train, y_train), (X_test, y_test) = reuters.load_data(nb_words=max_words, test_split=0.2) 
print(len(X_train), 'train sequences') 
print(len(X_test), 'test sequences') 

nb_classes = np.max(y_train)+1 
print(nb_classes, 'classes') 

print('Vectorizing sequence data...') 
tokenizer = Tokenizer(nb_words=max_words) 
X_train = tokenizer.sequences_to_matrix(X_train, mode='binary') 
X_test = tokenizer.sequences_to_matrix(X_test, mode='binary') 
print('X_train shape:', X_train.shape) 
print('X_test shape:', X_test.shape) 

print('Convert class vector to binary class matrix (for use with categorical_crossentropy)') 
Y_train = np_utils.to_categorical(y_train, nb_classes) 
Y_test = np_utils.to_categorical(y_test, nb_classes) 
print('Y_train shape:', Y_train.shape) 
print('Y_test shape:', Y_test.shape) 


print('Building model...') 
model = Sequential() 
model.add(Dense(512, input_shape=(max_words,))) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(nb_classes)) 
model.add(Activation('softmax')) 

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

history = model.fit(X_train, Y_train, 
       nb_epoch=nb_epoch, batch_size=batch_size, 
       verbose=1)#, validation_split=0.1) 
#score = model.evaluate(X_test, Y_test, 
#      batch_size=batch_size, verbose=1) 
print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 

मेरी अतिरिक्त यह आउटपुट है:

Loading data... 
8982 train sequences 
2246 test sequences 
46 classes 
Vectorizing sequence data... 
X_train shape: (8982, 1000) 
X_test shape: (2246, 1000) 
Convert class vector to binary class matrix (for use with categorical_crossentropy) 
Y_train shape: (8982, 46) 
Y_test shape: (2246, 46) 
Building model... 
Epoch 1/5 
8982/8982 [==============================] - 5s - loss: 1.3932 - acc: 0.6906  
Epoch 2/5 
8982/8982 [==============================] - 4s - loss: 0.7522 - acc: 0.8234  
Epoch 3/5 
8982/8982 [==============================] - 5s - loss: 0.5407 - acc: 0.8681  
Epoch 4/5 
8982/8982 [==============================] - 5s - loss: 0.4160 - acc: 0.8980  
Epoch 5/5 
8982/8982 [==============================] - 5s - loss: 0.3338 - acc: 0.9136  
Test score: 1.01453569163 
Test accuracy: 0.797417631398 
अंत में

, यहाँ मेरी हिस्सा

X_train_sparse = sparse.csr_matrix(X_train) 

def batch_generator(X, y, batch_size): 
    n_batches_for_epoch = X.shape[0]//batch_size 
    for i in range(n_batches_for_epoch): 
     index_batch = range(X.shape[0])[batch_size*i:batch_size*(i+1)]  
     X_batch = X[index_batch,:].todense() 
     y_batch = y[index_batch,:] 
     yield(np.array(X_batch),y_batch) 

model.fit_generator(generator=batch_generator(X_train_sparse, Y_train, batch_size), 
        nb_epoch=nb_epoch, 
        samples_per_epoch=X_train_sparse.shape[0]) 

है दुर्घटना:

Exception         Traceback (most recent call last) 
<ipython-input-120-6722a4f77425> in <module>() 
     1 model.fit_generator(generator=batch_generator(X_trainSparse, Y_train, batch_size), 
     2      nb_epoch=nb_epoch, 
----> 3      samples_per_epoch=X_trainSparse.shape[0]) 

/home/kk/miniconda2/envs/tensorflow/lib/python2.7/site-packages/keras/models.pyc in fit_generator(self, generator, samples_per_epoch, nb_epoch, verbose, callbacks, validation_data, nb_val_samples, class_weight, max_q_size, **kwargs) 
    648           nb_val_samples=nb_val_samples, 
    649           class_weight=class_weight, 
--> 650           max_q_size=max_q_size) 
    651 
    652  def evaluate_generator(self, generator, val_samples, max_q_size=10, **kwargs): 

/home/kk/miniconda2/envs/tensorflow/lib/python2.7/site-packages/keras/engine/training.pyc in fit_generator(self, generator, samples_per_epoch, nb_epoch, verbose, callbacks, validation_data, nb_val_samples, class_weight, max_q_size) 
    1356      raise Exception('output of generator should be a tuple ' 
    1357          '(x, y, sample_weight) ' 
-> 1358          'or (x, y). Found: ' + str(generator_output)) 
    1359     if len(generator_output) == 2: 
    1360      x, y = generator_output 

Exception: output of generator should be a tuple (x, y, sample_weight) or (x, y). Found: None 
012,

मुझे विश्वास है कि समस्या samples_per_epoch के गलत सेटअप के कारण है। अगर कोई इस पर टिप्पणी कर सकता है तो मैं सराहना करता हूं।

+0

त्रुटि आपको बताता है कि क्या गलत है संशोधित करने के लिए बहुत आसान है API जैसे scikit सीखने का समर्थन करता है। बैच जनरेटर कुछ भी आउटपुट नहीं कर रहा है। और सामान्य सेटअप भी मेरे लिए सही नहीं लग रहा है। मैं थोड़ी देर 1 लूप की अपेक्षा करता हूं ताकि जनरेटर को अनंत काल कहा जा सके। आपके दृष्टिकोण के साथ जनरेटर कुछ समय खाली होगा। और एक और बात: जब आप इसे समाप्त करते हैं, तो आप परेशानी में पड़ रहे हैं क्योंकि आपका जनरेटर थ्रेड-सुरक्षित नहीं है। उस पर मदद के लिए केयर मुद्दों में देखो! – sascha

+0

हां, यह स्पष्ट है कि बैच_जेनरेटर कोई भी आउटपुट नहीं करता है, लेकिन ऐसा क्यों होता है ... शायद, मुझे कुछ याद आ रहा है लेकिन यह एक अनंत लूप क्यों होना चाहिए? मेरी समझ के अनुसार, लूप को तब तक रोक दिया जाना चाहिए जब तक यह लगभग सभी नमूनों (जो एक युग का अंत है) के माध्यम से चला गया। यही कारण है कि मैं "I में रेंज (n_batches_for_epoch)" का उपयोग करता हूं। असल में, n_batches_for_epoch पुनरावृत्तियों की संख्या है। – Kirk

+0

@ किर्क मैं जो भी मानता हूं वह वही सटीक मुद्दा मानता है। क्या आपको अपना हल करने का कोई तरीका मिला? – BigBoy1337

उत्तर

7

मेरा समाधान यहां है।

def batch_generator(X, y, batch_size): 
    number_of_batches = samples_per_epoch/batch_size 
    counter=0 
    shuffle_index = np.arange(np.shape(y)[0]) 
    np.random.shuffle(shuffle_index) 
    X = X[shuffle_index, :] 
    y = y[shuffle_index] 
    while 1: 
     index_batch = shuffle_index[batch_size*counter:batch_size*(counter+1)] 
     X_batch = X[index_batch,:].todense() 
     y_batch = y[index_batch] 
     counter += 1 
     yield(np.array(X_batch),y_batch) 
     if (counter < number_of_batches): 
      np.random.shuffle(shuffle_index) 
      counter=0 

मेरे मामले में, एक्स - स्पैस मैट्रिक्स, वाई-सरणी।

+2

यह मेरे लिए काम करता है, वास्तव में मेरा स्पैर मैट्रिक्स रैम में फिट बैठता है, लेकिन इसे घने में बदलने के लिए कोई जगह नहीं है। तो, टोडेंस() जनरेटर फ़ंक्शन के भीतर रखा जाता है। – Kirk

+0

मुझे विश्वास है कि चेक 'अगर काउंटर> = number_of_batches होना चाहिए: ' – daoudc

1

आप Lasagne Keras के बजाय मैं निम्न सुविधाओं के साथ a small MLP class लिखा है का उपयोग कर सकते हैं:

का समर्थन करता है दोनों घने और विरल मैट्रिक्स

समर्थन ड्रॉप आउट और छिपी परत

पूरा संभावना का समर्थन करता है एक गर्म लेबल के बजाय वितरण मल्टीलाबेल प्रशिक्षण का समर्थन करता है।

(फिट, भविष्यवाणी, शुद्धता, आदि)

कॉन्फ़िगर और

संबंधित मुद्दे