2017-02-22 41 views
1

Я пытаюсь использовать keras model.fit_generator() для соответствия модели, ниже мое определение генератора:keras model fit_generator ValueError: ошибка при проверке цели модели: ожидается, что cropping2d_4 имеет 4 измерения, но получил массив с формой (32, 1)

from sklearn.utils import shuffle 
IMG_PATH_PREFIX = "./data/IMG/" 
def generator(samples, batch_size=64): 
    num_samples = len(samples) 
    while 1: # Loop forever so the generator never terminates 
     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 = IMG_PATH_PREFIX + batch_sample[0].split('/')[-1] 

       center_image = cv2.imread(name) 
       center_angle = float(batch_sample[3])     

       images.append(center_image) 
       angles.append(center_angle) 

     X_train = np.array(images) 
     y_train = np.array(angles) 

     #X_train = np.expand_dims(X_train, axis=0) 
     #y_train = np.expand_dims(y_train, axis=1) 
     print("X_train shape: ", X_train.shape, " y_train shape:", y_train.shape) 
     #print("X train: ", X_train) 
     yield X_train, y_train 

train_generator = generator(train_samples, batch_size = 32) 
validation_generator = generator(validation_samples, batch_size = 32) 

Здесь форма выхода: X_train формы: (32, 160, 320, 3) y_train форма: (32)

модель подходит код:

model = Sequential() 
#cropping layer 
model.add(Cropping2D(cropping=((50,20), (1,1)), input_shape=(160,320,3), dim_ordering='tf')) 
model.compile(loss = "mse", optimizer="adam") 
model.fit_generator(train_generator, samples_per_epoch= len(train_samples), validation_data=validation_generator, nb_val_samples=len(validation_samples), nb_epoch=3) 

Тогда я получаю сообщение об ошибке:

ValueError: Ошибка при проверке целевой модели: ожидается cropping2d_6 иметь 4 измерения, но есть массив с формой (32, 1)

Может кто-нибудь помочь, дайте мне знать, что этот вопрос ?

ответ

1

Большой вопрос: знаете ли вы, что вы пытаетесь сделать?

1) Если вы читаете here, вход представляет собой 4D-тензор, а выход ТАКЖЕ 4D-тензор. Ваша цель - 2D тензор формы (batch_size, 1). Поэтому, конечно, когда keras пытается вычислить ошибку между выходом, который имеет 3D (без размерности партии) и целевой, который имеет 1D (без размерности партии), из этого не может быть смысла. Выходы и цели должны иметь одинаковые размеры.

2) Знаете ли вы, что делает cropping2D на самом деле? Он обрезает ваши изображения ... Таким образом, удаление значений в начале и конце размеров обрезки. В вашем случае вы выводите изображения формы (90, 218, 3). Это не предсказание, нет веса тренироваться на этом слое, поэтому нет причин поместиться в «модель». Ваша модель просто обрезает изображения. Для этого не требуется никакого обучения.

 Смежные вопросы

  • Нет связанных вопросов^_^