我正在尝试使用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进行建模时,它们看起来几乎相同。第二个模型有问题吗?
答案 0 :(得分:1)
我不确定它们是否相同,因为第二个模型在最后一层(384个单位)之后具有relu激活,而第一个没有。这可能是问题所在,因为Keras密集层的默认激活为“无”。