Keras ImageDataGenerator Предсказывает Больше, Чем Набор Прогнозов

#python #tensorflow #machine-learning #keras #conv-neural-network

Вопрос:

Я пытаюсь создать модель CNN, которая классифицирует американский язык жестов. Я уже создал и обучил свою модель. Теперь я пытаюсь предсказать занятия. Мой набор прогнозов содержит 7250 немаркированных изображений, однако, когда я делаю прогноз, модель выполняет 587250 прогнозов, в то время как мне нужно, чтобы она делала 7250 прогнозов. Я предоставляю код ниже. В чем причина этого? Я делаю что-то не так?

Кодовый блок 1:

 predict_set = data.flow_from_directory('/content/gdrive/MyDrive/test_data/')
 

Результат 1:

 Found 7250 images belonging to 1 classes.
 

Кодовый блок 2:

 import numpy as np
predictions = model.predict_classes(predict_set)
print(len(predictions),"n", predictions)
 

Результат 2:

 587250 
[27 27 27 ... 27  6 12]
 

Редактировать:

Модель CNN:

 model = Sequential()

# First Layer
model.add(Conv2D(filters = 64, kernel_size = (4, 4), input_shape = (64, 64, 3), activation = 'relu'))
model.add(Conv2D(filters = 64, kernel_size = (4, 4), strides = 2,  activation = 'relu'))
model.add(Dropout(0.5))
model.add(BatchNormalization(axis = 3, momentum = 0.8))

# Second Layer
model.add(Conv2D(filters = 128, kernel_size = (4, 4), activation = 'relu'))
model.add(Conv2D(filters = 128, kernel_size = (4, 4), strides = 2,  activation = 'relu'))
model.add(Dropout(0.5))
model.add(BatchNormalization(axis = 3, momentum = 0.8))

# Third Layer
model.add(Conv2D(filters = 256, kernel_size = (4, 4), activation = 'relu'))
model.add(Conv2D(filters = 256, kernel_size = (4, 4), strides = 2,  activation = 'relu'))
model.add(Dropout(0.5))
model.add(BatchNormalization(axis = 3, momentum = 0.8))

# Flattening
model.add(Flatten())
model.add(Dropout(0.5))

model.add(Dense(units = 512, activation = 'relu')) # Hidden Layer
model.add(Dense(units = 29, activation = 'softmax')) # Output Layer

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

model.fit_generator(training_set, steps_per_epoch = 350, epochs = 15, validation_data = test_set, validation_steps = 100)
 

Размер пакета test_set и training_set составляет 64

Краткое описание модели:

 Model: "sequential_24"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_142 (Conv2D)          (None, 61, 61, 64)        3136      
_________________________________________________________________
conv2d_143 (Conv2D)          (None, 29, 29, 64)        65600     
_________________________________________________________________
dropout_90 (Dropout)         (None, 29, 29, 64)        0         
_________________________________________________________________
batch_normalization_69 (Batc (None, 29, 29, 64)        256       
_________________________________________________________________
conv2d_144 (Conv2D)          (None, 26, 26, 128)       131200    
_________________________________________________________________
conv2d_145 (Conv2D)          (None, 12, 12, 128)       262272    
_________________________________________________________________
dropout_91 (Dropout)         (None, 12, 12, 128)       0         
_________________________________________________________________
batch_normalization_70 (Batc (None, 12, 12, 128)       512       
_________________________________________________________________
conv2d_146 (Conv2D)          (None, 9, 9, 256)         524544    
_________________________________________________________________
conv2d_147 (Conv2D)          (None, 3, 3, 256)         1048832   
_________________________________________________________________
dropout_92 (Dropout)         (None, 3, 3, 256)         0         
_________________________________________________________________
batch_normalization_71 (Batc (None, 3, 3, 256)         1024      
_________________________________________________________________
flatten_21 (Flatten)         (None, 2304)              0         
_________________________________________________________________
dropout_93 (Dropout)         (None, 2304)              0         
_________________________________________________________________
dense_42 (Dense)             (None, 512)               1180160   
_________________________________________________________________
dense_43 (Dense)             (None, 29)                14877     
=================================================================
Total params: 3,232,413
Trainable params: 3,231,517
Non-trainable params: 896
_________________________________________________________________
 

Комментарии:

1. Сколько нейронов у вас в выходном слое? Не могли бы вы, пожалуйста, прикрепить свою структуру модели?

2. Я так и сделаю, извините за недостаточную информацию.

3. Каков размер партии для тестового генератора?

4. Вы должны распечатать predictions.shape, также я не уверен, что predict_classes работает с генератором.

5. @Frightera Я не указал размер пакета для генератора, так как он выдал мне ошибку типа, когда я попытался это сделать.

Ответ №1:

Существует очень ограниченная документация для классов predict_classes. Это может не сработать, если вы используете генератор, основанный на документации, показанной ниже

 x: input data, as a Numpy array or list of Numpy arrays (if the model has multiple inputs).
 

поэтому я не думаю, что это работает с генератором. Поэтому вам придется использовать model.predict.

 predictions=model.predict(predict_set)
for p in predictions:
    class_index=np.argmax(p) # this is the integer value assogned to a class.
 

если вы использовали генератор для обучения своей модели (я буду называть его train_gen), то вы можете получить словарь class_indices, который имеет значение for (имя класса, class_index)
следующим образом

 class_dict=train_gen.class_indices
# reverse the dictionary
for key,value in class_dict.items():
        new_dict[value]=key  
````
now you can use the new_dict to get the class name with the code below
```` 
for p in predictions:
    class_index=np.argmax(p)
    class_name=new_dict[class_index]
````