TensorFlow训练LinearClassifier触发字典更新序列长度错误
报错诱因
报错触发点在代码里的dict(data_df)语句,和数据集空值无关:
- 你传入的
X_train/X_test不是pandas DataFrame类型,大概率是numpy二维数组、列表嵌套列表的结构 - Python内置的
dict()构造函数解析有序序列时,会默认把每个长度为2的子元素识别为(键, 值)对来构造字典;当你传入每行有6个特征的二维数组时,它读取到第一个长度为6的行元素,就会抛出"元素长度为6,不符合要求的长度2"的错误,和你看到的报错信息完全匹配。
解决方法
你可以二选一处理:
方案1:把特征矩阵转成pandas DataFrame
如果你原本是基于pandas做数据处理,大概率是做训练测试集拆分时误把DataFrame转成了numpy数组,手动转回来即可,注意列名要和你定义feature_columns时用的特征名完全一致:
import pandas as pd # 替换成你自己的特征列名列表,顺序要和特征矩阵的列顺序对齐 feature_names = ["特征1名", "特征2名", "特征3名", "特征4名", "特征5名", "特征6名"] X_train = pd.DataFrame(X_train, columns=feature_names) X_test = pd.DataFrame(X_test, columns=feature_names)
转换后不需要修改原有make_input_fn的代码,直接运行即可。
方案2:手动构造特征字典
如果你不想依赖pandas,可以修改input_function里的数据集构造逻辑,不要直接用dict()转换特征矩阵,手动按列组装特征字典:
# 提前定义好和特征列顺序对应的特征名列表 feature_names = ["特征1名", "特征2名", "特征3名", "特征4名", "特征5名", "特征6名"] def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32): def input_function(): # 按列组装特征字典 feature_dict = {col_name: data_df[:, col_idx] for col_idx, col_name in enumerate(feature_names)} ds = tf.data.Dataset.from_tensor_slices((feature_dict, label_df)) if shuffle: ds = ds.shuffle(1000) ds = ds.batch(batch_size).repeat(num_epochs) return ds return input_function
快速验证方式
在调用make_input_fn前先执行print(type(X_train)),如果输出不是<class 'pandas.core.frame.DataFrame'>,就可以确认是上述类型不匹配问题。
内容的提问来源于stack exchange,提问作者Kishan Patel
相关产品推荐
相关产品推荐

