You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow图像分类模型预测结果无法打印的问题求助

二分类图像模型无法输出预测结果的问题修复

核心问题分析

  1. 模型输出层冗余且激活函数错误
    你的模型最后连续叠加了三个输出层,二分类任务仅需一个输出层搭配sigmoid激活即可。中间的softmax层对单个神经元来说输出恒为1,后续sigmoid会将其转化为接近1的小数,导致val == 0或val == 1的判断条件永远无法触发。

  2. 测试图像未做归一化
    训练阶段用ImageDataGenerator(rescale=1/255)对图像做了归一化,但测试时直接将图像转成数组却未除以255,输入数据分布与训练时不一致,会干扰预测结果。

  3. 预测结果判断逻辑错误
    sigmoid激活函数的输出是0到1之间的连续值,并非严格的0或1,直接用相等判断永远不会成立,需通过阈值(如0.5)划分类别。

修复后的完整代码

# 导入所需库
import tensorflow as tf
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from tensorflow.keras.optimizers import RMSprop
import cv2
import os

plt.style.use('fivethirtyeight')

# 训练与验证数据生成器
train = ImageDataGenerator(rescale=1/255)
validation = ImageDataGenerator(rescale=1/255)

train_dataset = train.flow_from_directory(
    'D:/ML Datasets/FoodImageClassification/Training Data/',
    target_size=(200,200),
    batch_size=4,
    class_mode='binary'
)

validation_dataset = validation.flow_from_directory(
    'D:/ML Datasets/FoodImageClassification/Testing Data/',
    target_size=(200,200),
    batch_size=4,
    class_mode='binary'
)

# 修正后的模型结构
model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16,(3,3),activation='relu',input_shape=(200,200,3)),
    tf.keras.layers.MaxPool2D(2,2),
    tf.keras.layers.Conv2D(32,(3,3),activation='relu'),
    tf.keras.layers.MaxPool2D(2,2),
    tf.keras.layers.Conv2D(32,(3,3),activation='relu'),
    tf.keras.layers.MaxPool2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512,activation='relu'),
    tf.keras.layers.Dense(1,activation='sigmoid')
])

# 编译模型(调低学习率避免训练震荡)
model.compile(
    loss='binary_crossentropy',
    optimizer=RMSprop(learning_rate=0.001),
    metrics=['accuracy']
)

# 训练模型
model_fit = model.fit(
    train_dataset,
    steps_per_epoch=5,
    epochs=50,
    validation_data=validation_dataset
)

# 测试预测部分
img = image.load_img('D://ML Datasets/FoodImageClassification/Testing Data/Pasta/Garlic Butter Parmesan Pasta Recipe.jpg')
newsize = (200, 200)
img = img.resize(newsize)
img.show()

# 图像归一化+维度扩展
X = image.img_to_array(img) / 255.0
X = np.expand_dims(X, axis=0)
val = model.predict(X)

# 用阈值判断类别
if val < 0.5:
    print("Pasta")
else:
    print("Pizza")

额外优化建议

  • 学习率调整:原学习率0.3过高,易导致模型训练震荡,建议设置为0.001或更小。
  • 冗余层移除:移除了原模型中重复的Flatten()层,减少不必要的计算开销。
  • 验证生成器修正:原代码中验证数据集误用了训练生成器,已修正为专用的验证生成器。

内容的提问来源于stack exchange,提问作者Nachiket Kulkarni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:25:32