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

使用卷积层进行图像特征提取(转向量)失败求助

问题分析与解决方案

核心错误点

  1. 模型定义冗余参数:第二个Conv2D层多余添加了input_shape,Keras Sequential模型仅需在第一个输入层指定该参数,后续层会自动推断输入形状,冗余参数会导致维度匹配异常。
  2. 特征提取效率低下且易出错:循环调用predict处理单样本,不仅速度慢,还可能因重复计算引发内存或维度问题。
  3. DataFrame构建逻辑错误:直接将特征向量列表作为列值存储,会导致单元格为数组对象,若不同类别样本数量不一致,会触发长度不匹配的ValueError。

修正后的代码实现

1. 修复特征提取模型

import tensorflow as tf

def get_extract_model():
    model = tf.keras.Sequential()
    # 仅在第一个卷积层指定输入形状
    model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), padding='same', activation='relu', input_shape=(28,28,1))) 
    model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=(3,3), padding='same', activation='relu'))  # 移除冗余的input_shape
    model.add(tf.keras.layers.Dropout(0.25))
    model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
    model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'))
    model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'))
    model.add(tf.keras.layers.Dropout(0.25))
    model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
    model.add(tf.keras.layers.Flatten()) 
    
    return model
    
Model = get_extract_model()
Model.summary()

2. 优化特征提取函数(批量处理)

import numpy as np

def feature_extraction(data):
    # 统一输入维度为(N, 28, 28, 1)
    if len(data.shape) == 3:
        data = data.reshape(-1, 28, 28, 1)
    elif len(data.shape) == 4 and data.shape[-1] != 1:
        data = data[..., :1]
    
    # 批量预测,提升效率并避免单样本计算异常
    vectors = Model.predict(data, batch_size=32, verbose=0)
    return vectors

3. 正确构建特征DataFrame

根据需求选择以下两种方式之一:

方式一:按类别展开特征列(每个类别对应一组特征列)
import pandas as pd

categories = ['tshirt_top', 'trouser', 'pullover', 'dress', 'coat', 
              'sandal', 'shirt', 'sneaker', 'bag', 'ankle_boot']

vector_dict = {}
for cat in categories:
    vecs = feature_extraction(df[cat])
    # 将每个特征向量的维度展开为单独列
    for idx in range(vecs.shape[1]):
        vector_dict[f"{cat}_feat_{idx}"] = vecs[:, idx]

df_vector = pd.DataFrame(vector_dict)
df_vector.head()
方式二:合并所有样本,特征+标签格式(更适合后续机器学习任务)
all_features = []
all_labels = []

for cat in categories:
    vecs = feature_extraction(df[cat])
    all_features.append(vecs)
    all_labels.extend([cat] * len(vecs))

# 合并所有特征向量
combined_features = np.concatenate(all_features, axis=0)
df_vector = pd.DataFrame(combined_features)
df_vector['label'] = all_labels
df_vector.head()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:50:22