【问题标题】:Model predict giving same results after fitting模型预测拟合后给出相同的结果
【发布时间】:2021-01-04 17:43:46
【问题描述】:

您好,我是 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])

【问题讨论】:

    标签: tensorflow machine-learning conv-neural-network


    【解决方案1】:

    在 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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2019-07-19
      • 2020-01-27
      相关资源
      最近更新 更多