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.TrainSpec
input_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”附近:SQLite 中的语法错误(代码 1)