【发布时间】:2021-09-27 09:23:11
【问题描述】:
我正在尝试构建一个 CNN 模型来对图像进行分类,但是每当训练完成并且我尝试为其提供单个图像(来自训练数据集)时,它总是会错误地分类该图像。
请看我下面写的代码。
提前谢谢你。
首先,我为我的训练集和测试集声明了一个图像数据生成器:
train_datagen = ImageDataGenerator(rescale = 1./255, rotation_range=20, horizontal_flip = True,
validation_split=0.3)
test_datagen = ImageDataGenerator(rescale = 1./255,validation_split=0.3)
然后,我使用 flow_from_directory() 函数来加载图像:
train_generator = train_datagen.flow_from_directory(
data_dir,
shuffle=False,
subset='training',
target_size = (224, 224),
class_mode = 'categorical'
)
test_generator = test_datagen.flow_from_directory(
data_dir,
shuffle=False,
subset='validation',
target_size = (224, 224),
class_mode = 'categorical'
)
然后我加载了一个预训练模型并添加了几层来构建我的模型:
pretrained_model = VGG16(weights="imagenet", include_top=False,
input_tensor=input_shape)
pretrained_model.trainable = False
model = tf.keras.Sequential([
pretrained_model,
Flatten(name="flatten"),
Dense(3, activation="softmax")
])
然后我训练了模型:
INIT_LR = 3e-4
EPOCHS = 15
opt = Adam(lr=INIT_LR)
model.compile(loss="categorical_crossentropy", optimizer='Adam', metrics=["accuracy"])
H = model.fit(
train_generator,
validation_data=test_generator,
epochs=EPOCHS,
verbose= 1)
然后是预测单个图像的部分:
我选择了一张属于训练集的图像,我什至过度拟合了模型以确保预测正确,但它给我输入到模型的每张图像都给出了错误的结果。
我尝试了以下方法:
image = image.load_img(url,target_size = (224, 224))
img = tf.keras.preprocessing.image.img_to_array(image)
img = np.array([img])
img = img.astype('float32') / 255.
img = tf.keras.applications.vgg16.preprocess_input(img)
这没用
image = cv2.imread(url)
image = cv2.normalize(image, None,beta=255, dtype=cv2.CV_32F)
image = cv2.resize(image, (224, 224))
image = np.expand_dims(image, axis=0)
这也不起作用,我还尝试了许多其他方法来预测单个图像,但都没有成功。
最后,唯一的方法是我必须为这个单一的图像创建一个图像数据生成器和来自目录的流,它确实有效,但我认为这不是应该的。
【问题讨论】:
标签: python-3.x tensorflow keras conv-neural-network tf.keras