TensorFlow图像分类模型预测结果无法打印的问题求助
二分类图像模型无法输出预测结果的问题修复
核心问题分析
模型输出层冗余且激活函数错误
你的模型最后连续叠加了三个输出层,二分类任务仅需一个输出层搭配sigmoid激活即可。中间的softmax层对单个神经元来说输出恒为1,后续sigmoid会将其转化为接近1的小数,导致val == 0或val == 1的判断条件永远无法触发。测试图像未做归一化
训练阶段用ImageDataGenerator(rescale=1/255)对图像做了归一化,但测试时直接将图像转成数组却未除以255,输入数据分布与训练时不一致,会干扰预测结果。预测结果判断逻辑错误
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
相关产品推荐
相关产品推荐

