在R中使用Keras的fit_generator时出现类型错误求助
解决R中Keras fit_generator的StopIteration与验证集浮点错误
我帮你梳理了代码里的几个关键问题,这些就是引发你遇到的StopIteration: 'float' object cannot be interpreted as an integer和验证集相关浮点错误的根源,下面一步步来解决:
错误原因分析
你的问题主要来自三个方面:
- 训练数据生成器未显式指定
batch_size,导致后续迭代时出现类型不匹配 steps_per_epoch硬编码为固定值,既不符合样本量实际情况,也可能因数值类型触发错误- 添加验证集时未正确设置整数类型的
validation_steps,引发布尔值判断的浮点错误
具体修复步骤
1. 给训练生成器显式添加batch_size参数
你的train_set生成器缺少batch_size配置,虽然Keras有默认值,但显式设置能避免跨平台/版本的类型问题。修改代码如下:
train_set = train_gen$flow_from_directory( 'dataset/training_set', target_size = c(64, 64), batch_size = 32, # 新增该行,和测试集保持一致 class_mode = "categorical" )
2. 动态计算整数类型的迭代步数
硬编码steps_per_epoch = 50很容易因为样本量不足触发StopIteration,而且如果计算结果是浮点数,会引发类型错误。我们可以根据实际样本数和批次大小计算整数步数:
# 获取训练、测试集的总样本数 train_samples <- train_set$n test_samples <- test_set$n batch_size <- 32 # 转换为整数,避免浮点类型问题 steps_per_epoch <- as.integer(train_samples / batch_size) validation_steps <- as.integer(test_samples / batch_size)
3. 修正fit_generator调用(含验证集场景)
用计算好的整数步数替换硬编码值,添加验证集时也必须指定validation_steps:
# 不带验证集的调用 model$fit_generator( train_set, steps_per_epoch = steps_per_epoch, epochs = 10 ) # 带验证集的调用(解决bool(validation_data)错误) model$fit_generator( train_set, steps_per_epoch = steps_per_epoch, epochs = 10, validation_data = test_set, validation_steps = validation_steps )
4. 确保Keras与TensorFlow版本兼容
部分类型错误是因为R的Keras接口和底层TensorFlow版本不匹配导致的,运行以下命令更新到兼容版本:
keras::install_keras()
完成以上修改后,你的模型应该能正常训练,不会再出现StopIteration和验证集相关的浮点错误了。
内容的提问来源于stack exchange,提问作者saeedar
相关产品推荐
相关产品推荐

