Udacity: 作业 3: ValueError: bad input shape (1000, 10)

Posted

技术标签:

【中文标题】Udacity: 作业 3: ValueError: bad input shape (1000, 10)【英文标题】:Udacity: Assignment 3: ValueError: bad input shape (1000, 10) 【发布时间】:2016-11-12 20:47:47 【问题描述】:

我正在处理Assignment 3: Regularization。在查看了Github 之后,我尝试自己解决分配问题,但出现运行时错误。请注意,我选择了比链接更小的数据集。

情况是这样的:

print('Training set', train_dataset.shape, train_labels.shape)
print('Validation set', valid_dataset.shape, valid_labels.shape)
print('Test set', test_dataset.shape, test_labels.shape)
#Training set (20000, 784) (20000, 10)
#Validation set (1000, 784) (1000, 10)
#Test set (1000, 784) (1000, 10)

这就是问题所在:

from sklearn.linear_model import LogisticRegression

original_train_labels = train_labels

logit_clf = LogisticRegression(penalty='l2')
logit_clf.fit(train_dataset[:1000,:], original_train_labels[:1000])

运行时给出:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-4888dc0bbc75> in <module>()
      4 
      5 logit_clf = LogisticRegression(penalty='l2')
----> 6 logit_clf.fit(train_dataset[:1000,:], original_train_labels[:1000])
      7 predicted = logit_clf.predict(test_dataset)
      8 print('accuracy', accuracy((np.arange(num_labels) == predicted[:,None]).astype(np.float32), test_labels), '%')

/usr/local/lib/python2.7/dist-packages/sklearn/linear_model/logistic.pyc in fit(self, X, y, sample_weight)
   1140 
   1141         X, y = check_X_y(X, y, accept_sparse='csr', dtype=np.float64, 
-> 1142                          order="C")
   1143         check_classification_targets(y)
   1144         self.classes_ = np.unique(y)

/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.pyc in check_X_y(X, y, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
    513                         dtype=None)
    514     else:
--> 515         y = column_or_1d(y, warn=True)
    516         _assert_all_finite(y)
    517     if y_numeric and y.dtype.kind == 'O':

/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.pyc in column_or_1d(y, warn)
    549         return np.ravel(y)
    550 
--> 551     raise ValueError("bad input shape 0".format(shape))
    552 
    553 

ValueError: bad input shape (1000, 10)

知道如何解决这个问题吗?

【问题讨论】:

***.com/questions/31306390/… 嗯,谢谢@MosesKoledoye,但我不知道应该如何解决我的问题与该链接(请原谅我的无知)。你能帮我吗? :) 您的输出形状可能不合适。你能打印original_train_labels.shape吗? @MosesKoledoye 不应该是 (20000, 10) 吗?由于original_train_labels = train_labels。我现在会检查。是的,已确认。 【参考方案1】:

您对 train_labels 使用 one-hot 编码。这意味着它的形状类似于 [1000. 10],1000 个样本,每个样本有 10 个“列”,其中 1 表示我们正在谈论的类别。它是神经网络所必需的,但来自 sklearn requires 的 Logistics Regression 的形状为 [1000, 1],这意味着它应该只是 1000 行的向量,并且在每一行中你应该有一个表示目标类的 int .使用 argmax 函数将 one-hot 编码转换为整数,你应该已经准备好了。

【讨论】:

【参考方案2】:

Maxim Haytovich 是对的,您的 train_labels 的形状已经改变,您应该在将其重新格式化为 (20000, 10) 之前保留一份火车标签的副本。最初train_labels 的形状为(20000,),它是一个具有类标签值的向量,例如[1 2 4 3 ..]。逻辑回归需要这些类标签。

当您使用 train_dataset, train_labels = reformat(train_dataset, train_labels) 重新格式化时,train_labels 变为 (20000,10),而之前的 [1 2 4 3 ...] 变为 [[1 0 0 0 0 ...], [0 1 0 0 ...], [0 0 0 1 0 ...], ...],这是神经网络所需要的,但不适用于逻辑回归。

然后您分配了original_train_labels = train_labels,这意味着 original_train_labels 的形状与(20000, 10) 相同。所以你会得到错误的类标签形状的值错误。您需要在train_dataset, train_labels = reformat(train_dataset, train_labels) 之前执行步骤original_train_labels = train_labels。检查以下步骤的顺序并相应地更正您的代码gsamaras

original_train_labels = train_labels
...
...
train_dataset, train_labels = reformat(train_dataset, train_labels)
...
...
logit_clf.fit(train_dataset[:1000,:], original_train_labels[:1000])

【讨论】:

以上是关于Udacity: 作业 3: ValueError: bad input shape (1000, 10)的主要内容,如果未能解决你的问题,请参考以下文章

获取ValueError:list.remove(x):x尝试从列表中删除值时不在列表中

Udacity_deep_learning_anconda

udacity/CarND-Path-Planning-Project 工程详细配置过程——吐血整理

Python:ValueError:无法将字符串转换为浮点数:'0'

Udacity-Artificial Intelligence for Robotics 课程笔记

机器学习工程师 - Udacity 深度学习