我在按照TensorFlow官方与Keras的教程学习时遇到了问题,卡在了这里:预测房价:回归 – 创建模型
为什么在预测连续值的任务中使用激活函数?
代码如下:
def build_model(): model = keras.Sequential([ keras.layers.Dense(64, activation=tf.nn.relu, input_shape=(train_data.shape[1],)), keras.layers.Dense(64, activation=tf.nn.relu), keras.layers.Dense(1) ]) optimizer = tf.train.RMSPropOptimizer(0.001) model.compile(loss='mse', optimizer=optimizer, metrics=['mae']) return model
回答:
在隐藏层中使用非线性激活函数的一般原因是,如果没有它们,无论有多少层或每层有多少单元,网络的行为就像一个简单的线性单元。Andrew Ng 在这个简短的视频中对此进行了很好的解释:为什么需要非线性激活函数?
在你的例子中,仔细观察,你会发现你的最后一层的激活函数并不是像隐藏层那样使用relu
,而是线性激活函数(当你没有指定任何激活函数时,默认使用线性激活函数,如这里所示):
keras.layers.Dense(1)
根据Keras文档:
Dense
[…]
Arguments
[…]
activation: 使用的激活函数(参见activations)。如果你不指定任何东西,则不应用激活函数(即“线性”激活:
a(x) = x
)。
这确实是对于具有单一连续输出的回归网络所期望的。