You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Xception模型提取CNN特征触发TypeError错误该如何解决?

报错根源

os.walk() 遍历目标文件夹时,每次迭代返回的是(当前遍历目录路径, 当前目录下的子目录列表, 当前目录下的文件列表)三元组,你直接把这个三元组当成图片文件名和字符串拼接,自然触发类型错误。

修复代码

如果你的所有图片都直接存放在目标目录的根路径下,没有嵌套子文件夹,用os.listdir()替代os.walk()是最简单的方案,修改后代码如下:

import os
import numpy as np
from PIL import Image
from tqdm import tqdm
from tensorflow.keras.applications.xception import Xception
from pickle import dump

def extract_features(directory):
    model = Xception(include_top=False, pooling='avg')
    features = {}
    # 改用os.listdir遍历目录下的所有文件
    for img_name in tqdm(os.listdir(directory)):
        # 用os.path.join拼接路径,自动适配不同操作系统的路径分隔符
        filename = os.path.join(directory, img_name)
        # 过滤非文件,避免把子文件夹当成图片处理
        if not os.path.isfile(filename):
            continue
        # 可选:过滤常见图片后缀,避免读取无关文件
        if not img_name.lower().endswith(('.png', '.jpg', '.jpeg')):
            continue
        image = Image.open(filename).convert('RGB') # 加convert('RGB')避免灰度图/透明图格式报错
        image = image.resize((299,299))
        image = np.expand_dims(image, axis=0)
        image = image/127.5
        image = image - 1.0

        feature = model.predict(image, verbose=0) # 加verbose=0关闭predict的输出,和tqdm进度条兼容
        features[img_name] = feature
    return features

#2048 feature vector
features = extract_features(dataset_images)
dump(features, open("features.p","wb"))
额外调整说明
  • 增加了文件类型校验,跳过子文件夹和非图片文件,避免后续读取图片时报错
  • 新增convert('RGB')强制把图片转为三通道RGB格式,避免数据集中的灰度图、带透明通道的PNG图传入模型时触发维度不匹配报错
  • model.predict增加verbose=0参数,关闭预测过程的默认输出,避免和tqdm的进度条输出冲突导致界面混乱
  • 用os.path.join拼接路径,适配Windows、Linux等不同系统的路径分隔符规则,不会出现斜杠写反的问题

如果你的数据集是按子文件夹分类存放的,需要正确解析os.walk的返回值,修改遍历逻辑即可:

for root, dirs, img_names in tqdm(os.walk(directory)):
    for img_name in img_names:
        filename = os.path.join(root, img_name)
        # 后面的图片处理逻辑和上面一致

内容的提问来源于stack exchange,提问作者Priya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:45:00