TensorFlow多分类任务调用DenseFeatures层报特征rank 0错误如何解决
错误原因
这个报错的核心是DenseFeatures层要求输入的每个特征张量至少是1维的(形状为(batch_size,)),但你当前从tf.data.Dataset里吐出的每个单独样本的特征是0维的标量,也就是报错里提到的shape=()的张量,所以在传入DenseFeatures时维度校验不通过。
你在构造数据集的时候只做了from_tensor_slices拆分出单个样本,但没有调用batch方法按批次合并样本,导致每个特征都是单样本的标量,不符合输入要求。
解决方法
直接修改df_to_dataset函数的返回逻辑,在返回前增加batch操作即可,你已经在参数里传入了batch_size,直接调用就行:
def df_to_dataset(df, shuffle=True, batch_size=32): df = df.copy() labels = df.pop('class') dicts = {'STAR': 1, 'GALAXY': 2, 'QSO': 3} converted_labels = np.array([dicts[l] for l in labels]) ds = tf.data.Dataset.from_tensor_slices((dict(df), converted_labels)) if shuffle: ds = ds.shuffle(buffer_size=len(df)) # 新增batch操作,把单个样本合并为批次数据,特征维度会自动变为(batch_size,)符合要求 ds = ds.batch(batch_size) return ds
还有两个可优化的细节,建议同步调整:
- 你当前把类别映射为1/2/3,而
sparse_categorical_crossentropy要求标签从0开始计数,最好把映射改成{'STAR':0, 'GALAXY':1, 'QSO':2},避免计算损失时出现索引偏移的问题 - 如果后续训练速度慢,可以在batch操作之后加
.prefetch(tf.data.AUTOTUNE)优化数据加载效率
内容的提问来源于stack exchange,提问作者Elizabeth Grant
相关产品推荐
相关产品推荐

