ReLU可以用在神经网络的最后一层吗?

3 autoencoder deep-learning conv-neural-network keras tensorflow

我创建了convolutional-autoencoder这样的方式:

input_dim = Input((1, 200, 4))
x = Conv2D(64, (1,3), activation='relu', padding='same')(input_dim)
x = MaxPooling2D((1,2), padding='same')(x)
x = Conv2D(32, (1,3), activation='relu', padding='same')(x)
x = MaxPooling2D((1,2), padding='same')(x)
x = Conv2D(32, (1,3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((1,2), padding='same')(x)

#decoder
x = Conv2D(32, (1,3), activation='relu', padding='same')(encoded)
x = UpSampling2D((1,2))(x)
x = Conv2D(32, (1,3), activation='relu', padding='same')(x)
x = UpSampling2D((1,2))(x)
x = Conv2D(64, (1,3), activation='relu')(x)
x = UpSampling2D((1,2))(x)
decoded = Conv2D(4, (1,3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_layer, decoded) 

autoencoder.compile(optimizer='adam', loss='mae', 
                    metrics=['mean_squared_error'])
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用上述解码器的最后一次激活来拟合模型时sigmoid,模型损失略有下降(并且在以后的时期保持不变),因此mean_square_error. (使用默认Adam设置):

autoencoder.fit(train, train, epochs=100, batch_size=256, shuffle=True, 
        validation_data=(test, test), callbacks=callbacks_list)

Epoch 1/100
97/98 [============================>.] - ETA: 0s - loss: 12.3690 - mean_squared_error: 2090.8232
Epoch 00001: loss improved from inf to 12.36328, saving model to weights.best.hdf5
98/98 [==============================] - 6s 65ms/step - loss: 12.3633 - mean_squared_error: 2089.3044 - val_loss: 12.1375 - val_mean_squared_error: 2029.4445
Epoch 2/100
97/98 [============================>.] - ETA: 0s - loss: 12.3444 - mean_squared_error: 2089.8032
Epoch 00002: loss improved from 12.36328 to 12.34172, saving model to weights.best.hdf5
98/98 [==============================] - 6s 64ms/step - loss: 12.3417 - mean_squared_error: 2089.1536 - val_loss: 12.1354 - val_mean_squared_error: 2029.4530
Epoch 3/100
97/98 [============================>.] - ETA: 0s - loss: 12.3461 - mean_squared_error: 2090.5886
Epoch 00003: loss improved from 12.34172 to 12.34068, saving model to weights.best.hdf5
98/98 [==============================] - 6s 63ms/step - loss: 12.3407 - mean_squared_error: 2089.1526 - val_loss: 12.1351 - val_mean_squared_error: 2029.4374
Epoch 4/100
97/98 [============================>.] - ETA: 0s - loss: 12.3320 - mean_squared_error: 2087.0349
Epoch 00004: loss improved from 12.34068 to 12.34050, saving model to weights.best.hdf5
98/98 [==============================] - 6s 63ms/step - loss: 12.3405 - mean_squared_error: 2089.1489 - val_loss: 12.1350 - val_mean_squared_error: 2029.4448
Run Code Online (Sandbox Code Playgroud)

但当我将解码器的最后激活更改为 时,两者都迅速loss减少。mean_squared_errorrelu

Epoch 1/100
97/98 [============================>.] - ETA: 0s - loss: 9.8283 - mean_squared_error: 1267.3282 
Epoch 00001: loss improved from inf to 9.82359, saving model to weights.best.hdf5
98/98 [==============================] - 6s 64ms/step - loss: 9.8236 - mean_squared_error: 1266.0548 - val_loss: 8.4972 - val_mean_squared_error: 971.0208
Epoch 2/100
97/98 [============================>.] - ETA: 0s - loss: 8.1906 - mean_squared_error: 910.6423 
Epoch 00002: loss improved from 9.82359 to 8.19058, saving model to weights.best.hdf5
98/98 [==============================] - 6s 62ms/step - loss: 8.1906 - mean_squared_error: 910.5417 - val_loss: 7.6558 - val_mean_squared_error: 811.6011
Epoch 3/100
97/98 [============================>.] - ETA: 0s - loss: 7.3522 - mean_squared_error: 736.2031
Epoch 00003: loss improved from 8.19058 to 7.35255, saving model to weights.best.hdf5
98/98 [==============================] - 6s 61ms/step - loss: 7.3525 - mean_squared_error: 736.2403 - val_loss: 6.8044 - val_mean_squared_error: 650.5342
Epoch 4/100
97/98 [============================>.] - ETA: 0s - loss: 6.6166 - mean_squared_error: 621.1281
Epoch 00004: loss improved from 7.35255 to 6.61435, saving model to weights.best.hdf5
98/98 [==============================] - 6s 61ms/step - loss: 6.6143 - mean_squared_error: 620.6105 - val_loss: 6.2180 - val_mean_squared_error: 572.2390
Run Code Online (Sandbox Code Playgroud)

relu我想验证在网络架构中使用 an-all 函数是否有效。作为深度学习的新手。

haf*_*031 10

你所问的问题引发了另一个非常基本的问题。问问自己:“您实际上希望模型做什么?”- 预测真实值?还是一定范围内的值?- 你会得到答案。

但在此之前,我觉得我应该向您简要介绍一下激活函数的全部内容以及我们为什么使用它们。

激活函数的主要目标是在模型中引入非线性。由于线性函数的组合也是线性函数,因此,如果没有激活函数,aNeural Network只不过是一个巨大的线性函数。因此,作为线性函数本身,它根本无法学习任何非线性行为。这是使用激活函数的主要目的。

另一个目的是限制神经元的输出范围。下图显示了Sigmoid激活ReLU函数(图像从此处收集)。

Sigmoid 与 ReLU

这两个图准确地显示了它们可以对通过它们传递的值施加什么样的限制。如果你看一下Sigmoid函数,它允许输出在between 0 to 1. 因此,我们可以将其视为基于函数的某些输入值的概率映射。那么我们可以在哪里使用它呢?对于二元分类来说,如果我们为两个不同的类分配0和并在输出层中使用函数,它可以为我们提供示例输入属于某个类的概率。1Sigmoid

现在来到ReLU. 它能做什么?它只允许Non-negative值。正如您所看到的,水平轴上的所有负值都被映射到垂直轴上的 0。但对于正值,45 度直线表明它对它们没有任何作用,让它们保持原样。基本上它可以帮助我们摆脱负值并将其设为 0 并且只允许非负值。数学上:relu(value) = max(0, value).

现在想象一种情况:假设您想要预测实际值,可以是正值、零甚至负值!你会ReLU因为激活函数看起来很酷而在输出层使用它吗?没有!很明显不是。如果这样做,它将永远无法预测任何负值,因为所有负值都将被修剪为 0。

现在就您的情况而言,我相信该模型应该预测不应受到限制的值0 to 1。这应该是一个real valued预测。

因此,当您使用sigmoid函数时,它基本上是强制模型在0 to 1和 之间输出,在大多数情况下,这不是有效的预测,因此模型会产生很大的lossMSE值。由于模型强制预测的结果与实际正确的输出相差甚远。

同样,当您使用ReLU它时,它的性能会更好。因为ReLU不会改变任何非负值。因此,该模型可以自由预测任何非负值,并且现在没有限制预测接近实际输出的值。

但我认为该模型想要预测可能从 0 到 255 的强度值。因此,您的模型已经没有负值。因此,从技术上讲,不需要ReLU在最后一层使用激活函数,因为它甚至不会过滤掉任何负值(如果我没有记错的话)。但你可以使用它,因为官方TensorFlow文档正在使用它。但这只是出于安全目的,因此不会negative出现任何值,并且ReLU不会对non-negative值产生任何影响。


Ani*_*ote 5

relu您可以在最后一层使用函数作为激活。

您可以在 TensorFlow 官方网站上查看自动编码器示例。

当您尝试解决标签为类值的分类问题时,请在最终输出层中使用 sigmoid/softmax 激活函数。