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

MNIST图像平移扩充训练集时触发AttributeError错误求助

错误原因及解决方案

错误原因

  1. scipy shift函数参数传错:scipy.ndimage.shift的第二个参数需要是包含x、y方向位移的元组(比如(shift_x, shift_y)),你把shift_x和shift_y作为两个独立参数传入,导致函数内部错误处理参数,触发'int' object has no attribute 'shape'报错。
  2. pandas concat用法错误:pd.concat要求传入可迭代的pandas对象集合(比如列表),你直接把原数据集和单个一维数组传入,既不符合参数要求,也无法将数组直接与DataFrame/Series合并。
  3. 标签追加方式错误:如果y_train是pandas Series,append方法已被弃用,且循环中逐个追加元素效率极低,还容易引发类型问题。

修正后的代码

推荐用numpy数组处理(更适配MNIST图像数据)

from scipy.ndimage import shift
import numpy as np

def shift_image(image, shift_x, shift_y):
    image = image.reshape(28, 28)
    # 修正位移参数:打包成元组传入
    shifted_image = shift(image, (shift_x, shift_y))
    return shifted_image.reshape(-1)

# 假设X_train、y_train是numpy数组(常见的MNIST加载格式)
X_train_expansion = [X_train]
y_train_expansion = [y_train]

for shift_x, shift_y in ((0,1), (0,-1), (1,0), (-1,0)):
    # 批量生成平移后的图像
    shifted_images = np.array([shift_image(img, shift_x, shift_y) for img in X_train])
    X_train_expansion.append(shifted_images)
    y_train_expansion.append(y_train)

# 一次性合并所有扩展数据
X_train_expansion = np.concatenate(X_train_expansion, axis=0)
y_train_expansion = np.concatenate(y_train_expansion, axis=0)

若坚持用pandas处理

from scipy.ndimage import shift
import pandas as pd
import numpy as np

def shift_image(image, shift_x, shift_y):
    # 兼容pandas Series和numpy数组输入
    image = image.values.reshape(28,28) if isinstance(image, pd.Series) else image.reshape(28,28)
    shifted_image = shift(image, (shift_x, shift_y))
    return pd.Series(shifted_image.reshape(-1))

X_train_expansion = [X_train.copy()]
y_train_expansion = [y_train.copy()]

for shift_x, shift_y in ((0,1), (0,-1), (1, 0), (-1, 0)):
    shifted_df = pd.DataFrame([shift_image(img, shift_x, shift_y) for img in X_train.to_numpy()])
    X_train_expansion.append(shifted_df)
    y_train_expansion.append(y_train.copy())

# 合并并重置索引
X_train_expansion = pd.concat(X_train_expansion, ignore_index=True)
y_train_expansion = pd.concat(y_train_expansion, ignore_index=True)

关键修改点

  • 修正shift函数的参数传递方式,将位移打包成元组传入。
  • 先把所有扩展数据存入列表,再一次性合并,避免循环中反复合并的效率问题和类型错误。
  • 采用批量生成平移图像的方式,替代逐个循环追加,提升代码运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:00:13