Keras fit_generator验证数据类型错误:float无法解析为整数求助
解决Keras fit_generator中"float cannot be interpreted as integer"的错误
针对你在运行CUHK03行人重识别脚本时遇到的TypeError: 'float' object cannot be interpreted as an integer错误,结合你使用的Keras 2.1.3、Python 3.6.3环境,这个问题大概率出在fit_generator的参数格式不匹配上,下面是具体的分析和解决步骤:
核心原因
Keras 2.x版本对fit_generator的steps_per_epoch和validation_steps参数有严格要求:必须传入整数,但Python 3中使用/做除法会返回浮点数(比如100/32=3.125),如果你的代码里直接用这种方式计算步数,就会触发这个错误。另外,也有可能是validation_data的格式不符合要求(比如传入了维度为浮点数的数组),但前者是更常见的诱因。
具体解决步骤
1. 定位并修正步数参数
找到代码中调用fit_generator的位置,通常会类似这样:
model.fit_generator(train_generator, steps_per_epoch=len(train_samples)/batch_size, validation_data=val_generator, validation_steps=len(val_samples)/batch_size, epochs=50)
把其中的除法改为整数除法(用//运算符),或者用int()强制转换为整数:
# 方式1:用整数除法,自动向下取整 model.fit_generator(train_generator, steps_per_epoch=len(train_samples) // batch_size, validation_data=val_generator, validation_steps=len(val_samples) // batch_size, epochs=50) # 方式2:如果想包含最后一批不足batch_size的样本,可手动加1 val_steps = len(val_samples) // batch_size if len(val_samples) % batch_size != 0: val_steps += 1 train_steps = len(train_samples) // batch_size if len(train_samples) % batch_size != 0: train_steps += 1 model.fit_generator(train_generator, steps_per_epoch=train_steps, validation_data=val_generator, validation_steps=val_steps, epochs=50)
2. 验证validation_data的格式
如果修改步数后仍然报错,检查validation_data的格式:
- 如果你传入的是生成器,确保生成器每次返回的是
(x_val, y_val)的元组,且x_val、y_val的所有维度都是整数(比如(32, 128, 64, 3),不能出现浮点数维度)。 - 如果你传入的是静态数据集元组
(x_val, y_val),确认x_val和y_val的形状是合法的整数维度,且数据类型符合模型输入要求。
3. 适配Keras版本差异
原项目可能是基于Keras 1.x开发的,而Keras 2.x对fit_generator的参数做了调整:
- Keras 1.x中
validation_steps是可选参数,但Keras 2.x中如果validation_data是生成器,必须显式传入validation_steps且为整数。 - 确保生成器的输出格式符合Keras 2.x的要求(比如多输入模型需要返回对应数量的输入数组)。
调试小技巧
如果还是无法定位问题,打印出steps_per_epoch、validation_steps的值,以及validation_data的形状,确认是否存在浮点数:
print("Steps per epoch:", len(train_samples)/batch_size) print("Validation steps:", len(val_samples)/batch_size) if isinstance(validation_data, tuple): print("Validation x shape:", validation_data[0].shape)
内容的提问来源于stack exchange,提问作者Aditya Khandelwal
相关产品推荐
相关产品推荐

