我正在尝试实现张量流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值的形状?
答案 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>)
...但你显然想把它设置得更大以提高效率。