python - 通过 Python 在 CNN 中预期 conv2d_19_input 有 4 维错误
问题描述
我有一个关于在 CNN 的预测方法中解决维度的问题。在基于 image 定义训练和测试数据之前,我提出了一个 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)
解决方案
该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))
推荐阅读
- javascript - 如何使用 Axios 在另一个对象中获取数组?
- python - 运行程序时无法在 chrome 上显示网站
- reactjs - 无法更改 React js 模态覆盖不透明度
- android - 从 Android 应用程序 EditText 接收输入并发送到 Kafka
- php - 如何将 php 数组拆分为多个部分以将它们插入到 csv 列名中?
- ios - UICollectionView 单元格内容视图完全空白
- javascript - 队列在 discord.js 中不起作用,跳过老歌
- teamcity - TeamCity API 调用以获取对构建配置的修改列表
- kotlin - 在 kotlin 中运行以下代码时会创建多少个集合?
- sql - 无主键表批量删除的SQL查询