Tensorflow feature_column期望与输入数据不同的形状

时间:2018-04-12 13:09:34

标签: python numpy tensorflow tensorflow-datasets tensorflow-estimator

我正在尝试实现张量流Estimator,并且遇到形状不匹配错误我不知道如何调试。我想我可能会误解如何指定tf.feature_column的形状。我的目的是创建一个具有6010输入的模型。任何建议将不胜感激。

def train_input_fn():
    with np.load(TRAIN_NN_FEATURES) as train:
        train_features = train['features']                                                                   
        train_labels = train['labels']                                                       
    train_dataset = tf.data.Dataset.from_tensor_slices(
            ({'all_features': train_features}, train_labels))     
    train_iterator = train_dataset.make_one_shot_iterator()                                                  
    return train_iterator.get_next()     

all_features = tf.feature_column.numeric_column(
    'all_features', 
    shape=(6010,), 
    dtype=tf.float64
) 

estimator = tf.estimator.DNNClassifier( 
    feature_columns=[all_features],
    hidden_units=[1024, 512, 256]
)

estimator.train(input_fn=train_input_fn)

当我运行它时,我收到以下错误:

InvalidArgumentError (see above for traceback): Input to reshape 
is a tensor with 6010 values, but the requested shape has 36120100

[[Node: dnn/input_from_feature_columns/input_layer/all_features/Reshape = 
Reshape[T=DT_FLOAT, Tshape=DT_INT32, _device="/job:localhost/replica:0/task:0/device:CPU:0"]
(dnn/input_from_feature_columns/input_layer/all_features/ToFloat, 
dnn/input_from_feature_columns/input_layer/all_features/Reshape/shape)]]

数据的形状正如我所料,但feature_column似乎期待它的正方形。

>>> train_features.shape
(10737, 6010)
>>>train_labels.shape
(10737, 1)
>>> 36120100./6010
6010.0

我的理解是Dataset.from_tensor_slices沿着给定张量的轴0获取切片,这对应于错误消息“重新整形的输入是具有6010值的张量”。但是为什么要求36120100值的形状?

1 个答案:

答案 0 :(得分:0)

  

我仍然想知道为什么以上不起作用,或者如何调试。

问题在于train_iterator.get_next()产生的张量大小。如果未指定批处理大小,则迭代器返回:

({'all_features': <tf.Tensor 'IteratorGetNext:0' shape=(6010,) dtype=float64>}, 
 <tf.Tensor 'IteratorGetNext:1' shape=(1,) dtype=float64>)

......元组。正如您所看到的,张量形状的特征是(6010,)DNNClassifier解释为batch_size=6010(按照惯例,第一个维度是批量大小),它仍然需要6010特征。因此错误:它无法将(6010,)重塑为(6010, 6010)

为了使其正常工作,您必须手动重塑此张量,或者只需调用以下方法设置批量大小:

train_dataset = train_dataset.batch(16)

即使批量大小1也可以,因为它会强制get_next张量为:

({'all_features': <tf.Tensor 'IteratorGetNext:0' shape=(?, 6010) dtype=float64>}, 
 <tf.Tensor 'IteratorGetNext:1' shape=(?, 1) dtype=float64>)

...但你显然想把它设置得更大以提高效率。