在目标列数组与行数组上调用 model.fit

问题描述 投票:0回答:1

这两个应该在如何输入模型方面是等效的,或者一个应该被接受而另一个不兼容。列列表与行列表。我的模型架构需要 5 个输入并输出 3 个输出。我注意到,在训练中,当我的目标数据是 3 x 1000 numpy 数组时,我的损失在 0.3 左右(考虑到当我在测试集上预测损失为 0.01 时,这个损失异常高)。通常,使用标准列时每个输出节点的损失相似,而使用行时则差异很大。

然后转置它

y.T
不起作用——只有当转换为列表
list(y.T)
时模型才会接受它作为目标。那么损失就更符合预期。我知道这不应该起作用,并且通过列应该是可行的方法 - 但为什么我的损失如此之低。

我知道这听起来很荒谬,但这里有一个 MRE 来验证正在发生的事情:

    inputs = tf.keras.layers.Input(shape=(5,))
    x = tf.keras.layers.Dense(units=16, activation="relu")(inputs)
    x = tf.keras.layers.Dense(units=16, activation="relu")(x)
    out1 = tf.keras.layers.Dense(1)(x)
    out2 = tf.keras.layers.Dense(1)(x)
    out3 = tf.keras.layers.Dense(1)(x)

    outputs = [out1, out2, out3]
    model = tf.keras.models.Model(inputs=inputs, outputs=outputs)
    # Creating data
    data = np.random.random(size=(300,8))
    df = pd.DataFrame(data)
    df.columns = ["A", "B", "C","D", "E", "F", "G", "H"]
    df["F"] = df["F"] * 2 # Perturbing 
    df["G"] = df["G"] * 3
    df["H"] = df["H"] * 4   
    model.compile(loss="mae")
    X = df[["A", "B", "C", "D", "E"]]
    y = df[["F", "G", "H"]]
    ny = y.to_numpy()

    # history = model.fit(X, list(ny.T), epochs=200) # Alternate - uncomment when you want to use
    history = model.fit(X, ny, epochs=200) # standard
    pred = model.predict(X)
    pred = np.concatenate(pred, axis=1)
    resid = np.mean(np.abs(ny - pred), axis=0)
    print(resid) # Training loss is lower for rows...

如有任何帮助,我们将不胜感激。也许使用单独的输出分支而不是单个

Dense(3)
来定义模型会改变事情?

python tensorflow keras deep-learning neural-network
1个回答
0
投票

您需要注意模型的输出形状。配置输出形状的方式是

[(None, 1), (None, 1), (None, 1)]
,因此它需要一个值列表,每个值的大小为
(None,1)
。如果您使用
Dense(3)
tf.keras.layers.Concatenate()(outputs)
,那么它的大小为(无,3),并且是它所期望的。您可以使用
model.output_shape
检查输出的形状。

© www.soinside.com 2019 - 2024. All rights reserved.