CNN图像字幕项目中字典字符串键(图片名)引发索引错误的解决方法
问题分析
触发IndexError的核心原因是photos列表里存在all_features字典中没有的键,或者键的格式不匹配(比如文件名带换行符、大小写不一致、后缀名差异)。
解决步骤
先排查不匹配的键
先在代码里加个检查,把不存在的键打印出来,快速定位问题:def load_features(photos): all_features = load(open('features.p', 'rb')) # 找出所有不在特征字典里的图片名 missing_keys = [k for k in photos if k not in all_features] if missing_keys: print(f"这些图片名在features.p里找不到: {missing_keys}") # 只保留存在的键 features = {k: all_features[k] for k in photos if k in all_features} return features处理文件名格式问题
从文本文件读取图片名时,很容易带换行符、空格,或者和特征字典里的键大小写/后缀不一致,统一处理一下:def load_features(photos): all_features = load(open('features.p', 'rb')) processed_photos = [] for k in photos: # 去掉前后的空格、换行符 cleaned_k = k.strip() # 统一转成小写,避免大小写不匹配 cleaned_k = cleaned_k.lower() # 确保后缀是.jpg(如果生成特征时用的是其他后缀,对应调整) if not cleaned_k.endswith('.jpg'): cleaned_k += '.jpg' processed_photos.append(cleaned_k) # 再次检查缺失的键 missing_keys = [k for k in processed_photos if k not in all_features] if missing_keys: print(f"这些图片名在features.p里找不到: {missing_keys}") features = {k: all_features[k] for k in processed_photos if k in all_features} return features核对特征文件的键格式
还要确认生成features.p的时候,用的图片名格式和你现在读取的是否一致——比如生成特征时有没有去掉后缀、或者修改过文件名(比如只取了文件名的前缀)。如果生成时的键不带.jpg,那你读取时也要去掉后缀再匹配。
内容的提问来源于stack exchange,提问作者SakshamS
相关产品推荐
相关产品推荐

