Keras模型训练报错:unhashable type: 'list'问题求助
问题与解决办法
问题详情
之前可正常运行的代码如今出现报错,不添加回调函数时一切正常。
相关代码
checkpoint = ModelCheckpoint('best_model.hdf5' , monitor = ['val_accuracy'] , verbose = 1 , mode = 'max', save_best_only=True) earlystop = EarlyStopping(monitor='val_accuracy', patience=3, restore_best_weights=True) callbacks = [checkpoint, earlystop] ... history = model.fit(train_generator, steps_per_epoch = len(train_generator), validation_data=val_generator, validation_steps = len(val_generator), epochs=EPOCHS, callbacks=checkpoint)
报错信息
TypeError Traceback (most recent call last) <ipython-input-39-805f1a83aa3c> in <module> 4 validation_steps = len(val_generator), 5 epochs=EPOCHS, ----> 6 callbacks=checkpoint) 1 frames /usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py in error_handler(*args, **kwargs) 65 except Exception as e: # pylint: disable=broad-except 66 filtered_tb = _process_traceback_frames(e.__traceback__) ---> 67 raise e.with_traceback(filtered_tb) from None 68 finally: 69 del filtered_tb /usr/local/lib/python3.7/dist-packages/keras/callbacks.py in _save_model(self, epoch, batch, logs) 1426 try: 1427 if self.save_best_only: -> 1428 current = logs.get(self.monitor) 1429 if current is None: 1430 logging.warning('Can save best model only with %s available, ' TypeError: unhashable type: 'list'
原因分析
- 监控参数类型错误:
ModelCheckpoint的monitor参数被传入了列表['val_accuracy'],但该参数要求传入字符串类型的指标名称。logs是字典结构,字典的键必须是可哈希类型(如字符串),用列表当键会触发unhashable type: 'list'错误。 - 回调参数格式错误:
model.fit的callbacks参数要求传入回调对象的列表,但代码中直接传了单个checkpoint对象,不符合参数要求。
解决办法
修正两处错误即可:
- 将
ModelCheckpoint的monitor参数改为字符串'val_accuracy' model.fit的callbacks传入定义好的callbacks列表(若仅需单个回调,可传[checkpoint])
修正后的代码示例:
# 修正monitor参数为字符串 checkpoint = ModelCheckpoint('best_model.hdf5' , monitor='val_accuracy' , verbose=1 , mode='max', save_best_only=True) earlystop = EarlyStopping(monitor='val_accuracy', patience=3, restore_best_weights=True) callbacks = [checkpoint, earlystop] ... # 传入回调列表 history = model.fit(train_generator, steps_per_epoch = len(train_generator), validation_data=val_generator, validation_steps = len(val_generator), epochs=EPOCHS, callbacks=callbacks)
内容的提问来源于stack exchange,提问作者Sergei Frolov
相关产品推荐
相关产品推荐

