ValueError: column_name: <Name> input_tensor dtype 必须是字符串或整数。数据类型:<数据类型:'float32'>

Posted

技术标签:

【中文标题】ValueError: column_name: <Name> input_tensor dtype 必须是字符串或整数。数据类型:<数据类型:\'float32\'>【英文标题】:ValueError: column_name: <Name> input_tensor dtype must be string or integer. dtype: <dtype: 'float32'>ValueError: column_name: <Name> input_tensor dtype 必须是字符串或整数。数据类型:<数据类型:'float32'> 【发布时间】:2020-08-11 21:53:22 【问题描述】:

[监督分类] 我正在尝试使用 tensorflow 和 keras 训练具有大量不同分类数据的模型。我不能使用 One-Hot-Encoding,因为有数百种不同的值。 因此我尝试创建一个feature_columncategorical_column_with_hash_bucket,然后将其变成feature_column.embedding_column 因此,我的数据中的字符串值正在转换为整数,然后转换为 3 维浮点向量。 训练时出现错误

ValueError: in converted code:
    relative to C:\Users\kremer\Anaconda3\lib\site-packages\tensorflow\python\feature_column:

    feature_column_v2.py:474 call
        self._state_manager)
    feature_column_v2.py:3121 get_dense_tensor
        transformation_cache, state_manager)
    feature_column_v2.py:3488 get_sparse_tensors
        transformation_cache.get(self, state_manager), None)
    feature_column_v2.py:2562 get
        transformed = column.transform_feature(self, state_manager)
    feature_column_v2.py:3466 transform_feature
        return self._transform_input_tensor(input_tensor)
    feature_column_v2.py:3444 _transform_input_tensor
        prefix='column_name:  input_tensor'.format(self.key))
    utils.py:58 assert_string_or_int
        ' dtype must be string or integer. dtype: .'.format(prefix, dtype))

    ValueError: column_name: Artikel input_tensor dtype must be string or integer. dtype: <dtype: 'float32'>.

这是我的代码:

#defining feature columns:

feature_columns = []

# numeric cols
for header in ['POS', 'DAUER_RUEST', 'UNTERBRECHUNGEN_RUEST', 'DAUER_PROD', 'UNTERBRECHUNGEN_PROD', 'GUTTEILE', 'Teile_Soll', 'Stueckzeit', 'Ruestzeit_Soll']:
  feature_columns.append(feature_column.numeric_column(header))

# categorical columns with embedding
artikel = feature_column.categorical_column_with_hash_bucket(key='Artikel' , hash_bucket_size=600, dtype=tf.dtypes.string)
artikel_embedding = feature_column.embedding_column(artikel, dimension=3)
feature_columns.append(artikel_embedding)

batchnumber = feature_column.categorical_column_with_hash_bucket(key='BA' , hash_bucket_size=600, dtype=tf.dtypes.string)
batchnumber_embedding = feature_column.embedding_column(batchnumber, dimension=3)
feature_columns.append(batchnumber_embedding)

...

#five embedding columns with this design in total

...

#building and training the model

model = tf.keras.Sequential()
model.add(feature_layer)
model.add(layers.Dense(28, activation='relu'))
model.add(layers.Dense(28, activation='relu'))
model.add(layers.Dense(1))

early_stopping = tf.keras.callbacks.EarlyStopping(patience=2)

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

early_stopping = tf.keras.callbacks.EarlyStopping(patience=3)

model.fit(train_ds,
          validation_data=val_ds,
          epochs=5,
          callbacks=[early_stopping],
          verbose = 1,
         )

【问题讨论】:

【参考方案1】:

我通过安装以下版本修复了它: 张量流:2.1.0 麻木:1.18.1 熊猫:1.0.3 Python:3.6.10

【讨论】:

【参考方案2】:

改变

artikel = feature_column.categorical_column_with_hash_bucket(key='Artikel' , hash_bucket_size=600, dtype=tf.dtypes.string)

artikel = feature_column.categorical_column_with_hash_bucket(key='Artikel' , hash_bucket_size=600, dtype=tf.dtypes.float)

因为您在 categorical_column_with_hash_bucket 中将 artikel 定义为 string。 虽然我不熟悉 Keras,但我认为在您的 model.fit 中,artikel 中的 train_ds 是 float 的一个实例。 在tensorflow estimator中,tf.estimator.TrainSpecinput_fn 需要具体的dtype。

【讨论】:

感谢您的回答。 Artikel 列元素的数据类型是tf.int64。遗憾的是,根据您的建议更改我的代码并没有奏效。我认为问题可能是我的张量的形状。当我输入 print(train_ds) 时,我得到 (?, ) 作为 Artikel 和所有其他人的结果。

以上是关于ValueError: column_name: <Name> input_tensor dtype 必须是字符串或整数。数据类型:<数据类型:'float32'>的主要内容,如果未能解决你的问题,请参考以下文章

data['column_name'] 与 data.column_name [重复] 之间是不是存在显着差异

Sum(column_name) 和 sum(column_name) over (partition by id) 有啥区别

使用 column_name 函数取消透视表

“COLUMN_NAME”附近:SQLite 中的语法错误(代码 1)

数据库中所有列的逗号分隔列表 (Tablename | Column_names...)

在视图上显示数据时尝试获取非对象的属性“column_name”