我在学习TensorFlow的教程时,遇到一个让我感到困惑的错误,我看不出自己哪里做错了:
import pandas as pdimport numpy as npnp.set_printoptions(precision = 3, suppress = True)import tensorflow as tffrom tensorflow.keras import layersfrom tensorflow.keras.layers.experimental import preprocessing# 导入一些数据abalone_train = pd.read_csv( "https://storage.googleapis.com/download.tensorflow.org/data/abalone_train.csv", header=None, names=["Length", "Diameter", "Height", "Whole weight", "Shucked weight", "Viscera weight", "Shell weight", "Age"])# 分离用于训练的特征和标签abalone_features = abalone_train.copy()abalone_labels = abalone_features.pop('Age')# 将特征打包进一个NumPy数组abalone_features = np.array(abalone_features)# 构建一个回归模型来预测年龄abalone_model = tf.keras.Sequential([ layers.Dense(64), layers.Dense(1)])abalone_model.compile(loss = tf.losses.MeanSquaredError(), optimizer = tf.optimizers.Adam())# 通过向Model.fit传递特征和标签来训练模型abalone_model.fit(x = abalone_features, y = abalone_labels, epochs = 10)
这几乎直接来自教程,但我在拟合模型时得到了一个错误:
ValueError: Please provide as model inputs either a single array or a list of arrays. You passed: target=0 71 62 143 164 13 ..3315 153316 103317 113318 163319 19Name: Age, Length: 3320, dtype: int64
我从这里了解到,输入需要是两个np.array
,但检查abalone_features
显示:
abalone_featuresOut[31]: array([[0.435, 0.335, 0.11 , ..., 0.136, 0.077, 0.097], [0.585, 0.45 , 0.125, ..., 0.354, 0.207, 0.225], [0.655, 0.51 , 0.16 , ..., 0.396, 0.282, 0.37 ], ..., [0.53 , 0.42 , 0.13 , ..., 0.374, 0.167, 0.249], [0.395, 0.315, 0.105, ..., 0.118, 0.091, 0.119], [0.45 , 0.355, 0.12 , ..., 0.115, 0.067, 0.16 ]])
我不确定是我(还是教程)哪里出错了。
回答:
我认为你的问题不在于abalone_features
,而在于abalone_labels
。它们仍然是一个Pandas序列:
>>> type(abalone_labels)<class 'pandas.core.series.Series'>
你需要将它们转换成数组,就像你对特征所做的那样:
abalone_model.fit(x = abalone_features, y = np.asarray(abalone_labels), epochs = 10)
或者,更接近你对特征所做的操作:
abalone_labels = np.array(abalone_labels)
(个人而言,我不喜欢这样的重新赋值操作,原因正是它们可能会引起关于类型的混淆。)