如何使用numpy为训练图像打标?VGG16训练不收敛是标注错误吗
你的标注方式没有错误,标签存储为与图像一一对应的0/1 numpy数组、shape为(n,1)的格式,适配二分类交叉熵损失的要求,不需要调整标注逻辑。
模型完全不学习的核心原因是网络结构配置错误,其次可能存在输入预处理缺失的问题,具体原因和修复方案如下:
核心问题说明
你调用VGG16时设置了include_top=False,该参数会移除VGG16自带的用于分类输出的顶层全连接层,此时模型仅保留特征提取模块,输出为4维特征张量,与你(n,1)格式的标签维度完全不匹配,损失计算逻辑失效,自然无法收敛。
修复方案
1. 补充分类头适配二分类任务
需要在VGG16的特征输出后追加全连接层,输出符合二分类要求的概率值,示例代码如下:
from tensorflow.keras.layers import Flatten, Dense, Dropout from tensorflow.keras.models import Model # 加载VGG16特征提取模块,如需使用预训练权重可添加weights='imagenet'参数 base_model = VGG16(include_top=False, input_shape=(32,32,3)) # 追加二分类专属的输出层 x = base_model.output x = Flatten()(x) x = Dense(128, activation='relu')(x) x = Dropout(0.5)(x) output_layer = Dense(1, activation='sigmoid')(x) model = Model(inputs=base_model.input, outputs=output_layer) model.summary()
2. 补充输入预处理逻辑
VGG16要求输入图像做数值归一化处理,不能直接传入0~255范围的原始像素值,训练前需要对数据集做标准化:
# 像素值归一化到0~1区间,测试集做相同处理 training_ds = training_ds / 255.0 testing_ds = testing_ds / 255.0
3. 训练逻辑和原代码保持一致即可
model.compile(optimizer="Adam", loss="binary_crossentropy" , metrics=['accuracy']) epochs = 10 history = model.fit(x=training_ds, y=training_lb , epochs=epochs, validation_data= (testing_ds, testing_lb) )
原运行结果参考

内容的提问来源于stack exchange,提问作者FNM
相关产品推荐
相关产品推荐

