【问题标题】:Machine Learning with Keras: Different Validation Loss for the Same Model使用 Keras 进行机器学习:同一模型的不同验证损失
【发布时间】:2020-08-20 08:17:38
【问题描述】:

我正在尝试使用 keras 来训练一个简单的前馈网络。我尝试了两种我认为是同一个网络的不同方法,但其中一种表现要好得多。第一个和表现更好的一个如下:

inputs = keras.Input(shape=(384,))
dense = layers.Dense(64, activation="relu")
x = dense(inputs)
x = layers.Dense(64, activation="relu")(x)
outputs = layers.Dense(384)(x)

model = keras.Model(inputs=inputs, outputs=outputs, name="simple_model")

model.compile(loss='mse',optimizer='Adam')

history = model.fit(X_train, 
                    y_train_tf, 
                    epochs=20, 
                    validation_data=(X_test, y_test), 
                    steps_per_epoch=100, 
                    validation_steps=50)

它的验证损失约为 0.2。第二个模型的表现要差得多:

model = keras.models.Sequential()

model.add(Dense(64, input_shape=(384,), activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(384, activation='relu'))

optimizer = tf.keras.optimizers.Adam()

model.compile(loss='mse', optimizer=optimizer)

history = model.fit(X_train, 
                    y_train_tf, 
                    epochs=20, 
                    validation_data=(X_test, y_test), 
                    steps_per_epoch=100, 
                    validation_steps=50)

这有大约 5 的验证损失。但是当我执行 model.summary 时,它们看起来几乎相同。第二个模型有问题吗?

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    我不确定它们是否相同,因为第二个模型在最后一层(384 个单位)之后激活了 relu,而第一个没有。这可能是问题所在,因为 Keras 密集层的默认激活是无。

    【讨论】:

    • 我取出了最后的激活函数,它工作得更好!你知道为什么会这样吗?我的直觉是激活函数会增加模型的复杂性,所以应该表现得更好,但是没有 ReLU 的情况下它表现得更好吗?
    • 这取决于您的问题,但通常最后一层激活取决于您的目标。例如,假设您正在做一个回归问题,而您的目标可能有负值。如果您将所有内容放在最后一层输出的顶部,则会损害模型性能,因为 relu 会将负值归零。我不知道您在这里遇到了什么问题,但很可能是您的模型发生的问题。
    猜你喜欢
    • 2021-11-20
    • 2021-01-18
    • 2019-03-07
    • 2019-03-31
    • 2019-02-06
    • 1970-01-01
    • 2018-02-25
    • 2021-04-15
    • 2023-03-27
    相关资源
    最近更新 更多