tensorflow - 模型预测拟合后给出相同的结果
问题描述
嗨,我是 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])
解决方案
在 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)。
推荐阅读
- javascript - ES6:从 CORS 获取调用中检索响应标头
- c# - 如何在 C# 中使用这个 mongoDb 聚合
- jenkins - 是否可以在 Jenkins 管道中安排一个步骤?
- node.js - 我如何在微服务之间进行通信?
- java - 在里面并且不在 xmlWorker 中工作
- git - 忽略当前目录中的文件,但排除同名目录
- nginx - Nginx 执行 60 秒后返回 404
- vb.net - 从 VB.NET 中的特定文件夹加载 dll
- react-native - Scrollview onEndReached 内的平面列表
- java - 当我们可以用 setter 做同样的事情时,为什么我们需要使用 builder 设计模式?