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

如何用TensorFlow构建支持列间交叉除法的预测模型?

基于已知除法关系的TensorFlow回归模型构建

既然你已经明确知道 c = b/a 的数学规律,完全没必要让全连接模型盲目学习这个关系——直接把除法逻辑嵌入模型,再搭配可训练的微调参数就行,训练更快、效果也更稳定。下面给你两个实用方案:

方案1:先算除法再加微调层(简单直接)

先按 b/a 算出基础预测值,再用一个轻量可训练层修正偏差,适配数据里的噪声或小波动。

import tensorflow as tf

# 输入是包含a、b的二维数据
input_layer = tf.keras.layers.Input(shape=(2,))
# 保留你之前的归一化操作,让训练更稳定
normalizer = tf.keras.layers.Normalization(axis=-1)
normalizer.adapt(train_inputs)  # train_inputs是训练集的a、b列数据
normalized_input = normalizer(input_layer)

# 从归一化输入里拆分出a和b
a = tf.keras.layers.Lambda(lambda x: x[:, 0:1])(normalized_input)
b = tf.keras.layers.Lambda(lambda x: x[:, 1:2])(normalized_input)

# 计算b/a,加1e-8防止除以0报错
divided = tf.keras.layers.Lambda(lambda x: x[0] / (x[1] + 1e-8))([b, a])

# 加简单可训练层微调(如果数据完全符合c=b/a,模型会自动学到参数为1和0)
fine_tune = tf.keras.layers.Dense(units=1, activation=None)(divided)

# 组装模型
model = tf.keras.Model(inputs=input_layer, outputs=fine_tune)
model.compile(optimizer='adam', loss='mse')

方案2:自定义可训练除法层(方便集成)

如果要把除法逻辑封装成独立模块,方便后续插入其他复杂模型,可以自定义一个Keras层,让模型学习除法的缩放和偏移参数:

import tensorflow as tf

class DivideLayer(tf.keras.layers.Layer):
    def __init__(self):
        super().__init__()
        # 定义可训练参数:缩放因子和偏移量,初始值设为1和0(对应完美的b/a)
        self.scale = self.add_weight(shape=(1,), initializer='ones', trainable=True)
        self.bias = self.add_weight(shape=(1,), initializer='zeros', trainable=True)
    
    def call(self, inputs):
        a, b = inputs
        # 输出带修正的除法结果:scale*(b/a) + bias
        return self.scale * (b / (a + 1e-8)) + self.bias

# 构建模型,a和b作为独立输入
input_a = tf.keras.layers.Input(shape=(1,))
input_b = tf.keras.layers.Input(shape=(1,))
# 给输入加归一化层
norm_a = tf.keras.layers.Normalization(axis=-1)(input_a)
norm_b = tf.keras.layers.Normalization(axis=-1)(input_b)
norm_a.adapt(train_a)  # train_a是训练集的a列
norm_b.adapt(train_b)  # train_b是训练集的b列

div_layer = DivideLayer()([norm_a, norm_b])
model = tf.keras.Model(inputs=[input_a, input_b], outputs=div_layer)
model.compile(optimizer='adam', loss='mse')

方案选择建议

  • 方案1代码简洁,适合数据噪声较小的场景,训练速度极快。
  • 方案2把除法逻辑封装成独立层,后续集成到其他复杂模型时直接调用即可,灵活性更高。
  • 对比你之前的全连接模型,这两个方案都利用了 c=b/a 的先验知识,不用让模型从0学习除法关系,泛化能力更强,数据量较少时优势尤其明显。

内容的提问来源于stack exchange,提问作者Nemo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:25:26