2017-06-29 5 views
0

implementiert I einen Generator den Trainingsprozess zuzuführen, aber fit_generator wirft diesen Fehler:model.fit_generator: Fehler bei der Prüfung target: erwartete lambda_2 4 Dimensionen haben, bekam aber Array mit Form (200, 1)

Error when checking target: expected lambda_2 to have 4 dimensions, but got array with shape (200, 1)

Es scheint, dass die Funktion X und y an einem bestimmten Punkt wechselt, weil (200,1) ist "y" Form, nicht "X" Form.

Wenn ich den Generator mit dem Code zu testen unten, es funktioniert:

for i in range(32):  
    train = next(train_generator) 
    print(train[0].shape) 

Aber mit dem fit_generator ein Fehler ausgelöst wird.

Dies ist mein Code:

import os 
import csv 

samples = [] 
with open('data/driving_log.csv') as csvfile: 
    reader = csv.reader(csvfile) 
    for line in reader: 
     samples.append(line) 

from sklearn.model_selection import train_test_split 
train_samples, validation_samples = train_test_split(samples, test_size=0.2) 

import cv2 
import numpy as np 
import sklearn 

def generator(samples, batch_size=32): 
    num_samples = len(samples) 
    while 1: # Loop forever so the generator never terminates 
     sklearn.utils.shuffle(samples) 
     for offset in range(0, num_samples, batch_size): 
      batch_samples = samples[offset:offset+batch_size] 

      images = [] 
      angles = [] 
      for batch_sample in batch_samples: 
       name = 'data\\'+batch_sample[0].split('\\')[-1] 
       center_image = cv2.imread(name) 
       center_angle = float(batch_sample[3]) 

       if not center_image is None: 
        images.append(center_image) 
        angles.append(center_angle) 



      # trim image to only see section with road 
      X_train = np.array(images) 
      y_train = np.array(angles) 

      yield sklearn.utils.shuffle(X_train, y_train) 

# compile and train the model using the generator function 
train_generator = generator(train_samples, batch_size=int(len(train_samples)/32)) 
validation_generator = generator(validation_samples, batch_size=int(len(validation_samples)/32)) 

ch, row, col = 3, 160, 320 # Trimmed image format 

from keras.models import Sequential 
from keras.layers import Lambda 


model = Sequential() 
# Preprocess incoming data, centered around zero with small standard deviation 
model.add(Lambda(lambda x: x/127.5 - 1., 
     input_shape=(row, col, ch), 
     output_shape=(row, col, ch))) 
#model.add(... finish defining the rest of your model architecture here ...) 

model.compile(loss='mse', optimizer='adam') 

model.fit_generator(train_generator, 
        steps_per_epoch=len(train_samples)/32, validation_data=validation_generator, 
        validation_steps=len(validation_samples)/32, epochs=3) 

Irgendwelche Ideen, wie ich dieses Problem lösen kann?

+0

Ihre letzte Ebene muss dieselbe Form wie Y ausgeben. –

Antwort

0

Das war ein Fehler beim Laden von Bildern, der Name wurde nicht korrekt definiert. Da cv2.imread(name) keinen Fehler verursacht, wenn das Image nicht gefunden wird und nur ein None-Objekt zurückgegeben wird, gibt die Methode eine leere Variable zurück, die den Fehler im Netzwerk verursacht.

Verwandte Themen