背景:这是 Aurelien Geron 的教科书 Hands on Machine Learning 中的练习题之一。
问题是:编写一个函数,可以将 MNIST 图像在任何方向(左、右、上、下)移动一个像素。然后为训练集中的每个图像创建四个移动副本(每个方向一个)并将它们添加到训练集中。
我的思考过程:
我在 X_train 中有一个大小为 (59500, 784) 的 numpy 数组(每行是一个 (28,28) 图像)。对于 X_train 的每一行:
重塑为 784,0
写入空数组
将行重塑为 28,28
对于每个方向(上、下、左、右):
将新数组附加到 X_train
我的代码:
import numpy as np
from scipy.ndimage.interpolation import shift
def shift_and_append(X, n):
x_arr = np.zeros((1, 784))
for i in range(n):
for j in range(-1,2):
for k in range(-1,2):
if j!=k and j!=-k:
x_arr = np.append(x_arr, shift(X[i,:].reshape(28,28), [j, k]).reshape(1, 784), axis=0)
return np.append(X, x_arr[1:,:], axis=0)
X_train_new = shift_and_append(X_train, X_train.shape[0])
y_train_new = np.append(y_train, np.repeat(y_train, 4), axis=0)
运行需要很长时间。我觉得这是蛮力的。有没有一种有效的矢量方法来实现这一点?
慕标5832272
相关分类