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

TensorFlow新手做VGG16迁移学习微调时遇ValueError求助

问题排查与修正方案

核心错误原因

你遇到的ValueError是因为训练时使用的生成器仅输出特征数据(x),未提供对应标签(y),不符合Keras对生成器输出格式的要求。结合代码细节,还有几处关键问题需要修正:

1. 生成器配置与训练方式不匹配

你设置class_mode=None后,train_generator和val_generator只会返回图像数据,不包含标签。但你已经提前提取了特征和标签,后续训练应该直接使用提取后的train_data、train_labels,而非再用生成器喂数据。

2. MLP层缺失Flatten操作

VGG16设置include_top=False后,输出的是形状为(7,7,512)的3D特征图,直接连接Dense层会报错,必须先通过Flatten层将3D特征转为1D向量。

3. 二分类激活函数错误

二分类任务应使用sigmoid激活函数,而非softmax。softmax适用于多分类场景,配合binary_crossentropy会导致输出概率不符合预期。

修正后的代码

import os
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.optimizers import Adam
from tensorflow.keras import applications
import numpy as np

def get_length(Path, Pattern):
     # Pattern: 子目录名称
     Length = len(os.listdir(os.path.join(Path, Pattern)))
     return Length

train_data_dir = ''  # 填入你的训练集路径
validation_data_dir = ''  # 填入你的验证集路径
img_width, img_height = 224, 224
epochs = 150
batch_size = 8
LR = 0.00001

Len_C1_Train = get_length(train_data_dir,'AFF')
Len_C2_Train = get_length(train_data_dir,'NFF')
Len_C1_Val = get_length(validation_data_dir,'AFF')
Len_C2_Val = get_length(validation_data_dir,'NFF')

# 加载预训练VGG16,不含顶层分类器
model = applications.VGG16(include_top=False, weights='imagenet')
datagen = ImageDataGenerator(rescale=1. / 255)

# 提取训练集特征(替代废弃的predict_generator)
train_generator = datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode=None,
    shuffle=False
)  
features_train = model.predict(
    train_generator,
    steps=(Len_C1_Train+Len_C2_Train) // batch_size,
    max_queue_size=1
)

# 提取验证集特征
val_generator = datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode=None,
    shuffle=False
)  
features_val = model.predict(
    val_generator,
    steps=(Len_C1_Val+Len_C2_Val) // batch_size,
    max_queue_size=1
)        

# 准备训练/验证数据与标签
train_data = features_train
train_labels = np.array([0] * int(Len_C1_Train) + [1] * int(Len_C2_Train))
validation_data = features_val
validation_labels = np.array([0] * int(Len_C1_Val) + [1] * int(Len_C2_Val))

# 构建MLP分类器,新增Flatten层处理3D特征
model2=Sequential()
model2.add(Flatten())
model2.add(Dense(128, activation='relu'))
model2.add(Dropout(0.5))
model2.add(Dense(1, activation='sigmoid'))  # 二分类用sigmoid

# 组合模型并冻结VGG16层
model_total = Sequential([model, model2])
model.trainable = False

# 编译模型
model_total.compile(loss='binary_crossentropy', optimizer=Adam(lr=LR), metrics=['binary_accuracy'])

# 用提取后的特征直接训练
model_total.fit(
    train_data,
    train_labels,
    epochs=epochs,
    batch_size=batch_size,
    validation_data=(validation_data, validation_labels)
)

额外说明

  • predict_generator已被官方废弃,建议使用predict()替代,参数逻辑保持一致。
  • 若想直接用生成器端到端训练(不提前提取特征),需将class_mode设为'binary',生成器会返回(x,y)元组,此时无需提前提取特征,直接用fit()传入生成器即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:45:40