ValueError: 标签形状必须为 [batch_size, labels_dimension],得到 (128, 2)

Posted

技术标签:

【中文标题】ValueError: 标签形状必须为 [batch_size, labels_dimension],得到 (128, 2)【英文标题】:ValueError: labels shape must be [batch_size, labels_dimension], got (128, 2) 【发布时间】:2018-02-09 19:01:57 【问题描述】:

在 Python 3.5.2 中使用 TensorFlow 版本 1.3.0。我试图在 TensorFlow 网站上的 Iris 数据教程中模仿 DNNClassifier 的功能,但遇到了困难。我正在导入一个包含大约 155 行数据和 15 列的 CSV 文件,将数据分解为训练和测试数据(我尝试对正面或负面运动进行分类),并在开始训练我的分类器时收到错误.以下是数据的设置方式

    #import values from csv
    mexicof1 = pd.read_csv('Source/mexicoR.csv')

    #construct pandas dataframe
    mexico_df = pd.DataFrame(mexicof1)
    #start counting from mexico.mat.2.nrow.mexico.mat...1.
    mexico_dff = pd.DataFrame(mexico_df.iloc[:,1:16])
    mexico_dff.columns = ['tp1_delta','PC1','PC2','PC3','PC4','PC5','PC6','PC7', \
                  'PC8', 'PC9', 'PC10', 'PC11', 'PC12', 'PC13', 'PC14']


    #binary assignment for positive/negative values
    for i in range(0,155):
        if(mexico_dff.iloc[i,0] > 0):
            mexico_dff.iloc[i,0] = "pos"
        else:
            mexico_dff.iloc[i,0] = "neg"

    #up movement vs. down movement classification set up
    up = np.asarray([1,0])
    down = np.asarray([0,1])
    mexico_dff['tp1_delta'] = mexico_dff['tp1_delta'].map("pos": up, "neg": down)


    #Break into training and test data
    #data: independent values
    #labels: classification
    mexico_train_DNN1data = mexico_dff.iloc[0:150, 1:15]
    mexico_train_DNN1labels = mexico_dff.iloc[0:150, 0]
    mexico_test_DNN1data = mexico_dff.iloc[150:156, 1:15]
    mexico_test_DNN1labels = mexico_dff.iloc[150:156, 0]

    #Construct numpy arrays for test data
    temptrain = []
    for i in range(0, len(mexico_train_DNN1labels)):
        temptrain.append(mexico_train_DNN1labels.iloc[i])
    temptrainFIN = np.array(temptrain, dtype = np.float32)

    temptest = []
    for i in range(0, len(mexico_test_DNN1labels)):
        temptest.append(mexico_test_DNN1labels.iloc[i])
    temptestFIN = np.array(temptest, dtype = np.float32)

    #set up NumPy arrays
    mTrainDat = np.array(mexico_train_DNN1data, dtype = np.float32)
    mTrainLab = temptrainFIN
    mTestDat = np.array(mexico_test_DNN1data, dtype = np.float32)
    mTestLab = temptestFIN

这样做会得到如下所示的数据:

    #Independent value output
    mTestDat
    Out[289]: 
    array([[-0.08404002, -3.07483053,  0.41106853, ..., -0.08682428,
     0.32954004, -0.36451185],
   [-0.31538665, -2.23493481,  1.97653472, ...,  0.35220796,
     0.09061374, -0.59035355],
   [ 0.44257978, -3.04786181, -0.6633662 , ...,  1.34870672,
     0.43879321,  0.26306254],
   ..., 
   [ 2.38574553,  0.09045095, -0.09710167, ...,  1.20889878,
     0.00937434, -0.06398607],
   [ 1.68626559,  0.65349185,  0.23625408, ..., -1.16267788,
     0.45464727, -1.14916229],
   [ 1.58263958,  0.1223636 , -0.12084256, ...,  0.7947616 ,
    -0.47359121,  0.28013545]], dtype=float32)

    #Classification labels (up or down movement) output
    mTestLab
    Out[290]: 
    array([[ 0.,  1.],
   [ 0.,  1.],
   [ 0.,  1.],
   [ 1.,  0.],
   [ 0.,  1.],
   [ 1.,  0.],
    ........
   [ 1.,  0.],
   [ 0.,  1.],
   [ 0.,  1.],
   [ 0.,  1.]], dtype=float32)

按照给定设置中的教程进行操作后,我可以在分类器.train() 函数停止运行之前运行代码并给出以下错误:

    # Specify that all features have real-value data
    feature_columns = [tf.feature_column.numeric_column("x", shape=[mexico_train_DNN1data.shape[1]])]

    # Build 3 layer DNN with 10, 20, 10 units respectively.
    classifier = tf.estimator.DNNClassifier(feature_columns=feature_columns,
                                    hidden_units=[10, 20, 10],
                                    optimizer = tf.train.AdamOptimizer(0.01),
                                    n_classes=2) #representing either an up or down movement


    train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x = "x": mTrainDat,
    y = mTrainLab,
    num_epochs = None,
    shuffle = True)

    #Now, we train the model
    classifier.train(input_fn=train_input_fn, steps = 2000)


      File "Source\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\estimator\canned\head.py", line 174, in _check_labels
(static_shape,))

    ValueError: labels shape must be [batch_size, labels_dimension], got (128, 2).

我不确定为什么会遇到此错误,感谢任何帮助。

【问题讨论】:

【参考方案1】:

DNNClassifier 需要一个类标签(即 0 或 1)时,您正在使用单热([1, 0] 或 [0, 1])编码标签。在最后一个轴上解码 one-hot 编码,使用

class_labels = np.argmax(one_hot_vector, axis=-1)

注意二进制文件可能会更快

class_labels = one_hot_vector[..., 1].astype(np.int32)

虽然性能差异不会很大,但我可能会使用更通用的版本,以防您稍后添加另一个类。

在您的情况下,生成 numpy 标签后,只需添加

mTrainLab = np.argmax(mTrainLab, axis=-1)
mTestLab = np.argmax(mTestLab, axis=-1)

【讨论】:

我在使用自定义估计器时遇到同样的问题,它根据本指南实例化 tf.estimator.Estimator:https://www.tensorflow.org/guide/custom_estimators。该代码适用于标签的整数编码,但使用一种热编码失败。这也是预期的吗? 取决于你有什么损失。 tf.losses.sparse_softmax_cross_entropy 需要非 one-hot 标签,而 tf.losses.softmax_cross_entropy 需要 one-hot 标签。具体功能见 tensorflow 文档。

以上是关于ValueError: 标签形状必须为 [batch_size, labels_dimension],得到 (128, 2)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:logits 和标签必须具有相同的形状 ((None, 4) vs (None, 1))

ValueError:logits 和标签必须具有相同的形状 ((None, 23, 23, 1) vs (None, 1))

ValueError:尝试对 IMDB 评论进行分类时,logits 和标签必须具有相同的形状((无,1)与(无,10000))

TensorFlow ValueError:logits 和标签必须具有相同的形状 ((25, 1) vs (1, 1))

Tensorflow:ValueError:形状必须排名2但排名3

Keras ValueError:尺寸必须相等,但对于 'node Equal 输入形状为 2 和 32:[?,2], [?,32,32]