Как рассчитать количество шагов, необходимых в model.predict_generator () - PullRequest
2 голосов
/ 01 ноября 2019

Итак, я пытаюсь выяснить проблему получения массива Numpy меньшей длины при запуске моей модели. У меня есть в общей сложности 2000 изображений, которые разделены на 2 категории по 1000 в каждой. Теперь, когда я передаю эти изображения через мою модель vgg16 для извлечения объектов, мне передаются только 1998 изображений. Ниже приведен мой код.

модель VGG16

def load_vgg16(weights_path='vgg16.h5'):
if K.image_data_format() == 'channels_first':
    inputShape = (3, 256, 256)
else:
    inputShape = (256, 256, 3)
model = Sequential()
model.add(ZeroPadding2D((1,1),input_shape = inputShape))
model.add(Convolution2D(64, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))

model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))

model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))

model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))

model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, (3, 3), activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, (3, 3), activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))

if weights_path:
    model.load_weights(weights_path, by_name= True)

return model

Извлечение функции с помощью функции узкого места:

def save_bottleneck_features(location):
batch_size = 16
datagen = ImageDataGenerator(rescale= 1./255)
model = load_vgg16()


generator = datagen.flow_from_directory(location+'/training-data/',
                                       target_size=(image_width, image_height),
                                       batch_size = 16,
                                       class_mode = None,
                                       shuffle = False)
bottleneck_features_train = model.predict_generator(
    generator, nb_training_samples / batch_size)
np.save(open(location+'/bottleneck_features_train.npy', 'wb'), bottleneck_features_train)    

# repeat with the validation data
generator = datagen.flow_from_directory(location+'/validation-data/',
                                       target_size=(image_width, image_height),
                                       batch_size=16,
                                       class_mode=None,
                                       shuffle=False)
bottleneck_features_validation = model.predict_generator(
    generator, nb_validation_samples / batch_size)
np.save(open(location+'/bottleneck_features_validation.npy', 'wb'), bottleneck_features_validation)

при выполнении вышеуказанных функций:

top_model_weights_path='/top_model_weights.h5'

location = 'newdata'
nb_epoch = 50

training_samples= [len(os.listdir('newdata/training-data'+'/'+i)) 
                   for i in sorted(os.listdir('newdata/training-data/'))]
nb_training_samples = sum(training_samples)

#Calucalating number of data prsent in the folders or damage and whole cars in validation folder
validation_samples = [len(os.listdir('newdata/validation-data/' + i)) 
                      for i in sorted(os.listdir('newdata/validation-data/'))]
nb_validation_samples = sum(validation_samples)

print(training_samples)
print(validation_samples)
save_bottleneck_features('newdata')

Поэтому, когда я запускаю приведенный выше код, я ожидаю, что общая длина массива bottleneck_features_train будет 2000, но я получаю только 1998. Точно так же общая длина bottleneck_features_validation приходит 1840, но я ожидаю получить 1840 (927 + 909). Вывод для training_samples и validation_samples приведен ниже.

[1000, 1000]
[927, 909]

Я думаю, что пропустил неверное количество шагов, требуемых в model.predict_generator(). Когда я пытаюсь маркировать эти изображения с помощью этого кода.

training_data = np.load(open(location+'/bottleneck_features_train.npy','rb'))
training_label = np.array([0] * training_samples[0] +
                          [1] * training_samples[1])

validation_data = np.load(open(location+'/bottleneck_features_validation.npy','rb'))
validation_label = np.array([0] * validation_samples[0] +
                           [1] * validation_samples[1])

и пытаюсь соответствовать модели, я получаю эту ошибку о данных обучения, и метки обучения n не имеют одинаковую длину.

Как я могу исправить эту проблему и начать подгонку моей модели? Спасибо за любую помощь. Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...