【问题标题】:Keras fit_generator Validation Data TypeError: 'float' object cannot be interpreted as an integerKeras fit_generator 验证数据类型错误:'float' 对象不能解释为整数
【发布时间】:2018-07-23 01:54:03
【问题描述】:

我正在尝试运行 Ning-Ding 的 CUHK03 Person Re-ID 脚本(使用 Keras 实现 Ahmed 等人的论文) 见https://github.com/Ning-Ding/Implementation-CVPR2015-CNN-for-ReID

错误文本如下:

TypeError Traceback (most recent call last)
in ()

    ----> 1 main("E:\DL\cuhk-03.h5")

in main(dataset_path)

    17 model = generate_model()
    18 model = compile_model(model)
    ---> 19 train(model, dataset_path)
    20
    21 def train(model,

in train(model, h5_path, weights_name, train_num, one_epoch, epoch_num, flag_random, random_pattern, flag_train, flag_val, which_val_data, nb_val_samples)
    39 rand_x = np.random.rand()
    40 flag_train = random_pattern(rand_x)
    ---> 41 model.fit_generator(Data_Generator.flow(f,flag = flag_train),one_epoch,epoch_num,validation_data=Data_Generator.flow(f,train_or_validation=which_val_data,flag=flag_val),nb_val_samples=nb_val_samples)
    42 Rank1s.append(round(cmc(model)[0],2))
    43 print (Rank1s)

~\Anaconda3\lib\site-packages\keras\legacy\interfaces.py in wrapper(*args, **kwargs)

    89 warnings.warn('Update your ' + object_name + 90 ' call to the Keras 2 API: ' + signature, stacklevel=2)
    ---> 91 return func(*args, **kwargs)
    92 wrapper._original_function = func
    93 return wrapper

~\Anaconda3\lib\site-packages\keras\engine\training.py in fit_generator(self, generator, steps_per_epoch, epochs, verbose, callbacks, validation_data, validation_steps, class_weight, max_queue_size, workers, use_multiprocessing, shuffle, initial_epoch)

    2023 epoch = initial_epoch
    2024
    -> 2025 do_validation = bool(validation_data)
    2026 self._make_train_function()
    2027 if do_validation:

TypeError: 'float' object cannot be interpreted as an integer

我在 Windows 10(x86) 上的 Anaconda 中使用 Jupyter Notebook。 Keras 版本 2.1.3 Python 版本 3.6.3 TensorFlow 后端 (1.4.0)

【问题讨论】:

  • 从错误消息看来validation_data 是一个浮点数。检查它的来源。可能来自数据集。
  • validation_data 是一个浮点值。这也是用于训练的数据,因为我们必须缩放数据(/255,因为它是 rgb 值)。 Ning-Ding 的代码已经用同样的方式执行了,我不明白为什么这样会抛出错误,因为当我在交互式 shell 中尝试 bool(3.5) 时,python 3 没有抛出错误。
  • 您解决了这个问题吗?

标签: deep-learning keras anaconda


【解决方案1】:

好的,所以validation_data是一个由

返回的生成器
Data_Generator.flow(f,train_or_validation=which_val_data,flag=flag_val)

do_validation = bool(validation_data)被执行时,对一个对象调用bool将调用nonzerolen,如果它们中的任何一个被定义的话。在这种情况下,Sequence 实现了len,因此它检查if len(Sequence) == 0。您的问题是 len 返回 float(这是一个错误),因此当它尝试将其转换为 bool 时,它会失败。

断言len 返回int

归功于https://www.bountysource.com/issues/54744813-fit_generator-throws-error-on-validation-data-being-float-data-type的Dref360

【讨论】:

  • 谢谢,我试试看。
  • 我有同样的错误,但在不同的上下文中。 This article helped me discover the problem。我的生成器上的 __len__() 方法返回了一个浮点数。
  • @Goodword 谢谢,我已经更新了答案以包含解决方案。
  • 这个答案救了我的命。
【解决方案2】:

我也遇到了同样的问题,我只是想补充已经给出的答案。

正如上面所说的“[..] 问题是 len 返回一个浮点数(这是一个错误),因此当它尝试将其转换为布尔值时,它会失败”。但是,您指的是哪个len

这很可能是因为您使用的是 keras 生成器模板,其中包含以下定义。

def __len__(self):
return np.ceil(len(self.x) / self.batch_size)

如前所述,确保它是return 和整数。因此,它解决了问题:

def __len__(self):
return int(np.ceil(len(self.x) / self.batch_size))

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多