我尝试使用深度学习从一个约会网站的15个自报属性来预测收入。
我们得到了一些相当奇怪的结果,验证数据的准确率和损失比训练数据更好,而且这种情况在不同大小的隐藏层中是一致的。这是我们的模型:
for hl1 in [250, 200, 150, 100, 75, 50, 25, 15, 10, 7]: def baseline_model(): model = Sequential() model.add(Dense(hl1, input_dim=299, kernel_initializer='normal', activation='relu', kernel_regularizer=regularizers.l1_l2(0.001))) model.add(Dropout(0.5, seed=seed)) model.add(Dense(3, kernel_initializer='normal', activation='sigmoid')) model.compile(loss='categorical_crossentropy', optimizer='adamax', metrics=['accuracy']) return model history_logs = LossHistory() model = baseline_model() history = model.fit(X, Y, validation_split=0.3, shuffle=False, epochs=50, batch_size=10, verbose=2, callbacks=[history_logs])
这是准确率和损失的一个例子: 和
我们尝试过移除正则化和丢弃层,正如预期的那样,结果是过拟合(训练准确率约为85%)。我们甚至尝试过大幅降低学习率,结果相似。
有人见过类似的结果吗?
回答:
当你使用Dropout
时会发生这种情况,因为训练和测试时的行为是不同的。
在训练时,部分特征会被设为零(在你的例子中是50%,因为你使用了Dropout(0.5)
)。在测试时,所有特征都会被使用(并适当缩放)。因此,测试时的模型更加robust – 这可能会导致更高的测试准确率。