You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并特征张量适配TensorFlow模型?泰坦尼克数据集实操疑问

解决Titanic数据集特征张量合并问题的方案

我明白你现在的困扰——想把Titanic数据集中的多个特征张量合并成适合模型训练的输入,之前尝试concat和stack没成功对吧?咱们先理清楚问题所在:你之前是把全量数据batch后单独提取age和fare张量,这种方式不仅低效,还没把每个样本的两个特征对应起来,自然没法让模型接收多特征输入。咱们调整一下数据处理逻辑,一步一步解决:

为什么之前的合并尝试失败?

你拿到的xx1和xx2是形状为(1309,)的一维张量,如果直接用tf.concat([xx1, xx2], axis=0),会得到一个(2618,)的一维张量,这不是我们要的;如果想按样本拼接成(1309, 2)的特征矩阵,得先把每个特征扩展成二维(比如(1309,1)),再在特征维度上拼接。

正确的解决方案:在预处理阶段合并特征

我们应该在tf.data的map阶段就完成特征合并,这样整个数据集会直接输出(合并特征,标签)的格式,完美适配模型训练:

1. 完整修改后的代码

import tensorflow as tf
import tensorflow_datasets as tfds
from tensorflow.keras.optimizers import Adam

# 定义预处理函数:合并特征+处理标签
def preprocess(x, y):
    # 把每个一维特征扩展成二维(shape从(,)变成(1,))
    age_feature = tf.expand_dims(x['age'], axis=-1)
    fare_feature = tf.expand_dims(x['fare'], axis=-1)
    # 在特征维度拼接,得到每个样本的特征向量(2,)
    combined_features = tf.concat([age_feature, fare_feature], axis=-1)
    # 把标签转换成one-hot格式(如果用稀疏交叉熵可以跳过这步)
    one_hot_label = tf.one_hot(y, depth=2)
    return combined_features, one_hot_label

# 加载数据并完成预处理
data = tfds.load("titanic", split='train', as_supervised=True)\
    .map(preprocess)\
    .batch(32)  # 用小批量训练,比全量训练稳定性更好
    .prefetch(tf.data.AUTOTUNE)  # 自动预取优化训练速度

# 定义模型:第一层指定输入特征数为2
model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(13, activation='relu', input_shape=(2,)),
    tf.keras.layers.Dense(2, activation='softmax')
])

# 编译模型
model.compile(
    optimizer=Adam(learning_rate=0.01),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

# 直接训练
model.fit(data, epochs=30)

2. 额外优化建议

  • 简化标签处理:如果你不想手动转one-hot,可以改用SparseCategoricalCrossentropy损失函数,直接用原始的0/1标签,代码更简洁:
    def preprocess(x, y):
        age_feature = tf.expand_dims(x['age'], axis=-1)
        fare_feature = tf.expand_dims(x['fare'], axis=-1)
        combined_features = tf.concat([age_feature, fare_feature], axis=-1)
        return combined_features, y  # 直接返回原始标签
    
    model.compile(
        optimizer=Adam(learning_rate=0.01),
        loss=tf.keras.losses.SparseCategoricalCrossentropy(),
        metrics=['accuracy']
    )
    
  • 避免全量batch:不要一次性用1309条数据做batch,小批量(比如32、64)训练的收敛效果和稳定性会好很多。

这样修改后,你就能让模型接收合并后的多特征张量,顺利进行训练啦~

内容的提问来源于stack exchange,提问作者AI-Lottery Winner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:52:46