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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:48:05