在Keras中,顺序API和功能API中具有不同输出损耗配置的模型的性能不同

rbl8hiat  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(93)

我从用顺序API和函数API编码的模型中得到了两个非常不同的结果。我的代码可能出了什么问题?
我用下面的代码开始我的代码:

np.random.seed(42)
tf.random.set_seed(42)
random.seed(42)

然后,我用顺序API为18个输入特征和7个输出编写了以下模型:

model = keras.models.Sequential([
    Input(shape=18),
    Dense(1000, activation = "relu"),
    BatchNormalization(),
    Dense(1000, activation = "relu"),
    BatchNormalization(),
    Dense(7)
])
model.compile(optimizer=keras.optimizers.Adam(learning_rate=1e-4), loss=keras.losses.mse)
history = model.fit(X_tr, Y_tr, epochs=1000, validation_data=(X_val, Y_val))

我得到的总体最小确认MSE为0.417。
然而,我不得不使用API来分别为每个输出找到MSE。因此,我尝试编写与上述模型相同的代码,如下所示:

targets = ('output1', 'output2', 'output3', 'output4', 'output5', 'output6', 'output7')

inp = Input(shape=18)
hidden1 = Dense(1000, activation = "relu")(inp)
hidden2 = BatchNormalization()(hidden1)
hidden3 = Dense(1000, activation = "relu")(hidden2)
hidden4 = BatchNormalization()(hidden3)
out = [Dense(1, name = nn)(hidden4) for nn in targets ]
modelF = keras.Model(inputs = [inp], outputs = [out])

modelF.compile(optimizer=keras.optimizers.Adam(learning_rate=1e-4), loss=keras.losses.mse)
history = modelF.fit(X_tr, Y_tr, epochs=1000, validation_data=(X_val, Y_val))

但是使用这个函数API,我得到的每个输出的最小MSE超过了1284。代码有什么问题?如果它们不一样,我如何修改函数API代码以得到相同的模型,但仍然得到7个MSE而不是1个?

llmtgqce

llmtgqce1#

1.在函数API代码中获得如此高的MSE背后存在逻辑错误。
modelF = keras.模型(输入= [输入],输出= [输出])
与以下内容一致:

modelF = keras.Model(inputs = [inp], outputs = out)

1.将在汇编阶段分别为所有产出提供损失,
编译器(优化器=keras.优化器.Adam(学习速率= 1 e-4),损失=[“mse”,“mse”,“mse”,“mse”,“mse”,“mse”,“mse”,“mse”,“mse”,“mse”])
1.还将为培训、验证和测试阶段的所有阶段单独提供输出标签。对于培训和验证阶段,您将编写以下内容:
在一个示例中,您可以使用以下方法来创建一个历史记录modelF.fit(x = X_tr,y = [Y_tr[:,0],Y_tr[:,1],Y_tr[:,2],Y_tr[:,3],Y_tr[:,4],Y_tr[:,5],Y_tr[:,6] ],时间点=1000,验证数据=(X_val,[Y_val[:,0],Y_val[:,1],Y_val[:,2],Y_val[:,3],Y_val[:,4],Y_val[:,5],Y_val[:,6] ]))
这将给予与顺序API代码类似的正常MSE。

相关问题