Apache spark ValueError:要素列的项必须是要素列。(Tensorflow 1.13)

Apache spark ValueError:要素列的项必须是要素列。(Tensorflow 1.13),apache-spark,tensorflow,tensorflow-estimator,horovod,petastorm,Apache Spark,Tensorflow,Tensorflow Estimator,Horovod,Petastorm,运行Tensorflow-1.13+Horovod-0.16+Spark-0.24+Petastorm-0.17时,我遇到了一个值错误。它是一个模型fn和一些指示符列的简单实现,但是抛出了一个类似于的错误 错误是 [1,1]<stderr>: features, labels, model_fn_lib.ModeKeys.TRAIN, self.config) [1,1]<stderr>: File "/usr/local/lib/python3.5/site-p

运行Tensorflow-1.13+Horovod-0.16+Spark-0.24+Petastorm-0.17时,我遇到了一个值错误。它是一个模型fn和一些指示符列的简单实现,但是抛出了一个类似于的错误

错误是

[1,1]<stderr>:    features, labels, model_fn_lib.ModeKeys.TRAIN, self.config)
[1,1]<stderr>:  File "/usr/local/lib/python3.5/site-packages/tensorflow_estimator/python/estimator/estimator.py", line 1112, in _call_model_fn
[1,1]<stderr>:    model_fn_results = self._model_fn(features=features, **kwargs)
[1,1]<stderr>:  File "/mnt/Optimitron/optimitron_spark_tf.py", line 616, in tf_model_fn
[1,1]<stderr>:  File "/usr/local/lib/python3.5/site-packages/tensorflow/python/feature_column/feature_column.py", line 302, in input_layer
[1,1]<stderr>:    cols_to_output_tensors=cols_to_output_tensors)
[1,1]<stderr>:  File "/usr/local/lib/python3.5/site-packages/tensorflow/python/feature_column/feature_column.py", line 181, in _internal_input_layer
[1,1]<stderr>:    feature_columns = _normalize_feature_columns(feature_columns)
[1,1]<stderr>:  File "/usr/local/lib/python3.5/site-packages/tensorflow/python/feature_column/feature_column.py", line 2263, in _normalize_feature_columns
[1,1]<stderr>:    'Given (type {}): {}.'.format(type(column), column))
[1,1]<stderr>:ValueError: Items of feature_columns must be a _FeatureColumn. Given (type <class 'collections.IndicatorColumn'>): IndicatorColumn(categorical_column=VocabularyListCategoricalColumn(...
模型_fn只是一个线性分类器:

def tf_model_fn(特性、标签、模式、参数):
"""
Args:
特征:这是从传递给训练、评估和预测的输入返回的第一项。
这应该是一个单一的tf。张量或相同的dict。
标签:这是从传递给训练、评估和预测的输入返回的第二项。
这应该是一个相同的tf.张量或dict(对于多头模型)。
如果模式为tf.estimator.ModeKeys.PREDICT,则将传递标签=无。
如果model_fn的签名不接受mode,model_fn必须仍然能够处理labels=None。
模式(tf.estimator.ModeKeys):可选。指定此训练、评估还是预测。请参阅tf.estimator.ModeKeys。
params(dict):从估计器实例化接收的超参数的可选dict
返回:
tf.estimator.estimator规范:
"""
将horovod.tensorflow作为hvd导入
#建立稠密模型
net=tf.feature\u column.input\u层(features,list(参数['feature\u columns']))
对于参数['hidden_units']中的单位:
net=tf.layers.dense(net,units=units,activation=tf.nn.relu)
logits=tf.layers.densed(净,1,激活=无)
#生成预测(用于预测和评估模式)
概率=tf.nn.sigmoid(logits)
预测={
“概率”:概率,
“logits”:logits,
}
#计算日志损失(用于乙状结肠激活)
#y_列形状重塑((y_列形状[0],1))
标签\u重塑=tf.重塑(标签,[-1,1])
损失=tf.loss.sigmoid\u交叉熵(多类标签=labels\u重塑,logits=logits)
#损失=tf.损失.日志损失(标签、概率)
如果模式==tf.estimator.ModeKeys.TRAIN:
optimizer=params.get('optimizer',hvd.DistributedOptimizer(tf.train.FtrlOptimizer(learning_rate=params[“learning_rate”]))
列车运行=优化器。最小化(
损失=损失,
global\u step=tf.train.get\u global\u step()
)
返回tf.estimator.EstimatorSpec(模式=模式,损耗=损耗,列车运行=列车运行)
elif mode==tf.estimator.ModeKeys.EVAL:
返回tf.estimator.EstimatorSpec(模式=模式,损失=损失)
elif mode==tf.estimator.ModeKeys.PREDICT:
返回tf.estimator.EstimatorSpec(模式=模式,预测=预测)
其他:
引发异常(“错误模式!”)
模型是通过

horovod.spark.run(tf\u model\u fn,feature\u columns,…)
我知道所有列的传递都是正确的,但从另一个相关问题来看,Spark是如何为Tensorflow打包列的