我试图通过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)
答案 0 :(得分:5)
好的,validation_data
是
Data_Generator.flow(f,train_or_validation=which_val_data,flag=flag_val)
执行do_validation = bool(validation_data)
时,如果定义了任何对象,则在对象上调用bool将调用nonzero
或len
。在这种情况下,Sequence
会实现len
,因此会检查if len(Sequence) == 0
。您的问题是len
返回float
(这是一个错误),因此当它尝试在bool
中转换它时,它会失败。
断言len
返回int
。
答案 1 :(得分:0)
我遇到了同样的问题,我只想补充已经给出的答案。
正如上面所说,“ [..]问题是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))