2017-12-15 6 views
1

Ich trainiere mein Netzwerk mit Keras auf Tensorflow-Backend (Keras Version 2.1), ich habe viele Dinge ausprobiert im Internet, fand aber keine Lösung.Keras: ResourceExhaustedError (siehe oben für Traceback): OOM beim Zuordnen von Tensor mit Shape [26671,32,32,64]

My Training set and labels: 26721(each image have size (32, 32,1)) , (26721, 10) 
Validation set and labels: 6680(each image have size(32,32,1), (6680,10) 

Dies ist mein bisheriges Modell, ich benutze Python3.

def CNN(input_, num_classes): 

model = Sequential() 

model.add(Convolution2D(16, kernel_size=(7, 7), border_mode='same', 
       input_shape=input_)) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2), strides=(1, 1) , border_mode='same')) 
model.add(Convolution2D(64, (3, 3), padding ='same')) 
model.add(BatchNormalization()) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(3, 3), strides=(1,1), border_mode='same')) 
model.add(Flatten()) 
model.add(Dense(96)) 
model.add(Activation('relu')) 

model.add(Dense(num_classes)) 
model.add(Activation('softmax')) 
return model 

model = CNN(image_size, num_classes) 

model.compile(loss=keras.losses.categorical_crossentropy, 
      optimizer=keras.optimizers.SGD(lr=0.01), 
      metrics=['accuracy']) 

print(model.summary()) 
csv_logger = CSVLogger('training.log') 
early_stop = EarlyStopping('val_acc', patience=200, verbose=1) 
model_checkpoint = ModelCheckpoint(model_save_path, 
            'val_acc', verbose=0, 
            save_best_only=True) 

model_callbacks = [early_stop, model_checkpoint, csv_logger] 
# print "len(train_dataset) ", len(train_dataset) 
print("int(len(train_dataset)/batch_size) ", int(len(train_dataset)/batch_size)) 
K.get_session().run(tf.global_variables_initializer()) 
model.fit_generator(train, 
       steps_per_epoch=np.ceil(len(train_dataset)/batch_size), 
       epochs=num_epochs, 
       verbose=1, 
       validation_data=valid, 
       validation_steps=batch_size, 
       callbacks=model_callbacks) 

Modell Zusammenfassung:

_________________________________________________________________ 
Layer (type)     Output Shape    Param # 
================================================================= 
conv2d_1 (Conv2D)   (None, 32, 32, 16)  800  
_________________________________________________________________ 
batch_normalization_1 (Batch (None, 32, 32, 16)  64   
_________________________________________________________________ 
activation_1 (Activation) (None, 32, 32, 16)  0   
_________________________________________________________________ 
max_pooling2d_1 (MaxPooling2 (None, 32, 32, 16)  0   
_________________________________________________________________ 
conv2d_2 (Conv2D)   (None, 32, 32, 64)  9280  
_________________________________________________________________ 
batch_normalization_2 (Batch (None, 32, 32, 64)  256  
_________________________________________________________________ 
activation_2 (Activation) (None, 32, 32, 64)  0   
_________________________________________________________________ 
max_pooling2d_2 (MaxPooling2 (None, 32, 32, 64)  0   
_________________________________________________________________ 
flatten_1 (Flatten)   (None, 65536)    0   
_________________________________________________________________ 
dense_1 (Dense)    (None, 96)    6291552 
_________________________________________________________________ 
activation_3 (Activation) (None, 96)    0   
_________________________________________________________________ 
dense_2 (Dense)    (None, 10)    970  
_________________________________________________________________ 
activation_4 (Activation) (None, 10)    0   
================================================================= 
Total params: 6,302,922 
Trainable params: 6,302,762 
Non-trainable params: 160 

Ich schicke Bilder nach Losgröße. Dies ist meine Generatorfunktion:

# Generate images according to batch size 


def gen(dataset, labels, batch_size): 

images = [] 
digits = [] 
i = 0 
while True: 
    images.append(dataset[i]) 
    digits.append(labels[i]) 
    i+=1 
    if i == batch_size: 
     yield (np.array(images), np.array(digits)) 
     images = [] 
     digits = [] 
    # Generate remaining images also 
    if i == len(dataset): 
     yield (np.array(images), np.array(digits)) 
     images, digits = [], [] 
     i = 0 

    train = gen(train_data, train_labels, batch_size) 
    valid = gen(valid_data, valid_lables, batch_size) 

Fehlerprotokoll auf Terminal:

diesen Link überprüfen Sie bitte für eine vollständigen Fehler: Terminal Output

Kann jemand bitte helfen Sie mir, was ich hier falsch mache?

Vielen Dank im Voraus

Antwort

0

Sie Ihr Netzwerk auf den gesamten Zugverband Ausbildung, die zu groß ist, in den Speicher zu passen, und zu groß für Ihre gpu.

Der Standard im maschinellen Lernen besteht darin, kleine Chargen Ihrer Daten zu erstellen und auf diesen zu trainieren. Chargengrößen sind normalerweise 16, 32, 64 oder eine andere Zweierpotenz, aber es kann alles sein, normalerweise müssen Sie die richtige Chargengröße durch Kreuzvalidierung finden.

+0

Ich sende im Batch von 100 Bildern, ich habe Gen-Funktion in der Post bearbeitet, ich benutze Generator, um Bilder an das Netzwerk zu senden. – Lucky

+1

Ihre Generatorfunktion ist fehlerhaft, da sie irgendwo einen Stapel von 26671 Bildern ergibt. Drucken Sie die Größe des Stapels bei jeder Iteration, um zu sehen, wo es schief geht. –

+0

Danke, dass es funktioniert hat. – Lucky

0

enter image description here

aus den Protokollen Sie können sehen, dass, bevor der Speicher voll ist die Zuweisung edge_1094_loss. Überprüfen Sie die Werte Limit ad InUse.

Dies ist vielleicht, weil der Speicher von älteren Modellen verbraucht wird. Schneller Hack, um dies zu lösen, ist einfach den Prozess zu töten. Dies wird den gesamten Speicher freigeben, der von älteren Modellen verbraucht wird, die irgendwie nicht Müll gesammelt werden.

Verwandte Themen