使用Keras进行图像分类时遭遇AttributeError报错的解决求助
解决Keras图像分类中
AttributeError: 'str' object has no attribute '__array_interface__'的问题 从你的报错信息和代码来看,这个错误的核心原因是PIL的fromarray()方法被传入了字符串类型的图片路径,而不是预期的图像数组,这大概率和你修改过PIL的Image.py文件有关,也可能是依赖库版本的兼容性问题。下面是具体的解决方案:
1. 恢复修改过的PIL Image.py文件
你提到修改了Image.py,而报错里显示img = pil_image.fromarray(path)——这明显不符合逻辑,正常情况下load_img函数应该是用pil_image.open(path)来读取图片文件,而不是把路径直接传给fromarray()(这个方法是用来从数组生成图像的)。
- 找到你的PIL安装路径(比如你这里是
C:\Users\user\AppData\Local\Continuum\anaconda3\lib\site-packages\PIL\Image.py),将其恢复为原始版本:- 如果是用conda安装的,执行
conda install --force-reinstall pillow强制重新安装Pillow,覆盖修改后的文件; - 如果是pip安装的,执行
pip install --force-reinstall pillow。
- 如果是用conda安装的,执行
2. 修正代码中的潜在疏漏
虽然这不是当前错误的直接原因,但你的代码里有一处明显的问题,可能后续引发其他报错:
- 你使用了
input_shape参数但未赋值,需要根据图像通道顺序补充定义:# 若使用默认的channels_last格式(TensorFlow后端) input_shape = (img_width, img_height, 3) # 若使用channels_first格式(Theano后端) # input_shape = (3, img_width, img_height)
3. 升级相关依赖库
如果恢复Image.py后问题仍然存在,可能是Keras或keras-preprocessing的版本兼容性问题:
- 升级Keras:
pip install --upgrade keras - 升级
keras-preprocessing:pip install --upgrade keras-preprocessing
4. 验证数据集目录结构
最后再确认一下数据集路径的结构是否符合flow_from_directory的要求:
- 确保
train_dir和validation_dir下存在对应类别的子目录,比如train目录下要有cats和dogs两个子文件夹,每个子文件夹内存放对应类别的图片; - 你已经用原始字符串(
r'...')处理路径,这部分是正确的,不用调整。
按照上面的步骤逐一排查,应该能解决这个错误。
内容的提问来源于stack exchange,提问作者Vipul Khandelwal
相关产品推荐
相关产品推荐

