这两个应该在如何输入模型方面是等效的,或者一个应该被接受而另一个不兼容。列列表与行列表。我的模型架构需要 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)
来定义模型会改变事情?
您需要注意模型的输出形状。配置输出形状的方式是
[(None, 1), (None, 1), (None, 1)]
,因此它需要一个值列表,每个值的大小为 (None,1)
。如果您使用 Dense(3)
或 tf.keras.layers.Concatenate()(outputs)
,那么它的大小为(无,3),并且是它所期望的。您可以使用 model.output_shape
检查输出的形状。