我正在尝试在一些数据上训练系统,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。什么都行不通!
答案 0 :(得分:0)
在该循环的每次迭代中,您都会覆盖Sound_Fc
。因此,在循环结束时,Sound_Fc
的值为X[0,26982][4][:,0]
。你也在循环的每次迭代中一遍又一遍地重写y
相同的值,它基本上是一个值为1到16的向量。基本上,你的总数据是16点,而{{1每个值都是一个唯一值(介于1和16之间)。然后将其拆分为训练和测试数据,这样您就可以将这16个点中的5个作为测试集,其中11个是您的训练集。对于每个观察到的y输出,只有一个示例,您的网络模型抱怨它无法提取足够的信息来预测未来的y值。
如果我理解正确,你不想在每次迭代时覆盖Sound_Fc和y,而是想要将它们附加到不断增长的x和y向量上。您可以使用垂直堆叠numpy数组的vstack来完成此操作。用该循环替换以下内容:
y
之前,当您将Sound_Fc用作特征向量时,它具有形状(16,1)。现在它将具有形状(431728,1)。这个数字是26983 * 16,因为你要堆叠26983个向量,每个向量有16个元素。你的y会有形状(431728,1)。
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)])
创建一个包含26983个元素的列表,每个元素都是一个(16,1)形状的numpy数组。 [X[0,i][4][:,0] for i in range(26983)]
垂直堆叠它们以获得单个高大的(431728,1)阵列。这是你的特色向量。
np.vstack
创建一个元素为1到16的矩阵。这是形状(1,16)。通过使用np.matrix(range(1,17))
进行转置,我们将其设置为垂直,现在它的形状为(16,1)。再次,我们从这些中的26983列出一个列表,并.T
得到一个(431728,1)形状矢量,基本上从1到16然后再次变为1再次变为16,基本上重复1 -16模式一遍又一遍。这是你的输出向量。现在,对于每个输出(比如说,例如8),你有26983个数据点需要学习(一旦你将所有这些分成.66,它将是17809)。现在你的模型不会抱怨没有足够的例子用于特定的y输出。
当然可能存在与其他内容相关的其他错误(我无法查看您的数据 - 我不知道那个大vstack
中的内容)。