MNIST图像平移扩充训练集时触发AttributeError错误求助
错误原因及解决方案
错误原因
- scipy shift函数参数传错:
scipy.ndimage.shift的第二个参数需要是包含x、y方向位移的元组(比如(shift_x, shift_y)),你把shift_x和shift_y作为两个独立参数传入,导致函数内部错误处理参数,触发'int' object has no attribute 'shape'报错。 - pandas concat用法错误:
pd.concat要求传入可迭代的pandas对象集合(比如列表),你直接把原数据集和单个一维数组传入,既不符合参数要求,也无法将数组直接与DataFrame/Series合并。 - 标签追加方式错误:如果
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
相关产品推荐
相关产品推荐

