TensorFlow回归教程报错:Unsupported object type int 排查与修复
TensorFlow回归教程代码报错:原因分析与修复方案
我在学习TensorFlow回归教程时,运行教程提供的代码触发报错,代码及报错信息如下:
教程代码
import numpy as np import pandas as pd # Make NumPy printouts easier to read. np.set_printoptions(precision=3, suppress=True) import tensorflow as tf print(tf.__version__) url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data' column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight', 'Acceleration', 'Model Year', 'Origin'] raw_dataset = pd.read_csv(url, names=column_names, na_values='?', comment='\t', sep=' ', skipinitialspace=True) dataset = raw_dataset.copy() dataset = dataset.dropna() dataset['Origin'] = dataset['Origin'].map({1: 'USA', 2: 'Europe', 3: 'Japan'}) dataset = pd.get_dummies(dataset, columns=['Origin'], prefix='', prefix_sep='') print(dataset.tail()) train_dataset = dataset.sample(frac=0.8, random_state=0) test_dataset = dataset.drop(train_dataset.index) train_features = train_dataset.copy() test_features = test_dataset.copy() train_labels = train_features.pop('MPG') test_labels = test_features.pop('MPG') print(train_dataset.describe().transpose()[['mean', 'std']]) normalizer = tf.keras.layers.Normalization(axis=-1) normalizer.adapt(np.array(train_features))
报错信息
Traceback (most recent call last): File "/home/don/.config/JetBrains/PyCharm2023.1/scratches/scratch2.py", line 36, in <module> normalizer.adapt(np.array(train_features)) File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/keras/layers/preprocessing/normalization.py", line 286, in adapt super().adapt(data, batch_size=batch_size, steps=steps) File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/keras/engine/base_preprocessing_layer.py", line 246, in adapt data_handler = data_adapter.DataHandler( File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/keras/engine/data_adapter.py", line 1260, in __init__ self._adapter = adapter_cls( File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/keras/engine/data_adapter.py", line 246, in __init__ x, y, sample_weights = _process_tensorlike((x, y, sample_weights)) File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/keras/engine/data_adapter.py", line 1140, in _process_tensorlike inputs = tf.nest.map_structure(_convert_single_tensor, inputs) File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/tensorflow/python/util/nest.py", line 917, in map_structure structure[0], [func(*x) for x in entries], File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/tensorflow/python/util/nest.py", line 917, in <listcomp> structure[0], [func(*x) for x in entries], File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/keras/engine/data_adapter.py", line 1135, in _convert_single_tensor return tf.convert_to_tensor(x, dtype=dtype) File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/tensorflow/python/util/traceback_utils.py", line 153, in error_handler raise e.with_traceback(filtered_tb) from None File "/home/don/.local/share/virtualenvs/zero-play-9HEKD3Xj/lib/python3.10/site-packages/tensorflow/python/framework/constant_op.py", line 103, in convert_to_eager_tensor return ops.EagerTensor(value, ctx.device_name, dtype) ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type int).
原因分析
报错核心是将numpy数组转换为Tensor时失败,根源在于:
train_features中同时包含整数类型列(如Cylinders、Model Year以及one-hot编码生成的USA/Europe/Japan列)和浮点类型列- 使用
np.array(train_features)转换时,numpy会将混合类型的DataFrame转为objectdtype的数组 - TensorFlow无法直接处理
object类型的数组,因此触发类型转换错误
教程本身并未过时,但部分代码在新版TensorFlow/pandas组合下会出现类型兼容问题。
修复方案
提供两种简单有效的修复方法:
方法1:直接传入pandas DataFrame给adapt方法
TensorFlow的Normalization.adapt方法支持直接接收pandas DataFrame,无需手动转为numpy数组,修改最后一行代码:
normalizer.adapt(train_features)
方法2:将所有特征转为浮点类型
在生成train_features后,添加一行代码将所有列转为float:
train_features = train_features.astype('float32') test_features = test_features.astype('float32')
之后再执行normalizer.adapt(np.array(train_features))即可正常运行。
内容的提问来源于stack exchange,提问作者Don Kirkby
相关产品推荐
相关产品推荐

