首页 > 解决方案 > 模型预测拟合后给出相同的结果

问题描述

嗨,我是 ML 和 Tensorflow 的初学者,请原谅我不理解复杂的理论。

我正在构建一个图像分类器 CNN 作为一种实践形式。该模型使用 MobileNetv2 进行训练,它应该对猫、狗和熊猫的图像进行分类。在训练我的模型(准确率达到 92%)后,我尝试使用 model.predict() 来评估它对新图像的处理方式,但我注意到我的所有输出都是 1。即使我使用相同的先前训练数据也会发生这种情况. 顺便说一句,我使用 2700 张(每个班级 900 张)图像进行训练,使用 300 张进行验证。

这是我的代码

%tensorflow_version 2.x  # this line is not required unless you are in a notebook
import tensorflow as tf

from tensorflow.keras import datasets, layers, models
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import PIL.Image
import tensorflow_datasets as tfds
import pathlib

from google.colab import drive

drive.mount('/content/gdrive')

IMAGE_SIZE=[150,150]

train_path = "/content/gdrive/MyDrive/Colab Notebooks/Cat_Dog_Panda_CNN/train"
test_path = "/content/gdrive/MyDrive/Colab Notebooks/Cat_Dog_Panda_CNN/test"

IMAGE_SHAPE=[150,150,3]

base_model = tf.keras.applications.MobileNetV2(input_shape=IMAGE_SHAPE,
                                               include_top=False,
                                               weights='imagenet')
base_model.trainable = False
global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
prediction_layer = tf.keras.layers.Dense(3)

model = tf.keras.Sequential([
  base_model,
  global_average_layer,
  prediction_layer
])

model.summary()


base_learning_rate = 0.0001
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=base_learning_rate),
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

# creates a data generator object that transforms images
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest')

test_datagen = ImageDataGenerator (rescale=1./255)

training_set = train_datagen.flow_from_directory(train_path, target_size=IMAGE_SIZE, batch_size=32, class_mode='categorical')
testing_set = test_datagen.flow_from_directory(test_path, target_size=IMAGE_SIZE, batch_size=32, class_mode='categorical')

model.fit(
        training_set,
        epochs=3,
        validation_data=testing_set)

img = Image.open("/content/gdrive/MyDrive/Colab Notebooks/Cat_Dog_Panda_CNN/test/panda/panda_00094.jpg").convert('RGB').resize((150, 150), Image.ANTIALIAS)
img = np.array(img)

predictions = model.predict(img[None,:,:])
np.argmax(predictions[0])

标签: tensorflowmachine-learningconv-neural-network

解决方案


在 model.compile 你有 loss=tf.keras.losses.BinaryCrossentropy(from_logits=True)。既然你有 3 节课,你应该有

loss=tf.keras.losses.CategoricalCrossentropy()

Mobilenet 模型使用在 -1 到 +1 范围内缩放的像素值进行训练。所以你应该将 rescale 设置为

rescale=1/127.5-1

当您想将图像输入 model.predict 时,您必须对图像执行与训练图像相同的预处理,即重新缩放图像并将图像大小调整为与训练中使用的大小相同,即 (150,150)。


推荐阅读