Ожидается, что conv2d_19_input будет иметь ошибку 4 измерений в CNN через Python
У меня проблема с решением измерения в методе предсказания CNN. Прежде чем определять данные для обучения и тестирования на основе изображения, я представил модель CNN. После того, как процесс был завершен, я подогнал модель. Когда я предсказываю значение с помощью модели, здесь возникает ошибка.
Как я могу это исправить?
Вот мои блоки кода, показанные ниже.
Мои библиотеки Keras
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.preprocessing.image import ImageDataGenerator
Вот моя модель CNN
classifier = Sequential()
classifier.add(Convolution2D(filters = 32,
kernel_size=(3,3),
data_format= "channels_last",
input_shape=(64, 64, 3),
activation="relu")
)
classifier.add(MaxPooling2D(pool_size = (2,2)))
classifier.add(Convolution2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Convolution2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Flatten())
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
Подгонка CNN к изображениям
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
training_set = train_datagen.flow_from_directory(train_path,
target_size=(64, 64),
batch_size=32,
class_mode='binary')
test_set = test_datagen.flow_from_directory(
test_path,
target_size=(64, 64),
batch_size=32,
class_mode='binary')
Подходящая модель
classifier.fit_generator(
training_set,
steps_per_epoch=50,
epochs=30,
validation_data=test_set,
validation_steps=200)
Предсказание
S = 64
directory = os.listdir(test_forged_path)
print(directory[3])
print("Path : ", test_forged_path + "/" + directory[3])
imgForged = cv2.imread(test_forged_path + "/" + directory[3])
plt.imshow(imgForged)
pred = classifier.predict(imgForged) # ERROR
print("Probability of Forged Signature : ", "%.2f".format(pred))
Ошибка:
ValueError: Error when checking input: expected conv2d_19_input to have 4 dimensions, but got array with shape (270, 660, 3)
1 ответ
Решение
В predict
В вашем вводе отсутствует размер партии. Измените свой прогноз следующим образом:
import numpy as np <--- import numpy
S = 64
directory = os.listdir(test_forged_path)
print(directory[3])
print("Path : ", test_forged_path + "/" + directory[3])
imgForged = cv2.imread(test_forged_path + "/" + directory[3])
plt.imshow(imgForged)
pred = classifier.predict(np.expand_dims(imgForged,0)) # <-- add new axis to the front, shape will be (1, 270, 660, 3)
print("Probability of Forged Signature : ", "%.2f".format(pred))