为什么在使用tensorflow时会收到警告/错误(使用函数API,但未实现错误)

2024-09-27 16:19:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图学习本教程,但我的数据是:https://www.tensorflow.org/tutorials/structured_data/feature_columns

我所有的数据都是数值

当我运行这部分代码时:

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])


history = model.fit(train_ds, validation_data=test_ds, epochs=100, use_multiprocessing=True)

对于所有参数,我都会收到此类警告:

WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'age': <tf.Tensor 'ExpandDims_8:0' shape=(None, 1) dtype=int64>,

对于每个变量,我将收到两次此警告

然后我得到了这个错误:

UnimplementedError:  Cast string to float is not supported
 [[node sequential_7/dense_features_7/calprotectin/Cast (defined at <ipython-input-103-5689ba5df442>:5) ]] [Op:__inference_train_function_4860]

问题是什么?如何解决

编辑1

我试着用样本数据模拟我的代码和错误,我想出了这个代码

代码不会生成错误,但会生成警告。所以问题在于我读到的数据。产生这种错误的输入数据会出现什么问题

(这是一个jupyter代码,我如何将其发布在这里?)

%reset
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow import feature_column
from sklearn.model_selection import train_test_split

RANDOM_SEED = 42

data=pd.DataFrame()
data['sex']=[1,2,2,1,2,2,1,1,2,1]
data['age']=[10,11,13,45,67,34,23,62,82,78]
data['bmi']=[22.5,28.8,19,23.3,26,18.4,27.5,29,30.3,25.9]
data['smoker']=[1,2,2,3,3,2,2,1,1,1]
data['lab1']=[144,124,126,146,130,124,171,147,131,138]
data['lab2']=[71,82,75,65,56,89,55,74,78,69]
data['result']=[1,2,2,4,3,2,1,3,2,4]

feature_columns = []
for header in ['sex','age', 'bmi','smoker', 'lab1', 'lab2']:
  feature_columns.append(tf.feature_column.numeric_column(header))

def create_dataset(dataframe, batch_size=32):
    dataframe = dataframe.copy()
    labels = dataframe.pop('result')
    return tf.data.Dataset.from_tensor_slices((dict(dataframe), labels)) \
      .shuffle(buffer_size=len(dataframe)) \
      .batch(batch_size)

train, test = train_test_split(data, test_size=0.2, random_state=RANDOM_SEED)
train_ds = create_dataset(train)
test_ds = create_dataset(test)

model = tf.keras.models.Sequential([
  tf.keras.layers.DenseFeatures(feature_columns=feature_columns),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(.1),
  tf.keras.layers.Dense(1)
])

model.compile(optimizer='adam',
          loss='binary_crossentropy',
          metrics=['accuracy'])

history = model.fit(train_ds, validation_data=test_ds, epochs=100, use_multiprocessing=True)

当我运行上述代码时,我收到以下警告:

Epoch 1/100
WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'sex': <tf.Tensor 'ExpandDims_4:0' shape=(None, 1) dtype=int64>, 'age': <tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=int64>, 'bmi': <tf.Tensor 'ExpandDims_1:0' shape=(None, 1) dtype=float64>, 'smoker': <tf.Tensor 'ExpandDims_5:0' shape=(None, 1) dtype=int64>, 'lab1': <tf.Tensor 'ExpandDims_2:0' shape=(None, 1) dtype=int64>, 'lab2': <tf.Tensor 'ExpandDims_3:0' shape=(None, 1) dtype=int64>}
Consider rewriting this model with the Functional API.
WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'sex': <tf.Tensor 'ExpandDims_4:0' shape=(None, 1) dtype=int64>, 'age': <tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=int64>, 'bmi': <tf.Tensor 'ExpandDims_1:0' shape=(None, 1) dtype=float64>, 'smoker': <tf.Tensor 'ExpandDims_5:0' shape=(None, 1) dtype=int64>, 'lab1': <tf.Tensor 'ExpandDims_2:0' shape=(None, 1) dtype=int64>, 'lab2': <tf.Tensor 'ExpandDims_3:0' shape=(None, 1) dtype=int64>}
Consider rewriting this model with the Functional API.
1/1 [==============================] - ETA: 0s - loss: -22.8739 - accuracy: 0.2500WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor, but we receive a <class 'dict'> input: {'sex': <tf.Tensor 'ExpandDims_4:0' shape=(None, 1) dtype=int64>, 'age': <tf.Tensor 'ExpandDims:0' shape=(None, 1) dtype=int64>, 'bmi': <tf.Tensor 'ExpandDims_1:0' shape=(None, 1) dtype=float64>, 'smoker': <tf.Tensor 'ExpandDims_5:0' shape=(None, 1) dtype=int64>, 'lab1': <tf.Tensor 'ExpandDims_2:0' shape=(None, 1) dtype=int64>, 'lab2': <tf.Tensor 'ExpandDims_3:0' shape=(None, 1) dtype=int64>}
Consider rewriting this model with the Functional API.

模型拟合完成后,精度为零。我知道数据无效,也不期望精度为零的位


Tags: testnoneinputdatamodeltftensorflowtrain
2条回答

训练模型时没有改进的原因是因为您对多标签使用了BinaryCrossentropy丢失,请按照以下两种情况处理此错误

  1. 对于二进制分类:

    让,例如data['result']=[1,0,0,1,0,0,1,0,0,1]和使用loss=tf.keras.losses.BinaryCrossentropy(from_logits=True)

  2. 对于多类分类:

    使用loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),并修改模型的输出层,使其输出的形状与标签数量匹配,例如,当您有5个类时tf.keras.layers.Dense(5)

来自tf.keras.models.Sequential()WARNING只是告诉您它希望从其中的层中得到什么,以便它能够正常工作,如果您不使用tf.keras.models.Sequential(),那么WARNING将消失,例如使用以下方法定义模型:

inputs = {}
for header in ['sex','age', 'bmi','smoker', 'lab1', 'lab2']:
    inputs[header] = tf.keras.Input(shape=(1,), name=header) 
x = tf.keras.layers.DenseFeatures(feature_columns=feature_columns)(inputs)
x = tf.keras.layers.Dense(128, activation='relu')(x)
x = tf.keras.layers.Dense(128, activation='relu')(x)
x = tf.keras.layers.Dropout(.1)(x)
x = tf.keras.layers.Dense(1)(x)
model = tf.keras.models.Model(inputs=inputs, outputs=x)

出现Cast string to float错误的原因可能是您试图将所有列转换为numeric column,就像您在发布的示例代码中所做的那样(即,最好将sex列转换为categorical columns

要修复此警告,有两种方法:

1]调用fit方法时,在输入中应用功能层。 i、 e.而不是:

model3.fit(x=train_dict, y=train_labels, validation_data=(valid_dict,valid_labels), epochs=epochs_, verbose=verbose_)

使用

model3.fit(x=feature_layer_3(train_dict), y=train_labels, validation_data=(feature_layer_3(valid_dict),valid_labels), epochs=epochs_, verbose=verbose_)

您可以查看此详细示例(第3款车型) https://www.kaggle.com/abidou/features-bucketing

2]使用功能API,如前一链接中的第6个模型所示

相关问题 更多 >

    热门问题