ValueError: column_name: <Name>input_tensor dtype должен быть строкой или целым числом. DTYPE: - PullRequest
0 голосов
/ 28 апреля 2020

[контролируемая классификация] Я пытаюсь обучить модель с большим количеством различных категориальных данных с тензорным потоком и керасом. Я не могу go с 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,
         )

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Я исправил это, установив следующие версии: Tensorflow: 2.1.0 numpy: 1.18.1 pandas: 1.0.3 Python: 3.6.10

0 голосов
/ 29 апреля 2020

изменить

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)

Поскольку вы определяете artikel как string в categoryorical_column_with_hash_bucket. Несмотря на то, что я не знаком с Keras, я думаю, что ваш model.fit, artikel в train_ds является экземпляром float. Для оценки тензорного потока tf.estimator.TrainSpec input_fn необходимо указать c dtype.

...