TensorFlow搭建的CNN训练时未使用全部训练图像的问题咨询
问题解答
1. 日志中57/57的含义
这个数值代表训练过程的批次数(batch count),不是用到的图像数量。TensorFlow的model.fit()默认批大小(batch_size)为32,你的总训练样本数是1809,计算得:1809 ÷ 32 ≈ 56.53,向上取整后就是57个批次,所有1809张图像已经全部参与了当前epoch的训练,不存在只用到57张的情况。
2. loss为0、准确率异常的原因及修复方案
你当前的问题核心是模型结构、损失函数和分类任务不匹配,具体问题和调整方法如下:
- 输出层配置错误:你做的是3分类任务,输出层神经元数应该和类别数一致,你当前设置为1个神经元,softmax作用在单个神经元上输出永远为1,导致损失计算完全失效,出现loss恒为0的异常表现。
- 损失函数与标签格式不匹配:你的标签
behaviour是0/1/2的整数格式,使用categorical_crossentropy要求标签先做One-Hot编码,如果你不想转编码,可以直接替换损失函数适配整数标签。
3. 调整后的代码示例
修正输出层:
# 把原来的输出层替换为以下代码 model.add(layers.Dense(3, activation = 'softmax'))
修正编译配置:
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'])
可选:显式指定batch大小(方便自定义批次数量)
如果你想要调整每批的样本数,可以在fit时显式传入batch_size参数,比如设置为16的话,总批次就会变成1809/16≈114:
history = model.fit(image_list, behaviour, epochs=5, batch_size=32, # 可自定义调整 validation_data=(image_list, behaviour), verbose = 1)
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

