【问题标题】:Deep Learning IndexError: too many indices for array深度学习索引错误:数组索引过多
【发布时间】:2015-09-09 13:05:48
【问题描述】:

我正在尝试根据一些数据训练系统,Sound_Fc 是一个 16X1 浮点数组。

for i in range(0,26983):

    Block_coo = X[0,i]
    Fc = Block_coo[4]
    Sound_Fc = Fc[:,0]
    Vib_Fc = Fc[:,1]
    y = np.matrix([[1.0],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]])

testX, trainY, testY) = train_test_split(
 Sound_Fc, y, test_size = 0.33, random_state=42)

dbn = NeuralNet(
        layers=[
            ('input', layers.InputLayer),
            ('hidden', layers.DenseLayer),
            ('output', layers.DenseLayer),
            ],
        input_shape = (None, trainX.shape[0]),
        hidden_num_units=8,
        output_num_units=4,
        output_nonlinearity=softmax,

        update=nesterov_momentum,
        update_learning_rate=0.3,
        update_momentum=0.9,

        regression=False,
        max_epochs=5,
        verbose=1,

        )

    dbn.fit(trainX,trainY)

但是我收到了这个错误

Warning (from warnings module):
  File "C:\Users\Essam Seddik\AppData\Roaming\Python\Python27\site-packages\sklearn\cross_validation.py", line 399
% (min_labels, self.n_folds)), Warning)
Warning: The least populated class in y has only 1 members, which is too few. The minimum number of labels for any class cannot be less than n_folds=5.

 Traceback (most recent call last):
  File "C:\Essam Seddik\Deep Learning Python Tutorial\DNV_DeepLearn.py", line 77, in <module>
dbn.fit(trainX,trainY)
  File "C:\Python27\lib\site-packages\nolearn-0.6adev-py2.7.egg\nolearn\lasagne\base.py", line 293, in fit
self.train_loop(X, y)
  File "C:\Python27\lib\site-packages\nolearn-0.6adev-py2.7.egg\nolearn\lasagne\base.py", line 300, in train_loop
X, y, self.eval_size)
  File "C:\Python27\lib\site-packages\nolearn-0.6adev-py2.7.egg\nolearn\lasagne\base.py", line 401, in train_test_split
kf = StratifiedKFold(y, round(1. / eval_size))
  File "C:\Users\Essam Seddik\AppData\Roaming\Python\Python27\site-packages\sklearn\cross_validation.py", line 416, in __init__
label_test_folds = test_folds[y == label]
IndexError: too many indices for array

我尝试用 xrange 代替 range,用 y=list() 代替定义的 y。我还尝试了 for 循环范围内的小数字,例如 5、10 和 100,而不是 26983。 我尝试了 np.array 和 np.ndarray 和 np.atleast_2d。没有任何效果!

【问题讨论】:

    标签: python-2.7 numpy scikit-learn


    【解决方案1】:

    在该循环的每次迭代中,您都会覆盖Sound_Fc。因此,在循环结束时,Sound_Fc 的值是X[0,26982][4][:,0]。您还在循环的每次迭代中一遍又一遍地用相同的值覆盖 y,它基本上是一个值从 1 到 16 的向量。基本上,您的总数据是 16 个点,y 的值是每个都是唯一值(介于 1 和 16 之间)。然后你把它分成训练和测试数据,所以你把这 16 个点中的 5 个作为测试集,将其中的 11 个作为训练集。对于每个观察到的 y 输出只有一个示例,您的网络模型抱怨它无法提取足够的信息来预测未来的这些 y 值。

    如果我理解正确,您不想在每次迭代时覆盖 Sound_Fc 和 y,而是希望将它们附加到不断增长的 x 和 y 向量中。您可以通过使用垂直堆叠 numpy 数组的 vstack 来做到这一点。用该循环替换以下内容:

    Sound_Fc = np.vstack( [X[0,i][4][:,0] for i in range(26983)] )
    y = np.vstack([np.matrix(range(1,17)).T for i in range(26983)])
    

    之前,当您将 Sound_Fc 用作特征向量时,它的形状为 (16,1)。现在它将具有形状 (431728, 1)。这个数字是 26983*16,因为您要堆叠 26983 个向量,每个向量有 16 个元素。您的 y 将具有形状 (431728, 1)。

    [X[0,i][4][:,0] for i in range(26983)] 创建一个包含 26983 个元素的列表,每个元素是一个 (16,1) 形状的 numpy 数组。 np.vstack 将它们垂直堆叠以获得单个高 (431728, 1) 数组。这是你的特征向量。

    np.matrix(range(1,17)) 创建一个包含元素 1 到 16 的矩阵。它的形状为 (1, 16)。通过使用.T 对其进行转置,我们使其垂直,现在它的形状为 (16,1)。再次,我们从其中的 26983 个列表中列出,vstack 他们得到一个 (431728, 1) 形状向量,基本上从 1 到 16,然后再到 1 再到 16,基本上重复 1-16模式一遍又一遍。这是您的输出向量。现在,对于每个输出(例如 8 个),您有 26983 个数据点可供学习(一旦您将所有这些中的 0.66 个拆分为您的训练集,它将是 17809 个)。现在,您的模型不会抱怨没有足够的示例用于特定的 y 输出。

    当然可能还有其他与其他内容相关的错误(我看不到你的数据——我不知道那个大 X 里有什么)。

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2021-07-20
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      相关资源
      最近更新 更多