2016-10-22 83 views
0

我遇到了张力流中的形状误差,我无法弄清楚。使用Tensorflow进行形状误差(tf.learn,DNNClassifier)

如果我使用tf.learn运行与虹膜数据集的一个基本的演示,它看起来像这样:

iris = datasets.load_iris() 
x_iris = iris.data 
y_iris = iris.target 
>>> x_iris.shape 
(150, 4) 
>>> y_iris.shape 
(150,) 
>>> type(x_iris) 
<class 'numpy.ndarray'> 

看起来不错。我运行这个代码:

feature_columns = [ tf.contrib.layers.real_valued_column("", dimension = 4) ] 
classifier = tf.contrib.learn.DNNClassifier(feature_columns = feature_columns, hidden_units = [ 10, 20, 10 ], n_classes = 3, model_dir = "/tmp/iris_model") 
classifier.fit(x = x_iris, y = y_tiris, steps = 2000) 

它的工程很棒!这很好。

现在,我有一个数据集泰坦尼克号我已经与来自于Kaggle工作完全相同的情况:

>>> x_titanic.shape 
(700, 14) 
>>> y_titanic.shape 
(700,) 
>>>type(x_titanic) 
<class 'numpy.ndarray'> 

相同的形状,相同类型的。应该可以。我运行相同的代码:

feature_columns = [ tf.contrib.layers.real_valued_column("", dimension = 14) ] 
classifier = tf.contrib.learn.DNNClassifier(feature_columns = feature_columns, hidden_units = [ 10, 20, 10 ], n_classes = 2, model_dir = "/tmp/iris_model") 
classifier.fit(x = x_titanic, y = y_titanic, steps = 2000) 

而且我得到这个错误:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/learn/python/learn/estimators/dnn.py", line 435, in fit 
    max_steps=max_steps) 
    File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 333, in fit 
    max_steps=max_steps) 
    File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 662, in _train_model 
    train_op, loss_op = self._get_train_ops(features, targets) 
    File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 963, in _get_train_ops 
    _, loss, train_op = self._call_model_fn(features, targets, ModeKeys.TRAIN) 
    File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 944, in _call_model_fn 
    return self._model_fn(features, targets, mode=mode, params=self.params) 
    File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/learn/python/learn/estimators/dnn.py", line 258, in _dnn_classifier_model_fn 
    weight=_get_weight_tensor(features, weight_column_name)) 
    File "/usr/local/lib/python3.4/dist-packages/tensorflow/contrib/losses/python/losses/loss_ops.py", line 329, in sigmoid_cross_entropy 
    logits.get_shape().assert_is_compatible_with(multi_class_labels.get_shape()) 
    File "/usr/local/lib/python3.4/dist-packages/tensorflow/python/framework/tensor_shape.py", line 750, in assert_is_compatible_with 
    raise ValueError("Shapes %s and %s are incompatible" % (self, other)) 
ValueError: Shapes (?, 1) and (?,) are incompatible 

这是为什么?它看起来像有一个与y_titanic形状的问题:

sigmoid_cross_entropy 
logits.get_shape().assert_is_compatible_with(multi_class_labels.get_shape()) 

由于这只是二进制(0,1),但这是DNNClassifier默认。有什么特别的我需要改变吗?我必须tf.one_hot y矢量吗?

回答

0

转到here并下载最新的WHL文件,将修复这个bug。