我有以下形式的mnist训练列表:
def load_data(): f = gzip.open('mnist.pkl.gz', 'rb') training_data, validation_data, test_data = cPickle.load(f, encoding='latin1') f.close()def load_data_wrapper(): tr_d, va_d, te_d = load_data() training_inputs = [np.reshape(x, (784, 1)) for x in tr_d[0]] training_results = [vectorized_result(y) for y in tr_d[1]] training_data = list(zip(training_inputs, training_results)) ........................................
现在我想对我的训练输入进行预处理,使其具有零均值和单位方差。因此,我在以下代码中使用了from sklearn import preprocessing
:
def SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None): if test_data: n_test = len(test_data) preprocessed_training = preprocessing.scale(training_data) n = len(preprocessed_training) for j in range(epochs): random.shuffle(preprocessed_training) mini_batches = [ training_data[k:k+mini_batch_size]..... ....................
然而,我遇到了以下错误:
ValueError: setting an array element with a sequence.
我正在修改来自mnielsen的代码,可以在这里找到。我是Python和机器学习的新手。如果有人能帮我解决这个问题,我将不胜感激。注意: 如果您认为有更好的库选项,请告诉我。
更新_1: 这是我另一次尝试,但得到了相同的错误。
scaler = StandardScaler() scaler.fit(training_data) training_data = scaler.transform(training_data) if test_data: test_data = scaler.transform(test_data)
更新_2: 我尝试了建议答案中使用pandas数据框提供的解决方案,但我仍然得到相同的错误。
更新_3 : 所以它是对象类型,但我需要浮点类型来执行缩放器。我做了以下操作: training_data = np.asarray(training_data).astype(np.float64)
但我仍然得到错误!
更新_4 : 一般mnist数据集结构: 50k训练图像,10k测试图像。在50k图像中,每个图像为28 * 28像素,这给出了784个数据点。例如,MNIST中的一个数据点,如果它的原始输出是5,那么它是(array([ 0., 0., 0., ..., 0., 0., 0.], dtype=float32), 5)
)元组。你可以看到元组中的第一个元素是一个稀疏矩阵。这里是训练数据集的一个例子,元组的第一个元素(即具有784个灰度浮点数的输入图像)。对于元组的第二个元素,我们只给出从0到9的数字作为输出。然而,在独热编码中,我们给出一个10D向量,其中除了输出值的索引外,所有索引值都为零。所以对于数字5,它将是[[0],[0],[0],[0],[0],[1],[0],[0],[0],[0]]
。我使用的包装器修改可以在这里找到。
回答:
我遇到的问题是因为from sklearn.preprocessing import StandardScaler
改变了我的数据维度。不是使用StandardScaler
,我只是对我的(50k,(784,1))
维数据集中的每个输入使用preprocessing.scale
。也就是说,我对每个(784,1)数据使用scale函数,axis = 1
,并使用for循环添加它们。这减慢了程序的速度,但有效。如果有人知道更好的方法,请在回答部分告诉我。