使用CNN进行多类别图像分类训练时TypeError报错的解决求助
错误原因
你触发的报错核心原因是 fit() 方法的 steps_per_epoch、validation_steps 两个参数要求输入整数类型,但你用 / 做除法得到的是浮点型数值,当计算结果出现小数(比如你遇到的0.6)时,TensorFlow无法将浮点型数值转为int64类型的张量,就触发了类型错误。
另外你代码里还存在参数不一致的问题:你定义ImageDataGenerator迭代器时,batch_size 设为32,但后续计算步数时用的是自定义的batch_size=10,两个批次大小不匹配,也会导致训练步数计算错误。
修复方案
- 先统一批次大小参数,避免混用不同的batch_size数值
- 把步数计算的普通除法
/替换为整数除法//,或者手动将计算结果转为int类型 - 如果你使用的是TensorFlow 2.4及以上版本,也可以直接省略
steps_per_epoch和validation_steps两个参数,框架会根据迭代器的样本总量自动计算步数 - 如果怕整除会漏掉最后一批不足一个batch的样本,可以用
math.ceil()对除法结果向上取整,保证所有样本都能参与训练
修改后的参考代码
import math train_gen=ImageDataGenerator(rescale=1./255) validation_gen=ImageDataGenerator(rescale=1./255) # 统一全局批次大小参数,后续直接调用 BATCH_SIZE = 32 train_generator=train_gen.flow_from_dataframe( train_df, "/Users/danieladegborioye/Documents/school/FIFTH YEAR/ENGR 418 Applied Machine learning /Lego_dataset_1/training/", x_col='filename', y_col='category', target_size=(150,150), class_mode="categorical", batch_size=BATCH_SIZE ) validation_generator=validation_gen.flow_from_dataframe( validate_df, "/Users/danieladegborioye/Documents/school/FIFTH YEAR/ENGR 418 Applied Machine learning /Lego_dataset_1/training/", x_col='filename', y_col='category', target_size=(150,150), class_mode="categorical", batch_size=BATCH_SIZE ) epochs=10 history=modell.fit( train_generator, epochs=epochs, validation_data=validation_generator, # 向上取整保证所有样本都被用到,结果为整数不会触发类型错误 validation_steps=math.ceil(total_validate/BATCH_SIZE), steps_per_epoch=math.ceil(total_train/BATCH_SIZE), callbacks=callbacks )
内容的提问来源于stack exchange,提问作者black_powr
相关产品推荐
相关产品推荐

